8. Interview-Redis

2020-07-21  本文已影响0人  allen锅

1 Redis数据结构及适用场景

SDS,Simple Dynamic String,简单动态字符串。

Redis-String

双向链表

Redis-链表

字典/符号表/关联数组/map

Redis-字典

整数集合intset,保证集合中不出现重复元素,节省内存

Redis-整数集合

压缩列表ziplist

Redis-压缩列表

快速列表quicklist=ziplist+linkedlist

跳跃表skiplist-zset

Redis-跳跃表

紧凑列表listpack

基数树,有序字典树,rax

2 Redis到底是单线程还是多线程?Redis单线程模型?

3 Redis有多快?

C语言编写,官方QPS,每秒读11w,写8w

4 Redis为什么快?底层怎么实现的?

IO多路复用-select IO多路复用-epoll

5 讲一下Redis的I/O多路复用中的Reactor设计模式

6 Redis持久化机制

7 Redis的watch机制

8 Redis网络通信协议

RESP

gossip

客户端 ——> 服务器

服务器 ——> 客户端

9 Redis实现分布式锁

实现方案

Redisson分布式锁原理

常见问题及解决方案

10 分布式锁实现方案及优缺点比较

分布式锁三种实现方案

分布式锁三种实现方式特点

分布式锁三种实现比较

11 BSD协议是什么?

目前经过Open Source Initiative组织通过批准的开源协议目前有58
种(http://www.opensource.org/licenses /alphabetical)。我们在常见的开源协议如BSD,GPL,LGPL,MIT等都是OSI批准的协议。如果要开源自己的代码,最好也是选择这些被批准的开源协议。

12 Redis HA

13 Redis怎么设置最大内存?超过最大内存会怎样?

14 Redis虚拟内存机制

15 Redis实现发号器

16 Redis管道技术pipeline

17 缓存穿透&缓存击穿&缓存雪崩

17.1 缓存穿透

查询缓存和DB都未命中,黑客可以利用不存在的key攻击。

布隆过滤器误判率计算公式

17.2 缓存击穿

缓存未命中,DB命中,一般是key过期了,大量请求查询DB,给DB造成巨大压力。

互斥锁代码示例

17.3 缓存雪崩

大量的原有缓存失效的请求都去查询DB,短时间内给DB造成了巨大的压力,造成数据库宕机,进而引发一系列连锁反应,造成整个系统崩溃。缓存击穿针对的是单个key,缓存雪崩针对的是多个key。

18

19 缓存预热

系统上线前将相关的缓存数据直接加载到缓存系统的过程就是缓存预热。

20 缓存更新

21 缓存降级

系统流量太大,保证核心服务可用,非核心服务可考虑降级。一些诸如加入购物车、支付等是不能降级的。

22 缓存淘汰算法

23 LRU怎么实现?Redis是怎么实现的?

LRU常用哈希表+双向链表实现,表头是刚刚使用过得元素,表尾是不常用的元素会被踢掉,get/set在不冲突情况下可保证O(1)复杂度 也可通过双向链表保证LRU的删除/更新O(1)复杂度,过期时间可以维护一个线程,懒惰删除。但是redis不是这么实现的。

24 缓存一致性解决方案(最终一致性)

24.1 重量级客户端

写缓存 读缓存

24.2 客户端数据库与缓存解耦

异步解耦方式

25 Redis实现消息队列

26 Redis小对象压缩存储

27 Redis内存回收机制

28 Redis内存分配算法

29 Redis info指令

Server:服务器运行的环境参数

Clients:客户端相关信息

Memory:服务器运行内存统计数据

Persistence:持久化信息

Stats:通用统计数据

Replication:主从复制相关信息

CPU:CPU使用情况

Cluster:集群信息

KeySpace:键值对统计数量信息

30 Redis过期策略

31 Redis懒惰删除

32 Redis安全机制

33 Redis有哪些时间复杂度O(n)的指令,应该怎么处理这些指令,有什么改进措施?

时间复杂度为O(n)的指令

怎么处理这些指令

改进优化措施

34 Redis集群方案

35 数据分片方式

36 Redis Cluster中的槽位数为什么是16384?

37 CRC算法(CRC8&CRC16&CRC32&CRC64)

CRC算法 CRC算法2

38 Redis中key和value的存储大小限制?

39 Redis使用场景

这个主要利用redis的setnx命令进行,setnx:"set if not exists"就是如果不存在则成功设置缓存同时返回1,否则返回0 ,这个特性在俞你奔远方的后台中有所运用,因为我们服务器是集群的,定时任务可能在两台机器上都会运行,所以在定时任务中首先 通过setnx设置一个lock,如果成功设置则执行,如果没有成功设置,则表明该定时任务已执行。 当然结合具体业务,我们可以给这个lock加一个过期时间,比如说30分钟执行一次的定时任务,那么这个过期时间设置为小于30分钟的一个时间 就可以,这个与定时任务的周期以及定时任务执行消耗时间相关。

当然我们可以将这个特性运用于其他需要分布式锁的场景中,结合过期时间主要是防止死锁的出现。

6、延时操作

这个目前我做过相关测试,但是还没有运用到我们的实际项目中,下面我举个该特性的应用场景。 比如在订单生产后我们占用了库存,10分钟后去检验用户是够真正购买,如果没有购买将该单据设置无效,同时还原库存。 由于redis自2.8.0之后版本提供Keyspace Notifications功能,允许客户订阅Pub/Sub频道,以便以某种方式接收影响Redis数据集的事件。 所以我们对于上面的需求就可以用以下解决方案,我们在订单生产时,设置一个key,同时设置10分钟后过期, 我们在后台实现一个监听器,监听key的实效,监听到key失效时将后续逻辑加上。 当然我们也可以利用rabbitmq、activemq等消息中间件的延迟队列服务实现该需求。

7、分页、模糊搜索

redis的set集合中提供了一个zrangebylex方法,语法如下:

ZRANGEBYLEX key min max [LIMIT offset count]

通过ZRANGEBYLEX zset - + LIMIT 0 10 可以进行分页数据查询,其中- +表示获取全部数据

zrangebylex key min max 这个就可以返回字典区间的数据,利用这个特性可以进行模糊查询功能,这个也是目前我在redis中发现的唯一一个支持对存储内容进行模糊查询的特性。

前几天我通过这个特性,对学校数据进行了模拟测试,学校数据60万左右,响应时间在700ms左右,比mysql的like查询稍微快一点,但是由于它可以避免大量的数据库io操作,所以总体还是比直接mysql查询更利于系统的性能保障。

8、点赞、好友等相互关系的存储

Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。 又或者在微博应用中,每个用户关注的人存在一个集合中,就很容易实现求两个人的共同好友功能。

这个在奶茶活动中有运用,就是利用set存储用户之间的点赞关联的,另外在点赞前判断是否点赞过就利用了sismember方法,当时这个接口的响应时间控制在10毫秒内,十分高效。

9、队列/消息队列

由于redis有list push和list pop这样的命令,所以能够很方便的执行队列操作。
lpush/rpop,rpush/lpop

图中绿色的部门就是我们要保留的一个时间段的时间序列信息,灰色的段会被砍掉。统计绿色段中时间序列记录的个数就知道是否超过了频率的阈值。

hset sign:(user_id) 2019-08-11 1 hset sign:(user_id) 2019-08-12 0
hset sign:$(user_id) 2019-08-14 2

1
2
3
4
这个其实非常浪费用户空间,后来想做全部用户的签到,技术leader指出,这时候的再用hash就有问题了,他讲到当用户过千万的时候,内存可能会飚到 30G+,我们线上实例通常过了 20G 就开始报警,30G 已经属于严重超标了。
这时候我们就开始着手解决这个问题,去优化存储。我们选择使用位图来记录签到信息,一个签到状态需要两个位来记录,一个月的存储空间只需要 8 个字节。这样就可以使用一个很短的字符串来存储用户一个月的签到记录。

但是位图也有一个缺点,它的底层是字符串,字符串是连续存储空间,位图会自动扩展,比如一个很大的位图 8m 个位,只有最后一个位是 1,其它位都是零,这也会占用1m 的存储空间,这样的浪费非常严重。
所以呢就有了咆哮位图这个数据结构,它对大位图进行了分段存储,全位零的段可以不用存。
另外还对每个段设计了稀疏存储结构,如果这个段上置 1 的位不多,可以只存储它们的偏移量整数。这样位图的存储空间就得到了非常显著的压缩。

Redis使用场景

40 Redis源码看过吗?

41 缓存更新怎么做?二级缓存更新呢?

42 二级缓存怎么建设,第二级缓存为什么用本地缓存、两层都用分布式缓存不行吗?了解过业内哪些成熟框架?

上一篇下一篇

猜你喜欢

热点阅读