Redis:丢弃策略

    当Redis内存超过物理内存限制时,内存数据会和磁盘产生频繁的交换,让Redis的性能急剧下降。所以在生产环境,这种交换行为是不允许的。

    maxmemory参数是用来配置最大内存大小的,如果超过了maxmemory,Redis提供了如下几种可选策略,用来设置maxmemory-policy。

1、丢弃策略概览

  • noeviction:不会继续服务处理del之外的写请求,读请求可以继续进行,这是默认策略;
  • volatile-lru:根据近似lru算法进行淘汰,但不会丢弃没有设置过期时间的key;
  • volatile-ttl:比较有过期时间的key的寿命,寿命短的先淘汰;
  • volatile-random:从设置了过期时间的key中随机选择key进行淘汰;
  • allkeys-lru:和volatile-lru相比,淘汰范围从所有设置了过期时间的key,扩展到了所有的key(包含没有设置过期时间的key);
  • allkeys-random:和volatile-random相比,淘汰范围从所有设置了过期时间的key,扩展到了所有的key(包含没有设置过期时间的key)。

2、近似LRU算法

    LRU算法需要消耗大量额外的内存,所以Redis采用的,实际上是一种近似LRU算法。Redis给每个key增加了一个字段,24bit,用于描述最后一次被访问的时间戳。

    当Redis执行写操作时,发现内存超出maxmemory,就会指定LRU淘汰算法。随机采样出5(可以设置)个key,然后淘汰掉最旧的key;如果淘汰后内存还是超出maxmemory,就继续淘汰,指定内存低于maxmemory为止。

    每次采样多少,是通过maxmemory_samples进行设置的。

    Redis增加了淘汰池,以提升LRU算法的效果。淘汰池是一个数组,每一次淘汰循环中,新的随机得出的key列表,会和淘汰池中的key列表进行融合,淘汰掉最旧的一个key之后,保留剩余较旧的key列表在池中,等待下一次淘汰。

    算法流程如下:

  1. redis执行写操作时,发现内存大小超过maxmemory配置的值,触发丢弃过程;
  2. redis执行对缓存的数据进行采样,采样数量取决于maxmemory_samples的配置;
  3. 根据每个key最后一次被访问的时间戳排序,从采样中选出时间最久的key;
  4. 将采样中时间最久的key放入到淘汰池,并淘汰掉淘汰池中时间最久的key。

你可能感兴趣的:(redis)