Redis基础--基本数据类型

0 Redis 介绍

0.1 基础知识

不仅仅是简单的key-value数据库,更是一个in-memory data structure store。不仅仅支持简单的String key对应String value,还支持众多的类型数据:Binary-safe Strings、Lists、Sets、Sorted Sets、Hashes、Bit arrays、HyperLogLogs、Streams

key是binary safe ,可以使任意二进制串,甚至是JPEG文件的内容。key和value 都不能超过512MB。

最基本的操作SET 和 GET 、INCR 增加value值。EXISTS 访问key space确认是否存在key,DEL删除key和value。

0.2 Redis expires

Redis expires特性:Redis expires: keys with limited time to live。设置粒度最小为1ms,过期时间会保存在硬盘上。EXPIRE命令,TTL检查,PERSIST命令可以让key不过期。

0.3 Redis lists

基于Linked Lists实现的。 Linked List的特点:这样在List头部或者尾部增加1个element的时间是常数时间,无论List里面有几个element还是有上百万个element。当然也有缺点:检索很慢。

Redis lists 使用Linked Lists,考虑的是作为数据库系统,快速地插入数据到一个长的list是非常重要的。Redis实现在常数时间获取lists。

如果想要快速访问集合中间位置的数据,可以使用sorted sets。

使用LPUSH 表头插入,RPUSH尾部插入,LRANGE KEY Start_index End_index 访问list指定区间数据。index 0开始,-1是倒数第一个。LPUSH 是 可变长的命令,可以一口气输入多个值。

可以POP操作,获取并且从list删掉一个元素。LPOP 或者 RPOP,如果lists没有内容了,就会返回null

0.3.1 Redis lists 场景

  1. 社交网络,记录用户最近的文章(比如 twitter 使用 Redis lists 来记录用户最新的tweets)
  2. 进程间通信,用来做消息队列,Producer和Consumer。(ruby 使用进行 background jobs)

常见例子:
1.每当有用户产生新的消息,就把消息ID LPUSH 到 lists中;
2.当有其他用户访问网站的时候,就LRANGE 0 9 选择最新的10个消息展示;

0.3.2 Capped Lists 盖帽lists

通过LTRIM 0 99 可以只保持,最新的100个记录,其他的会被删除。

0.3.3 Blocking operations Lists锁操作

LPOP和RPOP升级版,可以进行等待再返回,BLPOP和BRPOP KEY 等待时间(B 应该是 Block)。等待时间内有新的element,返回,否则返回null。 但是返回值是key-value对,因为可能会等待多个lists(支持等待多个lists),而且如果多个client同时消费一个lists,先到先服务。

还有其他command : RPOPLPUSH 和 BRPOPLPUSH

0.3.4 自动创建和删除list key

不光是 list 更适用于data types composed of multiple elements -- Streams, Sets, Sorted Sets and Hashes.

对应三条规则:
1.当向 aggregate data type增加element,如果key不存在,就先创建他,再插入element。
2.当从aggregate data type删除element,如果空了的话,就会删除对应的key,stream类型除外。
3.对应空的key的话,使用只读 command 例如 LLEN,或者remove 命令,仿佛存在这个没有element的key一样。

0.4 Redis Hashes

一个key 对应多个键值对,类似Table或者Map、Dict。

HMSET 可以sets multiple fields of the hash
HMGET 返回一个array关于multiple fields对应value
HGET 返回单个值
HINCRBY 增加单个值

小的hashs (element少,values小)在内存中以特殊编码方式存储,效率很高。

0.5 Redis Sets

Redis Sets 是无序String的集合。

SADD key elements 向sets添加一个element,还可以进行其他sets数据结构式的操作。
smembers key 查看sets所有的元素。
sismember key element 检查元素是否是在sets,1是,0否。

应用场景1:标签系统
可以正向给客户或者文章打标签,每一个客户或者文章就对应这一个key,他们的标签就都放到key对应的set里面。
反向可以每个标签作为key,他们对应的文章或者客户放到对应的set里面。
使用:可以通过SINTER 实现取多个set内容的交集。当然也可以unions, difference, extract a random element

应用场景2:在线扑克游戏
可以设置一个set存储52张牌,SPOP每次取出一张牌。
为了防止一副牌set被POP没有元素,可以在每一局开始的时候进行copy牌集操作。使用SUNIONSTORE copySet copiedSet。

可以使用SCARD查看集合元素数量。当然可以使用SRANDMEMBER 可以获得随机的元素,而不从sets删除他们。

0.6 Redis Sorted sets

既像Sets又像Hashs, Sets部分,就是保存了一系列唯一不重复的的String值。但是Sorted Sets 实现了element的排序,内部是每个element会映射一个浮点型score用来排序。score来决定大小顺序,如果score一样则比较字典顺序。

zadd sorted_sets score key(可以设置多个) ,例如 zadd hackers 1940 "Alan Kay"

内部实现是采用了两个数据结构,一个skip list和一个hash table。add操作LOG(N) ,读取操作是常数时间的。

ZRANGE sorted_sets begin_index end_index读取排好序的element ,从小到大。
ZREVRANGE 逆序读取。 可以选择末尾增加WITHSCORES 选项,同时显示Score。

0.6.1 特殊操作 ZRANGEBYSCORE等

ZRANGEBYSCORE sorted_sets begin_score end_score, 例如:zrangebyscore hackers -inf 1950, with a score between negative infinity and 1950 (both extremes are included).

zremrangebyscore begin_score end_score , 删除指定范围的元素。

zrank & zrevrank 返回元素的排序位置。

0.6.2 Lexicographical scores字典顺序score

使用方式,score一样,所有的元素都是按照字典顺序进行排序。

ZRANGEBYLEX 、ZREVRANGEBYLEX 按照字典获取对应范围的元素,例如: zrangebylex hackers [B [P

可以使用reds sorted sets 做索引。

示例: 自动补全demo,
把linux内核,800W行unique代码放到 1GB内存中提供服务。

0.6.3 更新score

可以通过ZADD 相同的元素,实现更新score

场景:Leader Board
e.g., "you are the #4932 best score here"

0.7 Bitmaps

并不是一个真正的数据类型, 而是一系列在String 上的bit维度操作。有2^32不同bits,因为String最大512MB。

两大类操作:1 常数时间单bit操作 2 针对一组bits的操作

Bitmaps最大的优势就是,节省空间!例如,USER可以通过自增id来指示,可以维护single bit information (代表,每一bit,代表这个用户是否想要接收新信息或其他选项), 40亿客户只需要使用512MB空间。

SETBIT bitmaps_name key value (takes as its first argument the bit number, and as its second argument the value to set the bit to)
GETBIT bitmaps_name key value

Redis会自动扩充代表bitmaps的 String ,如果bitmaps 的 key超过了当前的String范围。

0.7.1 operating on group of bits

BITOP performs bit-wise operations between different strings. The provided operations are AND, OR, XOR and NOT.

BITCOUNT 计数有多少bit被设置为1,BITPOS 返回第一个bit 被设置为0或者1。他们两个都可以传入RANGE参数,统计一段范围。

使用场景
1 实时分析
2 和Object ID有关的高效boolean 信息
如:想要统计网站用户访问最大的时间间隔,count day 从0开始,之后用户访问的时候,就拿时间戳-初始日期,转化为day力度,就是对应的 BIT index,之后设置为1。 每个用户都有这么一个String Bitmap就可以方便进行统计。直接BITCOUNT就可以统计客户访问网站多少天。一些BITPOS调用就可以算出最长的访问间隔。

出于shading缘故,通常不会存一个非常长的bitmaps,而是使用多个bitmaps,通常额策略就是每个bitmaps保存 M bits, bitmaps-key = bit-number/M and , 之后对应 bitmaps-key 中的位置 Nth bit=bit-number MOD M.

0.8 HyperLogLogs

概率结构,来估算包含了多少元素。通常完成这个任务需要消耗大量内存,因为要记录下所有见到的元素。使用一些算法,可以在标准误差范围内,提供高效的统计,redis 误差在1%以内,消耗的空间不超过12KB。内部只是保存了一个state,并没有真正保存元素(怀疑是使用类似bloom fliter类似算法)

HyperLogLogs(HLL)在Redis 内部被编码为String ,可以通过GET和SET来编码和解码HLL。

概念上来说HLL和 集合Set操作性质一样,SADD添加元素,SCARD计算数量。

PFADD 添加元素, PFCOUNT来统计大概的数据量。

使用场景:
统计每天客户有多少不同的查询。

引用

  1. Flink Redis Connector官方网站
  2. Redis官方网站
  3. Redis 数据类型介绍
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,061评论 6 523
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,407评论 3 404
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,275评论 0 368
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,084评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,091评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,555评论 1 315
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,914评论 3 429
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,900评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,438评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,470评论 3 346
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,596评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,187评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,932评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,361评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,511评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,163评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,671评论 2 366

推荐阅读更多精彩内容