redis 之 LRU 策略淘汰配置

 Redis LRU cache可以通过参数maxmemory,在配置文件redis.conf中设置,或者在redis服务启动之后使用CONFIG SET命令设置。例如在redis.conf中设置cache大小为100mb:

  maxmemory 100mb

  maxmemory设置为0,表示cache大小无限制(注意:32位操作系统最大支持3GB的内存,32位操作系统中maxmemory最大为3G)

Redis cache数据淘汰策略

  在指定了Redis cache大小后,可以使用参数 maxmemory-policy来指定cache的数据置换策略。Redis提供的数据置换策略有以下几种:

  • noeviction: 没有淘汰策略,当cache大小耗尽时直接返回一个错误。
  • allkeys-lru: 淘汰掉最近最少使用的key 。(一般用这个,其它很少用)
  • volatile-lru: 仅仅从过期的数据集中淘汰掉最近最少使用的key
  • allkeys-random:随机淘汰掉一个key;
  • volatile-random:仅仅在过期的数据集中随机淘汰掉key;
  • volatile-ttl:在过期的数据集中淘汰存活时间最短的key

在上述策略中,如果cache中所有的keys都没有过期,volatile-lruvolatile-ttlvolatile-random这三个将会像noevictio策略一样,cache耗尽时抛出错误。

  如果某些key访问比较频繁,但一些key不经常访问,可以采用allkeys-lru策略,此策略也可以用于不确定key访问频率的应用中;

  如果所有的key的访问频率比较均衡,比如循环的访问cache中的key,可以采用allkeys-random策略。

  另外需要注意的是:设置key过期是需要耗费一定内存的,实际应用中需要考量是否必须设置key的过期时间。

  如果一个命令结果的数据集比较大,这时内存的消耗可能会超过maxmemory设置的值。

Redis LRU算法

  Redis LRU算法不是一个确切的LRU实现,这意味着redis 并不是保证取得所有数据集中最近最少使用(LRU)的键值对,而只是随机挑选的几个键值对中的某个key。

  redis3.0中提供了一个候选淘汰池(翻译不太准确,望指正),改进了近似LRU算法的执行效率,更符合实际的LRU算法。

  每次从cache中随机取出多少个keys执行淘汰策略是非常重要的,可以通过参数maxmemory-samples来设置。

为什么不采用真正的LRU算法

  真正的LRU会耗费大量内存,Redis最主要的做法:淘汰时,随机取多个keys,找到最老的进行淘汰.虽不能保证一定淘汰最老的,但倾向于淘汰偏老的keys。

  此外官方文档上说,如果数据访问模模型越符合幂次定律,则redis 的LRU近似算法和真实的LRU算法越接近(看的不是太明白,可以翻翻相关资料,大概就是说,20%数据访问非常频繁,80%的数据访问不是很频繁时,redis的LRU近似算法和真实的LRU算法是相差最小的)。

你可能感兴趣的:(redis)