Redis高频面试点

JAVA乐园

共 1089字,需浏览 3分钟

 ·

2020-12-24 04:01

点击上方「蓝字」关注我们

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乐园

有用!分享+在看☟


浏览 16
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报