我们先了解Redis的三个过期处理机制
定时删除
这个就是在设置key的同时也设置一个定时器,当过期的时间到了之后,这个key就会被删除。
优点
- 可以保证内存被尽快释放。
缺点
- 创建定时器需要消耗资源
- 当多个元素在同一时间需要释放的时候,会拖累CPU的使用。当CPU使用紧张的时候有可能没有时间来处理这个删除
惰性删除
这个意思就是,当我们要查询这个元素的时候看看这个元素有没有过期,如果过期就删除并返回null。
优点
- 对CPU的占用比较少
缺点
- 如果没有查询这个元素的时候我们就不会去删除,就会导致内存泄露的发送。
定期删除
每隔一段时间去删除过期的元素
优点
- 可以通过控制删除操作的频率减少对CPU时间的消耗
- 解决惰性删除带来的内存泄露问题
缺点
对频率的设置不好的话,有可能还不如上面的两种。
Redis的内存淘汰机制
这个机制就会导致,我写入的元素还没有到时间过期,但是却丢失了。
- noeviction: 当内存不足容纳新的元素的时候,就会在用户添加元素的时候报错
- allkeys-lru: 当内存不足容纳新的元素的时候,就会在键空间中,丢掉最近最少使用的key,然后添加用户新加过来的数据
- allkeys-random: 当内存不足容纳新的元素的时候,就会在键空间中,随机丢掉一个key,然后添加用户新加过来的数据
- volatile-lru: 当内存不足容纳新的元素的时候,在设置过期时间的键空间中,移除最近最少使用的key,然后添加用户新加过来的数据
- volatile-random: 当内存不足容纳新的元素的时候,在设置了过期时间的键空间中,随机移除一个 key。
- volatile-ttl: 当内存不足容纳新的元素的时候,在设置了过期时间的键空间中,让更早过期的key先移除
带来的问题
根据上面的一些机制我们就可以知道,我们有时候发现,有些数据还没有到时间呢,就找不到了。