前提

    在之前的文章介绍了redis中两种数据结构String和Hash,这两种数据结构都是对单个字符串进行操作的。redis中另外还有三种数据结构是列表,集合,有序集合。

集合

    用来存储多个有序的字符串,允许字符串重复。一个列表最多存储2^32-1个元素。Redis中,可以对列表两端插入push和弹出pop,还可以获取指定范围的元素列表和指定索引下标的元素。
1. 添加操作
从右/左边插入元素
rpush|lpush key value [value …]
在指定元素前后插入元素
linsert key before|after pivot value
2. 查
获取指定范围内的元素列表
lrange key start end (如果希望获取所有元素,则lrange key 0 -1)
获取列表指定索引下标的元素
lindex key index
获取列表长度
llen key
3. 删除
从右/左边弹出元素
rpop|lpop key
删除指定元素(count>0,从左到右,删除最多count个元素,count<0,count=0)
lrem key count value
只保留索引范围列表
ltrim key start end
4. 修改
修改指定索引元素
lset key index newValue
5. 阻塞操作
brpop|blpop key [key …] timeout
timeout:堵塞时间
列表为空:timeout=3,客户端3秒后返回,如果timeout=0,客户端一直堵塞,如果此时列表中添加了数据,则立马返回
列表不空:
1、无论timeout为多少,客户端会立即返回;如果有多个键,一旦有一个键弹出元素,客户端立即返回
2、如果多个客户端同时对一个key执行brpop或blpop,最先执行的获得元素,其余的阻塞

编码

    当列表中元素个数小于配置的512个而且每个元素的值都小于64,使用ziplist,否则使用linkedlist

集合(set)

无序,不允许有重复的元素(和java中set基本一致),redis处理集合内部的CRUD,还支持多个集合取交集 ,并集,差集等。

【从零学Redis——数据结构】——列表,集合,有序集合_有序集合

编码方式

    intset,当集合中元素都是整数而且元素个数小于配置set-max-intset-entries配置时,使用此方式hashtable :当intset不能满足的时候,即使用hashtable。

有序集合

    有序,集合不能重复成员。与列表不同的时列表使用索引下标作为排序依据。有序集合可以为每个元素设置一个score,作为排序标准。

使用方式简单几个

【从零学Redis——数据结构】——列表,集合,有序集合_数据结构_02


    有序集合的操作方式有很多种,主要是围绕分数各种CRUD,以及范围区间等操作。等具体有需要的时候再来深入也不晚

有序集合除了集合内部的操作,和集合一样有很多集合间的操作,具体的使用方式参考集合,基本上相差不大。

编码

    ziplist:有序集合个数小于zset-max-ziplist-entries,而且每个元素值小于zset-max-ziplist-value时会采用ziplist
skiplist:当ziplist不被满足的时候,使用skiplist

场景应用:

列表:
两端均可以操作,所以可以充当数据结构中队列和栈,消息队列生产者客户端使用lpush从列表中插入元素,多个消费者使用brpop命令阻塞式抢元素。
lpush+rpop=队列
lpush+lpop=栈
push+ltrim=有限集合
lpush+brpop=消息队列
利用列表的有序性,分页展示文章列表,按照索引范围获取元素
集合:
最常见的的场景是tag,个人对多个tag的维护,以及一个tag对多个人员的维护,利用这些tag标签针对不同的用户做推荐。
有序集合:
有序集合中有个score,很多应用场景也是针对score,例如排行榜,排行榜前十名,根据区间筛选相关数据等。

总结

    到目前为redis的数据结构就总结完成了,结合数据结构整理一下redis的应用场景,基本上都是提供思路。redis在业务中应用还是要结合场景具体分析,真正用好redis才能提升系统的性能,不能为了用而用。