redis的几种数据淘汰策略

1.redis的数据淘汰策略

最为大家所熟悉的,就是我们在进行redis存值的时候,可以针对每个key-value设置过期时间,时间到,数据自动删除。但是,当我们每个key-value都设置不过期的话,redis是不是就会被撑爆了呢?答案是不太会的,为什么这样说?是因为当我们的redis内存达到设置的maxmemory的时候,就会使用数据淘汰策略来保证redis的高可用性。

redis的六种淘汰策略:

  1. volatile-lru: 从已设置过期的数据中中随机挑选最近最少使用的多个key进行数据淘汰。
  2. volatile-ttl: 从已设置过期的数据中挑选即将要过期的数据进行淘汰。
  3. volatile-random:从已设置过期的数据中任意淘汰数据。
  4. allkeys-lru: 从数据集中挑选最近最少使用的数据淘汰。
  5. allkeys-random:从数据集中任意选择数据淘汰。
  6. noeviction: 不进行删除,达到最大内存时,直接返回错误信息。

以上六点的配置是在redis的配置是文件中maxmemory-policy来决定具体使用哪种淘汰策略。我们可以根据业务场景的不同使用不同的淘汰策略。

2.redis数据淘汰策略中的lru算法

LRU(less recently used)的意思是最少最近使用的。这种算法在redis的淘汰策略中经常遇到,淘汰最少最近使用的数据先淘汰。举例: 比如redis中存了三个用户 张三、李四、王五。 张三每天登陆一次系统、李四每两天登陆一次系统、王五每一周登陆一次系统三者登陆的时候都设置过期时间为当前时间加一周。当redis内存即将要满的时候,会随机挑选几个key(这里几个是根据配置文件中的maxmemory-samples配置而定)算出哪个key最近最不常使用的key进行淘汰。为什么不遍历所有的key,数量太大的话,占内存和消耗CPU的性能。在redis3.0版本进行了优化升级:首先第一次随机选取的key都会放入一个pool中(pool的大小为16),pool中的key是按lru大小顺序排列的。接下来每次随机选取的keylru值必须小于pool中最小的lru才会继续放入,直到池子满足16个。如果放满以后的话,每次如果有新的key需要放入,就会将pool中lru最大的一个key取出。淘汰的时候,直接从pool中选取一个lru最小的值然后将其淘汰。

3.总结

由上面分析我们可以知道,redis的几种淘汰策略的使用和在特定场景下使用特定的淘汰策略。
在这里我们需要说明:即使我们设置了过期时间,但是当数据量大的时候,redis是每100ms随机取出几个key判断有没有过期,如果过期的话进行删除。还有就是我们在取数据的时候先判断这个key有没有过期,过期的话进行删除。因为,数据量太大,不可能遍历所有key-value,这样会影响系统性能。所以说:当我们有大量的key在同一时间过期的话,如果内存占比没有下降的话,不用担心,这是redis设置机制的问题。

你可能感兴趣的:(Redis)