Redis:内存陡增100%深度复盘

简介: cascsa

事故回溯总结一句话:

(1)因为大KEY调用量,随着白天自然流量趋势增长而增长,最终在业务高峰最高点期占满带宽使用100%。

(2)从而引发redis的内存使用率,在5min之内从0%->100%。

(3)最终全面GET SET timeout崩溃(11点22分02秒)。

(4)最终导致页面返回timeout。

未解之谜

疑问点:内存使用率100% 就等同于redis不可用吗?

解答:正常使用情况下,不是。

redis有【缓存淘汰机制】,Redis 在内存使用率达到 100% 时不会直接崩溃。相反,它依赖内存淘汰策略来释放内存,确保系统的稳定性。

学习更多:24 替换策略:缓存满了怎么办?

https://time.geekbang.org/column/article/294640

这个配置在哪里?

大部分同学都是不会主动去调整这里的参数的。

因此大概率默认的是:volatile-lru

  • 行为: 使用 LRU(Least Recently Used,最近最少使用)算法驱逐键。volatile-lru 仅驱逐设有过期时间的键,allkeys-lru 则驱逐所有键。
  • 适用场景: 缓存场景,不介意丢失一些数据。

确保你根据实际需求配置适当的内存淘汰策略,以便在内存达到上限时,系统能够稳定地处理新请求,而不会出现写操作失败的情况(只要不是noeviction)。

也就是说,照理SET GET都应该没啥问题才对(先不考虑其他复杂命令)。

  • 尽管 Redis 本身不会轻易崩溃,但如果内存耗尽且没有淘汰策略或者淘汰策略未能生效,Redis 可能拒绝新的写操作,并返回错误:OOM command not allowed when used memory > 'maxmemory'
  • 如果系统的配置或者操作系统的内存管理不当,可能会导致 Redis 进程被操作系统杀死。
相关文章
|
1天前
|
存储 C++
C++变量类型
C++变量类型包括基本类型如bool、char、int、float、double等,支持整数、浮点数、字符和布尔值的存储。还包含指针、数组、结构体、类、共用体等复合类型。变量命名由字母、数字、下划线组成,首字符须为字母或下划线。支持变量声明与定义分离,局部变量需显式初始化,静态变量自动初始化为0。
21 1
|
1天前
|
C++
C++变量作用域
C++变量作用域分为局部、全局、块和类作用域。局部变量在函数内定义,仅内部可用;全局变量在所有函数外定义,整个程序可访问;块作用域变量存在于代码块内;类作用域变量属于类成员。同名时,内层作用域覆盖外层。全局变量自动初始化,局部变量需手动初始化。
15 1
|
1天前
|
C++
解决Clion中写多个C++文件中存在多个main函数报错的问题
本文介绍如何在CLion中解决多个C++文件含main函数报错的问题。通过安装“C/C++ Single File Execution”插件,无需注释或新建项目,即可单独运行指定文件。配合右键操作与简单重构,实现高效刷题编码,方便文件管理与快速调试,提升开发效率。
20 1
|
1天前
|
SQL 缓存 Java
|
1天前
|
JSON 前端开发 Java
|
1天前
|
缓存 安全 Java
|
1天前
|
存储 SQL 关系型数据库
|
1天前
|
存储 安全 网络协议
|
1天前
|
机器学习/深度学习 存储 搜索推荐
|
1天前
|
存储 移动开发 前端开发