redis过期策略以及内存淘汰机制:
redis主要基于内存来进行高性能的高并发的读写操作。
redis的过期策略是定期删除+惰性删除
过期删除:redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除,这里需要明确是redis每隔100ms检查的不是所有的key而是随机抽取了一些,假设我们再redis里边放了10w个key,都设置了过期时间,如果每隔几百毫秒检查10w个key,那redis基本上是卡死了,cpu负载会很高切都消耗在检查过期的key上了,所以呢这里是随机抽取一些key来检查
那么其实这样就有另外一个问题了,如果这个key过期了,但是到了时间并没有被删除掉,那这个时候就引入了另外一个概念,惰性删除。
惰性删除:
当你在获取某个key的时候,redis会检查一下,这个key如果已经到达过期时间,那么就什么都不返回,
但是这个又引发了另外一个问题,如果过期删除漏掉了很多已经过期的key,那么这些key一直占用这个内存,那么这个时候怎么办? 这时候可以走内存淘汰机制
内存淘汰机制:
redis 内存淘汰机制有以下几个:
• noeviction: 默认淘汰机制,不会进行淘汰,当内存不足以容纳新写入数据时,新写入操作会报错。
• allkeys-lru:当内存不足以容纳新写入数据时,设置时间戳来记录最近一次的访问时间。在第一次淘汰数据时,会先随机选择 N 个数据作为一个候选集合,然后淘汰 lru 值最小的。后续再淘汰数据时,会挑选数据进入候选集合,进入集合的条件是:它的 lru 小于候选集合中最小的 lru。如果候选集合中数据个数达到了 maxmemory-samples,Redis 就会将 lru 值小的数据淘汰出去。
• allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key。
• volatile-lfu:当内存不足以容纳新写入数据时,基于访问次数来淘汰数据,每一个数据增加一个计数器,来记录访问次数,在键空间中,移除最近最少使用的 key。
• volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
• volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。



