Redis——内存淘汰策略

发布时间 2023-04-01 12:00:27作者: shog808

一、缓存耗尽的原因

1、每台机器的内存是一定的

2、key未设置过期时间

key不设置过期时间则在内存中一直存在,直到我们明确删除它。

3、过度或不合理的持久化

无论RDB快照或者AOF日志,都会在内存和磁盘中反复操作,需要一定的内存空间。

4、不及时清理过期缓存

有时过期缓存依旧存在,主要和缓存清理方式有关:

  • 主动定期删除  Redis默认每隔1s运行10次,每次随机抽取部分设置过期时间的key,检查是否过期,如果过期则删除key,直至过期的key比率低于1/4
  • 被动惰性删除  当客户端查询该key时,检查key是否过期,如果过期则删除key重新获取。

5、不合理不规范使用缓存

过度使用缓存,冷热数据不分;缓存过多或单个缓存value过大;缓存过期时间设置过长

二、淘汰策略

分三类:

  • 不淘汰而是直接拒绝写入新key (默认):1
  • 从设置了过期时间的key中淘汰: 2、3、4、5
  • 从所有key中淘汰: 6、7、8

1、noeviction

当写入新数据后的内存超过限定值时,写请求直接返回错误,只读请求可以正常执行,默认策略。

2、volatile-lru

当写入新数据后的内存超过限定值时,从设置了过期时间的key中使用LRU算法淘汰最久没有使用过的key。

LRU(Least Recently Used)

3、volatile-lfu

当写入新数据后的内存超过限定值时,从设置了过期时间的key中使用LFU算法淘汰使用频率最低的key。

LFU(Least Frequently used)

4、volatile-random

当写入新数据后的内存超过限定值时,从设置了过期时间的key中随机淘汰key。

5、volatile-ttl

当写入新数据后的内存超过限定值时,从设置了过期时间的key中根据过期时间淘汰key,越快过期越早淘汰。

6、allkeys-lru

当写入新数据后的内存超过限定值时,从所有key中使用LRU算法(最近最少使用算法)淘汰最久没有使用过的key。

7、allkeys-lfu

当写入新数据后的内存超过限定值时,从所有key中使用LFU算法(最少频率访问算法)淘汰使用频率最低的key。

8、allkeys-random

当写入新数据后的内存超过限定值时,从所有key中随机淘汰key

三、策略相关命令

#获取当前内存淘汰策略
redis > config get maxmemory-policy

#获取Redis能使用的最大内存大小:如果不设置最大内存大小或者设置为0,在64位操作系统#下不限制内存大小,在32位操作系统下最多使用3G
redis > config get maxmemory

#通过命令设置淘汰策略
redis > config set maxmemory-policy volatile-lru

#设置Redis最大占用内存大小
redis > config set maxmemory 2048mb