redis的LRU驱动事件
Posted 本站大佬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis的LRU驱动事件相关的知识,希望对你有一定的参考价值。
当我们使用redis作为缓存时,我希望它可以自动的回收旧的,不常用的键值对,这很重要。否则这些旧数据甚至不再使用的数据会占用太多的空间,从而影响到服务。
LRU是redis唯一支持的回收机制。
maxmemory在32位的系统中默认为3GB,在64位系统中默认为0,就是不对redis的内存空间做限制。如果想要对redis进行内存限制,比如所限制为100mb,需要在redis.conf中配置maxmemory 100mb。当内存达到限制时,会自动的执行一些行为,也就是回收策略,这需要我们提前设置好。
noeviction 当达到内存限制时,会对的更新命令返回错误,这种策略可以保证已经存储在redis中的数据不被回收,但是因为内存满了,所以无法接受更新命令。
allkeys-lru 回收所有键值对中使用次数最少的,从而使得新的数据可以写入redis
volatile-lru 回收已经过期的数据中使用次数较少的,从而使新的数据可以写入redis
allkeys-random 随机回收数据,从而使新的数据可以写入redis
volatile-random 随即回收已经过期的数据,从而使得新的数据可以写入redis
volatile-ttl 回收已经过期的数据,优先回收ttl较小的数据,从而使得新的数据可以写入redis,ttl为expire或者pexpire设置的键值对生存时间。当内存有压力的时候尽量不要为键值对添加生存时间。
理解回收机制是很重要的:当客户端执行了命令添加了新的数据,redis会检查内存是否到了maxmemory的限制,如果达到了,就会执行回收策略,等到有空间的时候,执行新的命令。重复这个过程,redis一直在maxmemory这个限制上下徘徊。
考虑到当redis中的数据较多时,使用上述的回收策略会占用大量的内存,这会对极度依赖内存的redis造成严重的影响。
所以开发者使用了一种近似于lru的回收机制。执行回收策略时,redis会抽取少量的keys,然后在其中找到最符合标准的数据,进行回收,这种回收策略占用少量的内存,对redis本身其它的服务较为友好。至于抽取的keys数量,可以使用memory-samples这个命令,如果想要抽取5个,可以使用memory-samples 5进行配置。
参考:redis中文网站
以上是关于redis的LRU驱动事件的主要内容,如果未能解决你的问题,请参考以下文章