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安装启动及常见数据类型
Apr 14 Redis
详解RedisTemplate下Redis分布式锁引发的系列问题
Apr 27 Redis
Redis延迟队列和分布式延迟队列的简答实现
May 13 Redis
Redis 配置文件重要属性的具体使用
May 20 Redis
Java Socket实现Redis客户端的详细说明
May 26 Redis
详解Redis基本命令与使用场景
Jun 01 Redis
Redis做数据持久化的解决方案及底层原理
Jul 15 Redis
Redis中一个String类型引发的惨案
Jul 25 Redis
Redis监控工具RedisInsight安装与使用
Mar 21 Redis
详解Redis的三种常用的缓存读写策略步骤
May 06 Redis
Redis特殊数据类型HyperLogLog基数统计算法讲解
Jun 01 Redis
Redis实现主从复制方式(Master&Slave)
Jun 21 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
php读取文件内容到数组的方法
2015/03/16 PHP
php实现求相对时间函数
2015/06/15 PHP
PHP实现可自定义样式的分页类
2016/03/29 PHP
php版微信自定义回复功能示例
2016/12/05 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
IE中jscript/javascript的条件编译
2006/09/07 Javascript
一个简单的js动画效果代码
2010/07/20 Javascript
jQuery Form 页面表单提交的小例子
2013/11/15 Javascript
javascript获取select值的方法分析
2015/07/02 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
2015/11/25 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
BootStrap Table对前台页面表格的支持实例讲解
2016/12/22 Javascript
AngularJS表格添加序号的方法
2017/03/03 Javascript
浅谈Angular2 模块懒加载的方法
2017/10/04 Javascript
Angular7.2.7路由使用初体验
2019/03/01 Javascript
Vue动态生成表格的行和列
2019/07/18 Javascript
Net微信网页开发 使用微信JS-SDK获取当前地理位置过程详解
2019/08/26 Javascript
vue实现页面内容禁止选中功能,仅输入框和文本域可选
2019/11/09 Javascript
Jquery+javascript实现支付网页数字键盘
2020/12/21 jQuery
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
Python中内置数据类型list,tuple,dict,set的区别和用法
2015/12/14 Python
Python socket实现的简单通信功能示例
2018/08/21 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
2018/12/22 Python
简单了解Django ORM常用字段类型及参数配置
2020/01/07 Python
OpenCV读取与写入图片的实现
2020/10/13 Python
加拿大时尚少女服装品牌:Garage
2016/10/10 全球购物
Europcar葡萄牙:葡萄牙汽车和货车租赁
2017/10/13 全球购物
英国奢侈皮具品牌:Aspinal of London
2018/09/02 全球购物
天游软件面试
2013/11/23 面试题
招标保密承诺书
2015/01/20 职场文书
学生保证书格式
2015/02/27 职场文书
2015年教师节演讲稿范文
2015/03/19 职场文书
小程序教您怎样你零成本推广获取数万用户的方法
2019/07/30 职场文书
创作书写之导游词实用技巧分享(干货)
2019/12/20 职场文书
Vue实现tab导航栏并支持左右滑动功能
2021/06/28 Vue.js
一篇文章带你复习java知识点
2021/06/28 Java/Android