场景

(1)往redis写入的数据过一阵子就没了?
(2)存入redis的数据已经过期,为什么还占用着内存?

场景解析

redis过期策略

(1)往redis中存入的数据是存在内存当中的,内存空间是有限的,当存入的数据太多,超过了redis可容纳的空间,就会走LRU算法,干掉不常用的数据,保留常用的数据。
(2)redis采用的过期策略是: 定期删除 + 惰性删除
定期删除:redis默认每隔100ms随机抽取一些设置了过期时间的key,检查是否过期,如果过期就删除。
注意是随机抽取一些数据,加入redis里存放了10w个key,都设置了过期时间,然后每隔几百毫秒就检查所有的key,那会造成高负载消耗在检查key的过程中了,会造成redis死掉。所以实际上redis是每隔100ms随机抽取一些key来检查和删除的。 如果获取的key的时候,此时key已经过期,就删除,不返回任何东西。
惰性删除:由于定期删除可以会漏掉很多过期的key没有被删除,此时如果去查某个key的时候,redis就会检查一下这个key是否设置了过期时间,如果设置了过期时间且过期了,就删除这个key。

内存淘汰机制

如果定期删除漏掉了许多过期key,同时也没有及时去查,也就是没走惰性删除,此时如果还有大量的过期key堆积在内存里,导致redis内存块耗尽了,此时就会走 内存淘汰机制

redis内存淘汰机制

  • noeviction:当内存不足以容纳新写入的数据时,新写入操作会报错。
  • allkeys-lru:当内存不足以容纳新写入的数据时,在键空间中,移除最近最少使用的key。(最常用)
  • allkeys-random:当内存不足以容纳信息而入的数据时,在键空间中,随机移除某个key。
  • volatile-lru:当内存不足以容纳新写入的数据时,在设置了过期时间的键空间中,移除最近最少使用的key。(一般不合适)。
  • volatile-random:当内存不足以容纳新写入的数据时,在设置了过期时间的键空间中,随机移除某个key。
  • volatile-ttl:当内存不足以容纳新写入的数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

手写LRU算法