Redis高频面试点
点击上方「蓝字」关注我们
0x01:内存淘汰策略
noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键;
allkeys-lru:加入键的时候,如果过限,首先通过LRU算法驱逐最久没有使用的键;
volatile-lru:加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最久没有使用的键;
allkeys-random:加入键的时候如果过限,从所有key随机删除;
volatile-random:加入键的时候如果过限,从过期键的集合中随机驱逐;
volatile-ttl:从配置了过期时间的键中驱逐马上就要过期的键;
volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键;
allkeys-lfu:从所有键中驱逐使用频率最少的键;
0x02:过期策略
Redis是key-value数据库,可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。
定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。(expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。)
0x03:缓存穿透
定义:缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
解决方案:
接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击;
0x04:缓存击穿
定义:缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
解决方案:
设置热点数据永远不过期;
加互斥锁;
0x05: 缓存雪崩
定义:缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
解决方案:
缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生;
如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中;
设置热点数据永远不过期;
0x06:部署方案
单机模式
主从模式
哨兵模式
集群模式
对于Redis的集群模式,是Redis 3.0之后才推出cluster分布式集群方案;在Redis 3.0之前可以采用中间件代理的模式,例如使用Twemproxy、Codis和Nginx。
0x07:持久化机制RDB和AOF
RDB就像是一台给Redis内存数据存储拍照的照相机,生成快照保存到磁盘的过程。触发RDB持久化分为手动触发和自动触发。Redis重启读取RDB速度快,但是无法做到实时持久化,因此一般用于数据冷备和复制传输。
优点:
非常适合全量备份
恢复速度比AOF快
缺点:
RDB方式没有办法做到实时持久化
版本兼容RDB格式问题
RDB方式不能提供强一致性,如果Redis进程崩溃,那么两次RDB之间的数据也随之消失。那么AOF的出现很好的解决了数据持久化的实时性,AOF以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令来恢复数据。AOF会先把命令追加在AOF缓冲区,然后根据对应策略写入硬盘(appendfsync)。
优点:
做到最多丢失1-2s内的数据(最多丢失2s数据,因为AOF追加阻塞)
缺点:
AOF文件比RDB文件大
可能导致追加阻塞
0x08:Redis常用业务场景
热点数据的缓存
限时业务的运用
计数器相关问题
排行榜相关问题
分布式锁
延时操作
分页、模糊搜索
点赞、好友等相互关系的存储
队列
扫码二维码
获取更多精彩
Java乐园