Redis 3.2 提供了 quicklist 内部编码,它是以一个 ziplist 为节点的 linkedlist,它结合了两者的优势,为列表类提供了一种更为优秀的内部编码实现。
Q4:list 的应用场景有什么?消息队列
Redis 的 lpush + brpop 即可实现阻塞队列,生产者客户端使用 lpush 从列表左侧插入元素,多个消费者客户端使用 brpop 命令阻塞式地抢列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。
文章列表
每个用户有属于自己的文章列表,现在需要分页展示文章列表,就可以考虑使用列表。因为列表不但有序,同时支持按照索引范围获取元素。每篇文章使用哈希结构存储。
lpush + lpop = 栈、lpush + rpop = 队列、lpush + ltrim = 优先集合、lpush + brpop = 消息队列。
set 4 Q1:简单说一说 set 类型集合类型也是用来保存多个字符串元素,和列表不同的是集合不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。一个集合最多可以存储 232-1 个元素。Redis 除了支持集合内的增删改查,还支持多个集合取交集、并集、差集。
Q2:你知道哪些 set 的命令?添加元素
sadd key element [element...],返回结果为添加成功的元素个数。
删除元素
srem key element [element...],返回结果为成功删除的元素个数。
计算元素个数
scard key,时间复杂度为 O(1),会直接使用 Redis 内部的遍历。
判断元素是否在集合中
sismember key element,如果存在返回 1,否则返回 0。
随机从集合返回指定个数个元素
srandmember key [count],如果不指定 count 默认为 1。
从集合随机弹出元素
spop key,可以从集合中随机弹出一个元素。
获取所有元素
smembers key求多个集合的交集/并集/差集
sinter key [key...] sunion key [key...] sdiff key [key...]保存交集、并集、差集的结果
sinterstore/sunionstore/sdiffstore destination key [key...]集合间运算在元素较多情况下比较耗时,Redis 提供这三个指令将集合间交集、并集、差集的结果保存在 destination key 中。
Q3:set 的内部编码是什么?intset 整数集合:当集合中的元素个数小于配置值(默认 512 个时),使用 intset。
hashtable 哈希表:当集合类型无法满足 intset 条件时使用 hashtable。当某个元素不为整数时,也会使用 hashtable。
Q4:set 的应用场景有什么?set 比较典型的使用场景是标签,例如一个用户可能与娱乐、体育比较感兴趣,另一个用户可能对例时、新闻比较感兴趣,这些兴趣点就是标签。这些数据对于用户体验以及增强用户黏度比较重要。
sadd = 标签、spop/srandmember = 生成随机数,比如抽奖、sadd + sinter = 社交需求。
zset 4 Q1:简单说一说 zset 类型有序集合保留了集合不能有重复成员的特性,不同的是可以排序。但是它和列表使用索引下标作为排序依据不同的是,他给每个元素设置一个分数(score)作为排序的依据。有序集合提供了获取指定分数和元素查询范围、计算成员排名等功能。
Q2:你知道哪些 zset 的命令?添加成员
zadd key score member [score member...],返回结果是成功添加成员的个数
Redis 3.2 为 zadd 命令添加了 nx、xx、ch、incr 四个选项:
nx:member 必须不存在才可以设置成功,用于添加。
xx:member 必须存在才能设置成功,用于更新。
ch:返回此次操作后,有序集合元素和分数变化的个数。
incr:对 score 做增加,相当于 zincrby。
zadd 的时间复杂度为 O(logn),sadd 的时间复杂度为 O(1)。
计算成员个数
zcard key,时间复杂度为 O(1)。
计算某个成员的分数
zscore key member ,如果不存在则返回 nil。
计算成员排名
zrank key member,从低到高返回排名。
zrevrank key member,从高到低返回排名。
删除成员
zrem key member [member...],返回结果是成功删除的个数。
增加成员的分数
zincrby key increment member返回指定排名范围的成员
zrange key start end [withscores],从低到高返回
zrevrange key start end [withscores], 从高到底返回
返回指定分数范围的成员
zrangebyscore key min max [withscores] [limit offset count],从低到高返回
zrevrangebyscore key min max [withscores] [limit offset count], 从高到底返回
返回指定分数范围成员个数
zcount key min max删除指定分数范围内的成员
zremrangebyscore key min max交集和并集
zinterstore/zunionstore destination numkeys key [key...] [weights weight [weight...]] [aggregate sum|min|max]destination:交集结果保存到这个键
numkeys:要做交集计算键的个数
key:需要做交集计算的键
weight:每个键的权重,默认 1
aggregate sum|min|max:计算交集后,分值可以按和、最小值、最大值汇总,默认 sum。
Q3:zset 的内部编码是什么?ziplist 压缩列表:当有序集合元素个数和值小于配置值(默认128 个和 64 字节)时会使用 ziplist 作为内部实现。
skiplist 跳跃表:当 ziplist 不满足条件时使用,因为此时 ziplist 的读写效率会下降。
Q4:zset 的应用场景有什么?