一文阐述Redis 8种淘汰策略、击穿、穿透、雪崩及其解决方式

前沿

Redis有几块内容在面试的时候经常会被问到,今天我们来聊聊Redis的淘汰策略、击穿、穿透、雪崩及解决方案。

正文

淘汰策略

1)volatile-lru:从已设置过期时间的key中挑选最近最少使用的数据淘汰;

2)volatile-ttl:从已设置过期时间的key中挑选将要过期的数据淘汰;

3)volatile-random:从已设置过期时间的key中任意选择数据淘汰;

4)volatile-lfu:从已设置过期时间的key中挑选使用频率最低的数据淘汰;

5)allkeys-lru:从key中挑选最近最少使用的数据淘汰;

6)allkeys-lfu:从key中挑选使用频率最低的数据淘汰;

7)allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰;

8) no-enviction(驱逐)

设置淘汰策略方式

在 redis.conf文件里,如下图

maxmemory <bytes>
# volatile-lru -> remove the key with an expire set using an LRU algorithm
# allkeys-lru -> remove any key according to the LRU algorithm
# volatile-random -> remove a random key with an expire set
# allkeys-random -> remove a random key, any key
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# noeviction -> don't expire at all, just return an error on write operations
# The default is:
maxmemory-policy noeviction

在maxmemory-policy后面选择淘汰策略,在maxmemory后面设置内存大小,当内存大小超过这个值后,Redis就会根据maxmemory-policy设置的值进行淘汰;

击穿

当某个key在某一刻失效,且正好该时刻存在大量的并发请求来访问该key的值,但该key已经不存在,导致查不到的现象。重点是缓冲中没有,但是数据库存在

解决方案

1、缓冲没有的时候,加锁,获取到锁的线程,从数据库取值后set到缓冲,没获取到锁的线程,则先睡眠短暂时间,然后从缓冲取,直接返回。
2、设置热点数据永不过期。

穿透

当某个key在某一时刻实现,且正好该时刻存在大量的并发请求来访问该key,该key不存在,则大量的请求来访问数据库,但是数据库也不存在,导致请求都会查询redis和数据库的现象,缓冲中和数据库中都没有,恶性攻击,可以利用这一点,通过脚本大量的发送请求,是你的数据库奔溃。

解决方案

加锁,并且如果数据库不存在,则设置空值,后来的请求拿到空值后,可以判断数据库也没有,则直接返回。

雪崩

再某个时间大量的key失效,且正好在该时刻存在大量的请求来访问这些实效的key,导致大量的请求打到数据库的现象。

解决方案

采用版本号,提前更新或者在一定范围随机设置key的实效时间,将失效时间打散。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值