当前位置:首页 > 技术分享 > 正文内容

redis 设置过期Key 的 maxmemory-policy 六种方式

admin5个月前 (12-18)技术分享435

平时会用到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 。

设置方式   

config set maxmemory-policy volatile-lru

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缓存清理

1.访问redis根目录    cd  /usr/local/redis-2.8.19

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


扫描二维码推送至手机访问。

版权声明:本文由小刚刚技术博客发布,如需转载请注明出处。

本文链接:http://blog.bitefu.net/post/220.html

分享给朋友:

相关文章

Linux/centos inode 占用100%的解决办法

当你的 Linux 系统无法创建新文件时,有可能是你的磁盘满了,还有可能是你的磁盘的 inode 用光了,我们今天要说的就是后一种情况,要解决这个问题,只能是删除一些文件,但是一般情况下,其实是你的系统中的某个地方产生了大量的你并不需要的文...

Windows 11 LTSC 数字激活方法/HEU KMS Activator 数字激活/LTSC公key激活

Windows 11 LTSC 数字激活方法/HEU KMS Activator 数字激活/LTSC公key激活

Windows 11 Pro 转换成 Windows 11 Enterprise LTSC(Windows 11 企业版 LTSC) 并获得数字激 活方法1. 在Win11 Pro 中 导入LTSC 数字激 活证书:将 Windows LT...

mysql批量替换 语法

UPDATE `table_name` SET `field_name` = replace (`field_name`,'from_str','to_str') WHERE `field_name` LIK...

[经验分享] 20个短视频素材网站

1、Coverr:(https://coverr.co)很好很强&#12068;的免费视频素材&#12153;站,海量库存,每周 持续更新7条精美视频。2、Pexels:(https://www.pexels.com)这是我...

Chrome 开启自带多线程下载支持 提升下载速度

Chrome 开启自带多线程下载支持 提升下载速度

Chrome 是当前性能最高的浏览器之一,但在下载速度方面,Chrome 可一点都不快。当前 Chrome 的下载仍是单线程机制,速度非常慢。对此,大家不得不使用第三方的下载工具,例如迅雷、IDM 等支持多线程下载的下载软件,来提高下载速度...

安卓模拟器连接端口 及常用命令

下面是我总结和测试通过的:有的是搜集来的模拟器名称                     &nbs...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。