Redis 内存淘汰指的是用户存储的一些键被可以被 Redis 主动地从实例中删除
淘汰机制和 Redis 最大占用内存 maxmemory 值以及过期时间 expireTime 紧密相连,典型的例子是:
a.客户端发起了需要申请更多内存的命令(如set)。
b.Redis 检查内存使用情况,如果已使用的内存大于 maxmemory 则开始根据用户配置的不同淘汰策略来淘汰已存储的数据(key),从而换取一定的内存。
c.如果上面都没问题,则这个命令执行成功。
注:maxmemory 为 0 的时候表示我们对 Redis 的内存使用没有限制,redis 默认设置 maxmemory 为 0。
Redis 支持很多种淘汰机制:
a.volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰;
b.volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰;
c.volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰;d.allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰;
e.allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰;
f.noeviction:禁止驱逐数据,当内存使用达到阈值的时候,所有引起申请内存的命令会报错。
可以看出数据删除与否和数据是否进行过持久化没有绝对联系,只是不同版本上默认的淘汰机制有所差异,目前版本一般为 noeviction,即不允许删除数据。