前言

    作为一台服务器,它的内存肯定是有上限的,Redis是内存数据库,大量的数据保存在内存中,当内存空间达到瓶颈,超出了物理内存的上限时,就会导致内存操作频繁与磁盘进行交换,从而导致性能产生断崖式是下滑。

    内存中保存的数据,大量的Key应该都并不是有用的,所以淘汰它们,释放所占空间,可以极大的提供内存的可使用量。

内存淘汰设置

    Redis的内存淘汰策略与redis.conf中配置的 maxmemorymaxmemory-policy息息相关。

maxmemory(最大内存设置)

最大内存设置,默认是注释的,表示不做任何限制,单位是byte字节。如果内存超出这个最大限制,Redis会根据配置的淘汰策略删除其他的KEY。

1
maxmemory <bytes>

maxmemory-policy(内存淘汰策略)

内存达到maxmemory上限的时候,触发的淘汰策略,默认使用的策略为:noeviction,即不做任何处理,这种情况,会直接提示写操作错误。

1
maxmemory-policy <策略>

注意:无论配置的是什么策略,都有可能不满足,所以,当没有合适的Key被逐出时,Redis都会在写入时返回操作错误

支持的淘汰策略

策略名称 策略描述
volatile-lru 仅限设置了失效时间的KEY,最近最少使用的
allkeys-lru 针对所有的KEY,最近最少使用的
volatile-lfu 仅限设置了失效时间的KEY,逐出使用频率最低的
allkeys-lfu 针对所有的KEY,逐出使用频率最低的
volatile-random 仅限设置了失效时间的KEY,随机逐出
allkeys-random 针对所有的KEY,随机逐出
volatile-ttl 仅限设置了失效时间的KEY,且优先逐出有效时间最短的(TTL)
noeviction 默认,不逐出任何内容,只返回一个写操作错误。

注:以上所有策略都不是精确算法,而是近似算法,这样做的目的是为了节省内存。

而且,可以通过maxmemory-samples参数来调整它的速度或准确度,默认值为:5,表示Redis将检查5个Key并选择一个是最符合逐出条件的key。

值越大,检测精准度越高,但速度就越慢。正常来说,建议默认5个效果比较居中。

1
maxmemory-samples 5