内存管理与数据淘汰机制
默认情况下,在32位OS中,Redis最大使用3GB的内存,在64位OS中则没有限制。
所以最好给设置一个最大可使用内存: maxmemory 100mb
在内存占用达到了 maxmemory
后,再向Redis写入数据时,Redis会:
-
根据配置的数据淘汰策略尝试淘汰数据,释放空间
-
如果没有数据可以淘汰,或者没有配置数据淘汰策略,那么Redis会对所有写请求返回错误,但读请求仍然可以正常执行
在为Redis设置 maxmemory
时,需要注意一下几点:
-
如果采用了Redis的主从同步,主节点向从节点同步数据时,会占用掉一部分内存空间
-
如果maxmemory过于接近主机的可用内存,会导致数据同步时内存不足。
-
所以设置的maxmemory不要过于接近主机可用的内存,留出一部分预留用作主从同步。
内存管理
当 Redis 内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换 (swap)。交换会让 Redis 的性能急剧下降,对于访问量比较频繁的 Redis 来说,这样龟速的存取效率基本上等于不可用。 在生产环境中我们是不允许 Redis 出现交换行为的,为了限制最大使用内存,Redis 提供了配置参数 maxmemory 来限制内存超出期望大小。 当实际内存超出 maxmemory 时,Redis 提供了几种可选策略 (maxmemory-policy) 来让用户自己决定该如何腾出新的空间以继续提供读写服务。
-
noeviction
不会继续服务写请求 (DEL 请求可以继续服务),读请求可以继续进行。这样可以保证不会丢失数据,但是会让线上的业务不能持续进行。这是默认的淘汰策略。 -
volatile-lru
尝试淘汰设置了过期时间的 key,最少使用的 key 优先被淘汰。没有设置过期时间的 key 不会被淘汰,这样可以保证需要持久化的数据不会突然丢失。 -
volatile-ttl
跟上面一样,除了淘汰的策略不是 LRU,而是 key 的剩余寿命 ttl 的值,ttl 越小越优先被淘汰。 -
volatile-random
跟上面一样,不过淘汰的 key 是过期 key 集合中随机的 key。 -
allkeys-lru
区别于 volatile-lru,这个策略要淘汰的 key 对象是全体的 key 集合,而不只是过期的 key 集合。这意味着没有设置过期时间的 key 也会被淘汰。 -
allkeys-random
跟上面一样,不过淘汰的策略是随机的 key。 -
volatile-xxx
策略只会针对带过期时间的 key 进行淘汰,allkeys-xxx 策略会对所有的 key 进行淘汰。如果你只是拿 Redis 做缓存,那应该使用 allkeys-xxx,客户端写缓存时不必携带过期时间。如果你还想同时使用 Redis 的持久化功能,那就使用 volatile-xxx 策略,这样可以保留没有设置过期时间的 key,它们是永久的 key 不会被 LRU 算法淘汰。
数据淘汰机制
-
volatile-lru:使用LRU算法进行数据淘汰(淘汰上次使用时间最早的,且使用次数最少的key),只淘汰设定了有效期的key
-
allkeys-lru:使用LRU算法进行数据淘汰,所有的key都可以被淘汰
-
volatile-random:随机淘汰数据,只淘汰设定了有效期的key
-
allkeys-random:随机淘汰数据,所有的key都可以被淘汰
-
volatile-ttl:淘汰剩余有效期最短的key
配置: maxmemory-policy volatile-lru
默认注释且值为:noeviction,即不进行数据淘汰