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 相关文章推荐
Redis5之后版本的高可用集群搭建的实现
Apr 27 Redis
Redis延迟队列和分布式延迟队列的简答实现
May 13 Redis
深入浅析Redis 集群伸缩原理
May 15 Redis
SpringBoot 集成Redis 过程
Jun 02 Redis
浅析Redis Sentinel 与 Redis Cluster
Jun 24 Redis
Redis 彻底禁用RDB持久化操作
Jul 09 Redis
Redis RDB技术底层原理详解
Sep 04 Redis
Redis模仿手机验证码发送的实现示例
Nov 02 Redis
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
Feb 12 Redis
Redis+Lua脚本实现计数器接口防刷功能(升级版)
Feb 12 Redis
解决linux下redis数据库overcommit_memory问题
Feb 24 Redis
Redis sentinel哨兵集群的实现步骤
Jul 15 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
使用 eAccelerator加速PHP代码的方法
2007/09/30 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
php 表单提交大量数据发生丢失的解决方法
2014/03/03 PHP
php通过文件流方式复制文件的方法
2015/03/13 PHP
PHP比较运算符的详细介绍
2015/09/29 PHP
选择复选框按钮置灰否则按钮可用
2014/05/22 Javascript
Jquery实现的简单轮播效果【附实例】
2016/04/19 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
各种选择框jQuery的选中方法(实例讲解)
2017/06/27 jQuery
vue proxyTable 接口跨域请求调试的示例
2017/09/12 Javascript
浅谈vuejs实现数据驱动视图原理
2018/02/23 Javascript
使用RxJS更优雅地进行定时请求详析
2019/06/02 Javascript
IE11下处理Promise及Vue的单项数据流问题
2019/07/24 Javascript
uploadify插件实现多个图片上传并预览
2019/09/30 Javascript
Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)
2020/05/15 Javascript
vue路由结构可设一层方便动态添加路由操作
2020/08/31 Javascript
快速了解Python相对导入
2018/01/12 Python
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
python中Lambda表达式详解
2019/11/20 Python
在django项目中导出数据到excel文件并实现下载的功能
2020/03/13 Python
Python如何发送与接收大型数组
2020/08/07 Python
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
洲际酒店集团英国官网:IHG英国
2019/07/10 全球购物
迪卡侬(Decathlon)加拿大官网:源自法国的运动专业超市
2020/11/22 全球购物
美国床垫连锁店:Mattress Firm
2021/02/13 全球购物
巴西购物网站:Onofre Agora
2020/06/08 全球购物
酒店端午节促销方案
2014/02/18 职场文书
大学生党员个人总结
2015/02/13 职场文书
倡议书格式及范文
2015/04/29 职场文书
国富论读书笔记
2015/06/26 职场文书
大学生社区义工服务心得体会
2016/01/22 职场文书
vue使用v-model进行跨组件绑定的基本实现方法
2021/04/28 Vue.js
在Spring-Boot中如何使用@Value注解注入集合类
2021/08/02 Java/Android
Python使用Web框架Flask开发项目
2022/06/01 Python