redis 设置过期Key 的 maxmemory-policy 六种方式
平时会用到redis 当缓存过多时会遇到下面的报错
OOM command not allowed when used memory > 'maxmemory'
这说明redis的缓存满了
我们可以通过修改过期策略来修改
cd /usr/local/redis/bin/ ./redis-cli 127.0.0.1:6379> info memory # Memory used_memory:123020456 used_memory_human:117.32M used_memory_rss:127684608 used_memory_rss_human:121.77M used_memory_peak:123522928 used_memory_peak_human:117.80M used_memory_peak_perc:99.59% used_memory_overhead:18968560 used_memory_startup:487136 used_memory_dataset:104051896 used_memory_dataset_perc:84.92% total_system_memory:1927262208 total_system_memory_human:1.79G used_memory_lua:37888 used_memory_lua_human:37.00K maxmemory:123000000 maxmemory_human:117.30M maxmemory_policy:noeviction mem_fragmentation_ratio:1.04 mem_allocator:jemalloc-4.0.3 active_defrag_running:0 lazyfree_pending_objects:0 127.0.0.1:6379> config set maxmemory-policy allkeys-lru
过期策略的具体方式。
redis 中的默认的过期策略是 volatile-lru 。
设置方式
设置内存淘汰策略
方式1:config set maxmemory-policy <策略>,设置后立即生效,不需重启Redis,但重启就失效;
方式2:修改Redis配置文件,设置maxmemory-policy <策略>,必须重启,配置永久生效。/usr/local/redis/etc/redis.conf
config set maxmemory-policy volatile-random
maxmemory-policy 六种方式
1、volatile-lru:只对设置了过期时间的key进行LRU(默认值)
2、allkeys-lru : 删除lru算法的key
3、volatile-random:随机删除即将过期key
4、allkeys-random:随机删除
5、volatile-ttl : 删除即将过期的
6、noeviction : 永不过期,返回错误
Redis系统提供五种淘汰策略,即参数maxmemory_policy有五种取值:
noeviction: 如果缓存数据超过了maxmemory限定值,并且客户端正在执行的命令会导致内存分配,则向客户端返回错误响应.
allkeys-lru: 所有的缓存数据(包括没有超时属性的和具有超时属性的)都参与LRU算法淘汰.
volatile-lru: 只有超时属性的缓存数据才参与LRU算法淘汰.
allkeys-random: 所有的缓存数据(包括没有超时属性的和具有超时属性的)都参与淘汰, 但是采用随机淘汰,而不是用LRU算法进行淘汰.
volatile-random: 只有超时属性的缓存数据才参与淘汰,但是采用随机淘汰,而不是用LRU算法进行淘汰.
volatile-ttl: 只有超时属性的缓存数据才参与淘汰. 根据缓存数据的超时TTL进行淘汰,而不是用LRU算法进行淘汰.
因为volatile-lru, volatile-random和volatile-ttl这三个淘汰策略使用的不是全量的缓存数据,有可能无法淘汰出足够的内存空间.
因为将缓存数据设置超时属性占用更多的内存, 因此,当内存压力比较大的时候,需要慎重考虑设置超时属性.
如果当前缓存的数据使用的内存大于配置的maxmemory,并且淘汰策略不允许释放内存(noeviction),则该函数返回失败.
接下来,局部变量mem_tofree表示需要淘汰的内存,局部变量mem_freed表示已经淘汰的内存.循环执行while (mem_freed < mem_tofree)淘汰缓存数据,该循环中的逻辑可以概括为:
从全局的0号数据库开始(Redis默认有16个全局的数据库),根据淘汰策略,选择该数据库中的哈希表.如果该哈希表为空, 选择下一个全局数据库.
根据淘汰策略,在相应哈希表中找到一个待淘汰的key, 从该数据库对象中删除该key所对应的缓存数据.
如果没有找到待淘汰的key,即无法淘汰所需的缓存数据大小 函数直接返回错误.
如果当前访问的是最后一个全局数据库, 并且已经淘汰了所需的缓存数据,则该函数成功返回.如果没有淘汰所需的缓存数据,则返回步骤1,并且从0号数据库重新淘汰.
如果当前访问的不是最后一个全局数据库, 则返回步骤1, 从当前数据库的下一个数据库继续淘汰缓存数据.
如果淘汰策略是allkeys-random或者volatile-random,则从相应数据库中随机选择一个key进行淘汰.
如果淘汰策略是allkeys-lru或者volatile-lru, 则根据配置的采样值maxmemory_samples,随机从数据库中选择maxmemory_samples个key, 淘汰其中热度最低的key对应的缓存数据.
如果淘汰策略是volatile-ttl,则根据配置的采样值maxmemory_samples,随机从数据库中选择maxmemory_samples个key,淘汰其中最先要超时的key对应的缓存数据.
所以采样参数maxmemory_samples配置的数值越大, 就越能精确的查找到待淘汰的缓存数据,但是也消耗更多的CPU计算,执行效率降低.
Redis缓存清理
2.登录redis:redis-cli -h 127.0.0.1 -p 6379
3.查看所有key值:keys *
4.删除指定索引的值:del key
5.清空整个 Redis 服务器的数据:flushall
6.清空当前库中的所有 key:flushdb
参考:https://blog.csdn.net/azurelaker/article/details/85045245