Java 面试知识点【背诵版 240题 约7w字】 (46)

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 的应用场景有什么?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwpgxs.html