如何在redis中限制内存的使用大小

如何在redis中限制内存的使用大小?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

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

生产环境部署方式: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
maxmemory3221225472

设置redis数据过期策略:

redis中有6种过期策略:

#根据LRU算法生成的过期时间来删除
#volatile-lru->removethekeywithanexpiresetusinganLRUalgorithm
#根据LRU算法删除任何key。
#allkeys-lru->removeanykeyaccordinglytotheLRUalgorithm
#根据过期设置来随机删除key。
#volatile-random->removearandomkeywithanexpireset
#无差别随机删。
#allkeys-random->removearandomkey,anykey
#根据最近过期时间来删除(辅以TTL)
#volatile-ttl->removethekeywiththenearestexpiretime(minorTTL)
#谁也不删,直接在写操作时返回错误。
#noeviction->don'texpireatall,justreturnanerroronwriteoperations

在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中限制内存的使用大小

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

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注恰卡编程网行业资讯频道,感谢您对恰卡编程网的支持。

发布于 2021-05-10 20:34:13
收藏
分享
海报
0 条评论
163
上一篇:如何在python中使用flask编写一个接口 下一篇:python3如何获取文件中url内容并下载
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码