redis引发的一次生产事故,内存爆满

redis引发的一次生产事故

问题描述:

  • 发版后回归测试,不定时出现token失效,导致自动退出到登录界面。
  • 如果操作的人员较多,token失效的就比较快,操作的人员较少token失效的相对较慢。

问题复现:

  • 同一账号多人操作:很快就会出现token失效
  • 不同账号多人操作:很快就会出现token失效
  • 单个账号操作:较长时间出现token失效

问题排查:

  • 检查和token相关的一系列配置,查看是否配置问题
  • token的有效时长:设置的是48小时-----正常
  • 是否允许多个登录:设置允许多方登录-----正常
  • token是存储于redis缓存中的,重新登录,检查生成的token是否正常存储于redis。redis中新生成的token的过期时间是48小时左右,所以可以排除自身到期淘汰的原因。
  • 让开发人员检查代码中是否有token相关的操作。
  • 都不是这些原因,所有能想到的都已经排除了,真的头大。
  • 再次让业务人员一起操作,然后我也登录,记录自己的token ,redis中token信息一切正常,再次退出登录的时候发现redis中这个token也消失了。
  • 这时候可以确定 是redis中的token丢失而导致失效,从而退出登录。
  • 至于为什么会丢失,还是没有头绪。

确认原因

  • 然后问了下运维同事,帮忙看看redis有什么特殊的情况,这一看就有结果了:redis内存基本快满了,而且没有做预警,大家都不知道。

  • 查了下有什么大key或者热key占用了这么多的内存

  • 在这里插入图片描述

  • 发现系统中另一个服务占用了redis极大的内存,如下

  • 在这里插入图片描述

  • 这个服务是公司基础架构的服务,里面的功能日志是通过redis模式传输的,然后在读取redis落库以达到异步解耦。落库成功就会删除redis, 而且有个定时任务负责落库,删除redis。而我们因为不了解细节 没有启用这个定时任务(也可以说压根不知道这玩意的存在),才导致了这个结果。

  • 为什么就不能设置一个过期时间呢,为什么!

  • 直接让运维同事删除这些缓存,然后多人操作系统 再试试是否会出现token失效,结果是一切正常,也不会退出登录了。

为什么

  • redis内存不足,为什么会删除我的数据而不是报写入错误呢

  • 这个就和redis的内存淘汰策略有关了, redis默认的淘汰策略是noeviction 不淘汰数据,新增或者修改操作抛异常,而我们的环境设置的是volatile-lru

  • redis是内存工具,所以在内存快要用完的时候,怎么去取舍已存入的数据和即将要存入的数据,redis官方提供了8种淘汰策略,配置是maxmemory-policy

  • 所有的策略如下

  • volatile-lru:在设置过期时间的数据中淘汰最少使用的数据。

  • allkeys-lru:在所有的数据中淘汰最少使用的数据。

  • volatile-lfu:在设置过期时间的数据中淘汰使用频率最低的数据。

  • allkeys-lfu:在所有的数据中淘汰使用使用频率最低的数据。

  • volatile-random:在设置过期时间的数据中淘汰任意随机数据。

  • allkeys-random:在所有的数据中随机淘汰数据。

  • volatile-ttl:在设置过期时间的数据中淘汰最早过期的数据。

  • noeviction:默认策略,不淘汰数据,新增或者修改数据会抛异常,但是读操作正常进行,不受影响

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/173140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeeCode】*904.水果成篮

你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果&…

《C++PrimePlus》第10章 对象和类

10.1 过程性编程和面向对象编程 10.2 抽象和类 10.3 类的构造函数和析构函数 类的定义和使用&#xff08;买卖股票&#xff09; 头文件stock10.h #ifndef __STOCK00__H__ #define __STOCK00__H__#include <string>class Stock { // pravate的内容只能通过public访问 p…

简易地铁自动机售票系统实现(C++)

该程序具有以下功能 (1) 一个地铁路线类 Router&#xff0c;包含路线编号&#xff0c;途中的各个站点。可以新增、删除、查询路线&#xff0c;可以根据线路名称&#xff0c;显示线路图片。 (2) 一个地图类 Map&#xff0c;可以显示所有可以乘坐的地铁站名&#xff0c;以及线路…

leetcode 不同的二叉搜索树

给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5 示例 2&#xff1a; 输入&#xff1a;n 1 输出&#xff1a;…

MybatisBatchUtils功能介绍

MybatisBatchUtils 是一个 MyBatis 框架的工具类&#xff0c;主要用于简化 MyBatis 中批量操作的代码编写。该工具类封装了 MyBatis 中的批量操作方法&#xff0c;可以方便地进行批量插入、更新和删除等操作。 一般来说&#xff0c;使用 MyBatis 进行批量操作需要先设置 JDBC 驱…

展锐Android10,R,lmk怎么添加白名单

展锐Android10,R,lmk怎么添加白名单 低内存lmk时,怎么添加白名单 [ANSWER] 如果要保活进程,使之不被lowmemorykiller杀掉,可以将要保活的进程加到白名单中: lmkd_param.conf文件是lmkd杀进程的白名单配置文件,其中配置的应用是不会被lmkd杀掉的 请在device/sprd目录中…

js用到的算法

1.对象数组中&#xff0c;对象中有对象&#xff0c;数组根据对象中的对象打平 [{indexValueMap: { 68443: 0, 68457: 0 },rowName1: 固定收益类,rowName2: 交易类,rowName3: 次级},{indexValueMap: { 68443: 0, 68457: 0 },rowName1: 固定收益类,rowName2: 交易类,rowName3: 中…

虚幻学习笔记—点击场景3D物体的两种处理方式

一、前言 本文使用的虚幻引擎为5.3.2&#xff0c;两种方式分别为&#xff1a;点击根物体和精准点击目标物体。 二、实现 2.1、玩家控制器中勾选鼠标点击事件&#xff1a;这一步很重要&#xff0c;如图2.1.1所示&#xff1a;在自定义玩家控制器中勾 图2.1.1 选该项&#xff0c…

nacos集群开箱搭建-linux版本搭建

原创/朱季谦 nacos是一款易于构建云原生应用的动态服务发现、配置管理和服务管理平台&#xff0c;简单而言&#xff0c;它可以实现类似zookeeper做注册中心的功能&#xff0c;也就是可以在springcloud领域替代Eureka、consul等角色&#xff0c;同时&#xff0c;还可以充当spri…

C 文件 fseek() 函数

C 文件 fseek() 函数 fseek()函数用于将文件指针设置为指定的偏移量。它用于将数据写入文件中所需的位置。 语法&#xff1a; int fseek(FILE *stream, long int offset, int whence)参数 第一个参数 stream 为文件指针 第二个参数 offset 为偏移量&#xff0c;整数表示正向…

activiti工作流 定义 TaskListener 无效

使用activiti 5.22 想全局定义任务监听器&#xff0c;结果试了多次发现没有效果。 最后看了看activiti的相关源码发现&#xff0c;流程定义里边没有处理 TaskListener 相关的操作&#xff0c;发现TaskListener 处理是在Task里边处理的&#xff0c;所以把TaskListener 定义在Ta…

【ISP】噪声--sensor(2)

1.热噪声 也叫KT/C噪声&#xff0c;或者叫暗电流噪声。电子的热运动的导致&#xff0c;温度上升&#xff0c;噪声增大。 2.FPN固定模式噪声 由于每个像素点的元器件制造的会有偏差&#xff0c;也就是这些器件的工作参数相对理论值的漂移就构成一种固定模式噪声。 3.光子散粒噪…

Springboot+vue的客户关系管理系统(有报告),Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的客户关系管理系统&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的客户关系管理系统&#xff0c;采用M&#xff08…

fastjson和jackson序列化的使用案例

简单记录一下一个fastjson框架和jackson进行序列化的使用案例&#xff1a; 原json字符串&#xff1a; “{“lockCount”:”{1:790,113:1,2:0,211:0,101:1328,118:8,137:0,301:0,302:0}“,“inventoryCount”:”{1:25062,113:2,2:10000,211:2,101:11034,118:9,137:40,301:903914…

Python实现定时任务的方案及其比较

目录 一、引言 二、基于time模块的定时任务 三、基于schedule库的定时任务 四、基于APScheduler库的定时任务 五、基于Celery库的定时任务 七、总结与比较 一、引言 在Python中&#xff0c;定时任务指的是在特定的时间间隔或者特定的时间点自动执行某些操作的任务。定时…

十大排序之冒泡排序与快速排序(详解)

文章目录 &#x1f412;个人主页&#x1f3c5;算法思维框架&#x1f4d6;前言&#xff1a; &#x1f380;冒泡排序 时间复杂度O(n^2)&#x1f387;1. 算法步骤思想&#x1f387;2.动画实现&#x1f387; 3.代码实现&#x1f387;4.代码优化&#xff08;添加标志量&#xff09; …

前端向后端传JSON数据,使用MyBatis查询

form中向后端传的是空字符串&#xff0c;并不是null 而在MyBatis的判断中应判断是否为空字符串&#xff0c;而并非null

【Rxjava详解】(四)线程切换

lift()变换原理 这些变换虽然功能各有不同&#xff0c;但实质上都是针对事件序列的处理和再发送。而在RxJava的内部&#xff0c;它们是基于同一个基础的变换方法&#xff1a;lift()。 首先看一下lift() 的内部实现&#xff08;仅显示了部分主要逻辑代码): public <R> …

Kubernetes之kubeadm集群部署篇—系统初始化

文章目录 操作系统初始化配置1.1 设置主机名1.2 设置hosts解析主机名1.3 关闭SELinux和防火墙1.4 关闭swap1.5 设置系统参数1.6 设置节点间的SSH免密码登录1.7 配置docker 操作系统初始化配置 1.1 设置主机名 根据规划设置主机名 &#xff08;所有节点&#xff09; hostname…

盘点43个Android项目源码安卓爱好者不容错过

盘点43个Android项目源码安卓爱好者不容错过 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 链接&#xff1a;https://pan.baidu.com/s/1yHmkUeX4vxVag9Yr0yeQRg?pwd8888 提取码&#xff1a;8888 项目名称 Android NDK直播项…