文章目录
- 报错信息
- 处理方法
- 1. 分析步骤
- 2. 内存工具分析
- 3. 动态改配置命令(无需重启)
目录
- 报错信息
- 清理方法
2.1 binlog清理
2.2 relay log清理
报错信息
用户发现技术中台Redis内存一直在增长,一打到16G,需要分析内存具体使用情况。
处理方法
1. 分析步骤
- 1)执行命令查看
内存使用情况
和碎片率
info memory
关注一下:
used_memory_human:130.69M
used_memory_rss_human:10.90G
mem_fragmentation_ratio:85.42 碎片率
如果碎片率很高,需要清理,然后检查内存是否释放
config get activedefrag
设置自动清理
config set activedefrag yes
也可以手动清理:
memory purge
- 2)如果碎片率很低,查看一下内存淘汰机制
Redis内存达到上限时,有一个默认内存淘汰机制:
maxmemory-policy noeviction
maxmemory-policy一共有8个值,当内存不足时:
1、allkeys-lru:不管 key 是否设置了过期,淘汰最近最少访问的 key(建议使用)
2、volatile-lru:只淘汰最近最少访问、并设置了过期时间的 key
3、allkeys-random:不管 key 是否设置了过期,随机淘汰 key
4、volatile-random:只随机淘汰设置了过期时间的 key
5、allkeys-ttl:不管 key 是否设置了过期,淘汰即将过期的 key
6、noeviction:不淘汰任何 key,实例内存达到 maxmeory 后,再写入新数据直接返回错误
7、allkeys-lfu:不管 key 是否设置了过期,淘汰访问频率最低的 key(4.0+版本支持)(4.0以上建议使用)
8、volatile-lfu:只淘汰访问频率最低、并设置了过期时间 key(4.0+版本支持)
查看内存淘汰机制::
config get maxmemory-policy
设置:
config set maxmemory-policy allkeys-lru
注意:
如果key没有设置过期时间, volatile-lru、volatile-random、volatile-ttl 就无法执行了,和 noeviction 就一样了
释放过期 key 的内存,放到后台线程执行
config set lazyfree-lazy-expire yes
- 3)如果过期删除设置后,依然不明显,可以查看实例中 bigkey 的分布情况以及内存分配情况
redis-cli -h 127.0.0.1 -p 6379 --bigkeys -i 0.01
内存分析工具如下:
2. 内存工具分析
Redis内存分析工具常见是python写的 redis-rdb-tools 工具,和用golang写的 rdr 工具,这里我们只想分析 Redis 内存中哪个 Key 值占用的内存最多,分析出 Redis 内存中哪一类开头的 Key 占用最多,以及更好展示,使用rdr工具(https://github.com/xueqiu/rdr/releases/download/v0.0.1/rdr-linux)即可。
执行命令如下:
dump.rdb为redis生成的文件
./rdr-linux show -p 8080 dump.rdb
3. 动态改配置命令(无需重启)
设置最大内存
config set maxmemory 100000
设置淘汰策略
config set maxmemory-policy noeviction
内存淘汰策略
volatile-lru
从已设置过期时间的数据集(server.db[i].expires) 中挑选最近最少使用的数据淘汰。
allkeys-lru
从数据集(server.db[i].dict) 中挑选最近最少使用的数据淘汰
volatile-lfu
从设置了过期时间的数据集(server.db[i].expires) 中选择某段时间之内使用频次最小的键值对清除掉
allkeys-lfu
从所有的数据集(server.db[i].dict) 中选择某段时间之内使用频次最少的键值对清除
volatile-ttl
从已设置过期时间的数据集(server.db[i].expires) 中挑选将要过期的数据淘汰
volatile-random
从已设置过期时间的数据集(server.db[i].expires) 中任意选择数据淘汰
allkeys-random
从数据集(server.db[i].dict) 中任意选择数据淘汰
no-enviction