文章目录

  • 报错信息
  • 处理方法
  • 1. 分析步骤
  • 2. 内存工具分析
  • 3. 动态改配置命令(无需重启)



目录

  1. 报错信息
  2. 清理方法
    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

deaver redis 驱动 redis activedefrag_数据集

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