redis 限制内存使用大小的实现


Posted in Redis onMay 08, 2021

记录一次生产环境问题排查过程:

生产环境部署方式:nginx + uwsgi + flask

问题描述:

发现生产环境中之前正常运行的服务突然不可用了,查看程序日志发现部分接口访问时报I/O写错误,nginx acess.log显示504,error.log显示 upstream time out.
同时 netstat -apn | grep 6379 | wc -l 检查发现redis存在大量连接,进一步检查发现其中大多为 SYN_SENT 包,连接大多归属于uwsgi 进程。

  因为程序中有很多接口被调用是会访问redis, 以为是redis连接池导致,对程序中的redis连接池进行优化后重启服务,刚启动时一切正常,http 200, 但几分钟后服务再次挂掉,http 504.

检查系统资源使用情况,发现 kswapd0 进程CPU占用很高,这个进程是当物理内存不足时,会将一部分硬盘当做虚拟内存来使用, 使用swap分区与内存换页操作交换数据,导致CPU占用过高, 再细看发现redis-server内存占用已超过100%:

redis 限制内存使用大小的实现

进入redis中查看info memory和各存储数据的key下数据量,果然存在大量未处理完毕的数据。

到此问题终于是找到了。

设置redis最大占用内存

# 编辑redis配置文件,加入最大内存使用限制,我根据服务器的情况设置为3G
maxmemory 3221225472

设置redis数据过期策略:

redis中有6种过期策略:

# 根据LRU算法生成的过期时间来删除
# volatile-lru -> remove the key with an expire set using an LRU algorithm
# 根据LRU算法删除任何key。
# allkeys-lru -> remove any key accordingly to the LRU algorithm
# 根据过期设置来随机删除key。
# volatile-random -> remove a random key with an expire set
# 无差别随机删。
# allkeys-random -> remove a random key, any key
# 根据最近过期时间来删除(辅以TTL)
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# 谁也不删,直接在写操作时返回错误。
# noeviction -> don't expire at all, just return an error on write operations

在redis配置文件中设置过期策略为:maxmemory-policy allkeys-lru

  一开始是设置为volatile-lru的,但是该策略只是清除设置过期时间的key值,因为很多key并没有设置过期时间。因此修改为maxmemory-policy allkeys-lru,指明非活跃近期很少用的key值清除.

  在使用maxmemory-policy allkeys-lru策略时,内存超限后将不再存储数据,但数据的读取删除操作不会受影响,超限时显示错误

OOM command not allowed when used memory > 'maxmemory'

redis 限制内存使用大小的实现

重启程序,至此服务终于正常运行。

总结:本次的问题归根结底是redis中存储入了大量脏数据,但数据处理并没有及时的清理掉这部分数据,最终导致服务停滞,allkeys-lru策略有可能会将长期未用但实际有用的数据清理掉,所以还是应优化数据处理为主。

到此这篇关于redis 限制内存使用大小的实现的文章就介绍到这了,更多相关redis 限制内存内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
redis三种高可用方式部署的实现
May 11 Redis
Redis 配置文件重要属性的具体使用
May 20 Redis
浅谈Redis主从复制以及主从复制原理
May 29 Redis
使用Redis实现实时排行榜功能
Jul 02 Redis
CentOS8.4安装Redis6.2.6的详细过程
Nov 20 Redis
redis缓存存储Session原理机制
Nov 20 Redis
浅谈Redis跟MySQL的双写问题解决方案
Feb 24 Redis
redis数据结构之压缩列表
Mar 21 Redis
Redis 操作多个数据库的配置的方法实现
Mar 23 Redis
redis 解决库存并发问题实现数量控制
Apr 08 Redis
利用Redis实现点赞功能的示例代码
Jun 28 Redis
Redis过期数据是否会被立马删除
Jul 23 Redis
使用Redis实现秒杀功能的简单方法
Redis6.0搭建集群Redis-cluster的方法
May 08 #Redis
浅谈Redis存储数据类型及存取值方法
Redis IP地址的绑定的实现
May 08 #Redis
redis通过6379端口无法连接服务器(redis-server.exe闪退)
redis 查看所有的key方式
Redis5之后版本的高可用集群搭建的实现
You might like
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
PHP微信公众号开发之微信红包实现方法分析
2017/07/14 PHP
jQuery温习篇 强大的JQuery选择器
2010/04/24 Javascript
jQuery Selector选择器小结
2010/05/06 Javascript
IE8 chrome中table隔行换色解决办法
2010/07/09 Javascript
关于window.pageYOffset和document.documentElement.scrollTop
2011/04/05 Javascript
ASP.NET jQuery 实例3 (在TextBox里面阻止复制、剪切和粘贴事件)
2012/01/13 Javascript
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
js动态修改input输入框的type属性(实现方法解析)
2013/11/13 Javascript
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
2014/09/26 NodeJs
jquery实现简单的表单验证
2015/11/17 Javascript
JavaScript小技巧整理
2015/12/30 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
第一个Vue插件从封装到发布
2017/11/22 Javascript
Vue修改mint-ui默认样式的方法
2018/02/03 Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
2018/09/07 Javascript
vuex提交state&&实时监听state数据的改变方法
2018/09/16 Javascript
对VUE中的对象添加属性
2018/09/18 Javascript
angular5 子组件监听父组件传入值的变化方法
2018/09/30 Javascript
微信小程序实现订单倒计时
2020/11/01 Javascript
js+canvas实现两张图片合并成一张图片的方法
2019/11/01 Javascript
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
2019/11/04 Javascript
Python 正则表达式(转义问题)
2014/12/15 Python
Python基于opencv的图像压缩算法实例分析
2018/05/03 Python
python保存网页图片到本地的方法
2018/07/24 Python
python requests 库请求带有文件参数的接口实例
2019/01/03 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
Django项目之Elasticsearch搜索引擎的实例
2019/08/21 Python
python实现KNN近邻算法
2020/12/30 Python
英国在线滑雪板和冲浪商店:The Board Basement
2020/01/11 全球购物
中医药大学市场营销专业自荐信
2013/09/29 职场文书
中层干部考核评语
2015/01/04 职场文书
小学元宵节活动总结
2015/02/06 职场文书
使用javascript解析二维码的三种方式
2021/11/11 Javascript
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
2022/04/11 Vue.js