现象

项目中,redis的 key value 量太多,决定对某个db下的key进行删除,也就是Del key。
在删除前,通过info memory看下内存情况

Memory
used_memory:2205816296
used_memory_human:4.8G
used_memory_rss:5579214848
used_memory_rss_human:5.70G
...
...

通过一个小程序,一直删除可丢弃的key。
1小时后,过来一看:

Memory
used_memory:2205816296
used_memory_human:2.05G
used_memory_rss:5579214848
used_memory_rss_human:5.70G
...
...

发现redis内部的used_memory使用量已经下降到2.05G了,但是used_memory_rss(redis在系统中进程占用的内存量)并未降低。

原因

官方已经说了具体原因
https://redis.io/topics/memory-optimization
概括了点内容:

当键被删除时,Redis并不总是释放(返回)内存到操作系统。这并不是Redis的特别之处,但大多数malloc()实现都是这样工作的。

例如一个实例有5gb的数据,然后删除相当于2gb的数据,used_memory_rss可能仍会5 gb左右。这是因为底层分配器不能轻松地释放内存。例如,通常将删除的大多数键分配到与其他仍然存在的键相同的页面中。

然而分配器是聪明和能够重用空闲块的内存,所以在你释放2 gb的5 gb的数据集,当你开始再次增加键,您将看到used_memory_rss保持稳定而不会再增加很多。分配器基本上是尝试重用以前(逻辑上)释放的2GB内存。

解决方案

通过原因可以知道,我们其实不用去关注。
特别是我们定义了maxmemory后,并且定义了maxmemory_policy,那么即使内存满了,redis也会按照淘汰机制方案,清除一些不需要的key,来存放新的key。

但是如果已经影响到系统内存使用了,也有下面三种方案:

  1. 可以通过 MEMORY PURGE命令进行内存整理。(瞬时,能稍微腾出rss内存空间)
  2. 开启activedefrag,热碎片整理。(会占用CPU,在主线程执行,可以设置CPU占用率)
  3. 重启。

Redis删除(del)key后内存无法释放的原因和解决方案相关推荐

  1. redis删除指定key

    redis删除指定key 1.打开redis目录并打开redis-cli.exe 如果直接输入get key会出现以下问题,表示需要认证,也就是需要登录用户 使用auth password登录即可 然 ...

  2. redis缓存穿透,缓存击穿,缓存雪崩原因和解决方案

    redis缓存穿透,缓存击穿,缓存雪崩原因和解决方案 参考文章: (1)redis缓存穿透,缓存击穿,缓存雪崩原因和解决方案 (2)https://www.cnblogs.com/shisuiliun ...

  3. redis删除过期key的算法_面试官别再问我Redis内存满了该怎么办了

    概述 Redis的文章,我之前写过一篇关于「Redis的缓存的三大问题」,累计阅读也快800了,对于还只有3k左右的粉丝量,能够达到这个阅读量,已经是比较难了. 这说明那篇文章写的还过得去,收到很多人 ...

  4. Redis删除大Key

    原文链接:https://www.dubby.cn/detail.html?id=9112 这里说的大key是指包含很多元素的set,sorted set,list和hash. 删除操作,我们一般想到 ...

  5. php redis删除所有key,PHP 对 Redis key 值的操作

    1.DEL $redis = new redis(); $redis->connect('127.0.0.1',6379); // The first case 删除单独的 key $redis ...

  6. php redis删除所有key,redis中批量删除key的方法

    Redis是一个高性能的key-value数据库.redis中可以借助Linux的xargs指令来批量删除key,也可以使用flushdb和flushall命令删除所有key. 批量删除Key Red ...

  7. redis删除指定key中的指定元素

    ------------------------删除指定key-------------------------------- 127.0.0.1:6379> keys * 1) "_ ...

  8. redis删除指定key中的指定元素的方法

    查询所有key值 127.0.0.1:6379> keys *1) "_kombu.binding.celery.pidbox"2) "_kombu.binding ...

  9. redis删除指定key以及清空库

    1.执行whereis redis 查找redis安装路径 [root@zuj home]# whereis redis redis:/usr/local/redis 2.切换到redis脚本目录  ...

最新文章

  1. [推荐]Silverlight 2 开发者海报
  2. 教你如何找出 .NET 进程中的所有托管异常
  3. [20180602]函数与标量子查询3.txt
  4. 【青岛】12月16日.NETCore与AI技术交流会-等你来哦!!
  5. 监控mysql数据库里的数据_有谁知道哪种软件可以监控mysql数据库上执行的数据脚本吗?...
  6. 提升windows 2000的启动速度
  7. java log4j 热部署_JAVA类加载器分析--热部署的缺陷(有代码示例,及分析)
  8. mysql binlog-row-image=minimal_十一:参数binlog_row_image(笔记)
  9. Python游戏编程(一)“猜数字”游戏
  10. Whmcs、ZKEYS、星外、云谷IDCsystem、一对一、Swapidc哪个主机系统好用?
  11. mysql英文版怎么调中文_MySQL英文版的使用
  12. linux 开源网卡驱动,AMDGPU linux开源驱动
  13. JVM-垃圾回收机制
  14. 基于Node.js的3DTiles三维倾斜摄影模型爬虫
  15. 机房温度可视化:物联网下的数据中心环境运维新方式
  16. sshd: no hostkeys available — exiting
  17. 回家的票抢上了吗?聊聊12306为什么时不时要崩一下
  18. Android 在分享列表添加自己的应用
  19. 20世纪最伟大的十大算法
  20. leetcode简单之577.员工奖金

热门文章

  1. 猫扑网互动营销六大模式
  2. Azure VM加速网络
  3. 逆元 与等比数列求和
  4. 全球近90%的电影院现已对外开放;日本千叶将在东京奥运期间推出虚拟旅游 | 美通社头条...
  5. am超外差收音机matlab,超外差式AM/FM收音机的调试
  6. Oracle EBS财务模块(四)账套
  7. 2016年PMP考试时间安排
  8. 阿里巴巴为什么退市?阿里巴巴为什么退出香港股市?
  9. 「镁客早报」NASA公布“门户计划”,未来将在月球轨道建立空间站;特斯拉裁掉Model3交付部门一半以上...
  10. 张兴华:云端架构助力企业快速成长