优化Redis缓存淘汰机制解决性能测试中报错率逐渐攀升问题
在某个查询场景的性能测试过程中,遇到了一个问题:测试过程中报错率逐渐攀升。进一步检查后发现,在查询业务所在应用的后台日志和平台应用的后台日志中,都出现了用户登录相关的报错信息。经过排查分析,发现了问题的根源,并做出了解决方案。
问题描述
在测试过程中,发现报错率逐渐增加,并且在后台日志中出现以下错误信息:
查询业务应用后台日志:
2023-08-25 19:37:49.629 xxx-web [019c40515a0854f4,019c40515a0854f4] [http-nio-9900-exec-576] ERROR [BaseService.java:249] - 调用平台权限接口失败,基础资料调用平台权限数据查询接口失败!
com.ufgov.ma.exception.MaException: 基础资料调用平台权限数据查询接口失败!
被调用的平台应用后台日志:
用户未登录或会话过期!
排查过程
进行了以下排查步骤来找到问题的根源:
- 完成9750个用户登录,并登入Redis集群,使用命令
keys userlogininfo:*查询。发现每个节点平均分配了3000多个用户的tokenid。 - 在执行业务压测时,观察到Redis缓存中的tokenid逐渐减少。
- 查看redis集群监控,内存达到上限。
- 检查Redis配置的缓存淘汰机制,发现设置为
volatile-lru,即在设置了过期时间的键空间中,优先移除最近未使用的key。
问题分析
通过以上排查过程,初步得出以下结论和分析:
- 用户登录时生成的tokenid被写入Redis缓存。
- 在业务场景压测过程中,大量的业务要素写入Redis缓存,导致内存占用逐渐增加。
- 当Redis达到内存上限时,根据缓存淘汰机制的设定,会删除最近未使用的key。
- 这就导致了用户的tokenid被误删,从而引发了报错和用户登录失效的问题。
解决思路
基于以上问题分析,提出了以下解决思路:
- 将Redis配置的缓存淘汰机制设置为
volatile-ttl,即在设置了过期时间的键空间中,具有更早过期时间的key优先移除。 - 调整tokenid的过期时间较长,同时将业务要素的过期时间调短。
- 进行再次压测,观察性能测试结果。
解决方案实施
按照上述解决思路进行实施:
- 将Redis配置的缓存淘汰机制设置为
volatile-ttl。 - 调整tokenid的过期时间为较长时间,例如86400秒(24小时),以确保用户登录信息在一定时间内不会被过期清理。
#session的超时时间默认86400秒(登录超过1天必须重新登录)
sessionTimeOut=86400
#userLoginInfo的超时时间默认14400秒(没有操作超过4小时需要重新登录)
userLoginInfoTimeOut=86400 - 同时,调整业务要素的过期时间为较短时间,以避免大量业务要素占用过多的内存资源(已设置为默认)。
- 再次进行性能测试,观察报错率和后台日志。
结果与总结
经过上述优化方案的实施,得到了以下结果和结论:
结果:
- 在再次执行压测后,我们观察到测试结果的报错率为0,并且应用后台日志中不再出现用户登录失效的报错信息,问题成功解决。
结论:
- 在高并发场景下,Redis的内存资源可能会因为大量业务要素的写入而达到上限。
- 使用缓存淘汰机制时,应根据业务需求调整设置,以确保重要数据的有效性和可用性。
- 调整tokenid的过期时间和业务要素的过期时间,可以有效减少缓存清理过程中用户登录信息被误删除的情况。
通过本次经验,我们了解到在进行性能测试或高并发压力测试时,需要充分考虑缓存管理的影响,并针对具体业务场景进行优化。同时,通过正确的排查和分析,结合合理的解决思路和方案,我们能够有效地解决问题并提升系统的稳定性和性能表现。
优化Redis缓存淘汰机制解决性能测试中报错率逐渐攀升问题的更多相关文章
- Redis 的缓存淘汰机制(Eviction)
本文从源码层面分析了 redis 的缓存淘汰机制,并在文章末尾描述使用 Java 实现的思路,以供参考. 相关配置 为了适配用作缓存的场景,redis 支持缓存淘汰(eviction)并提供相应的了配 ...
- Redis内存淘汰机制
转自:https://my.oschina.net/andylucc/blog/741965 摘要 Redis是一款优秀的.开源的内存数据库,我在阅读Redis源码实现的过程中,时时刻刻能感受到Red ...
- Redis 数据淘汰机制
为了更好的利用内存,使Redis存储的都是缓存的热点数据,Redis设计了相应的内存淘汰机制(也叫做缓存淘汰机制) 通过maxmemory 配置项来设置允许用户使用的最大内存大小,当内存数据集大小达到 ...
- Redis之Redis缓存管理机制
Redis缓存管理机制 目录 Redis缓存管理机制 缓存过期 && 缓存淘汰 缓存穿透 && 布隆过滤器 缓存击穿 && 缓存雪崩 总结 彩蛋 从博客 ...
- Redis过期--淘汰机制的解析和内存占用过高的解决方案
echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! Red ...
- Redis 缓存失效机制
Redis缓存失效的故事要从EXPIRE这个命令说起,EXPIRE允许用户为某个key指定超时时间,当超过这个时间之后key对应的值会被清除,这篇文章主要在分析Redis源码的基础上站在Redis设计 ...
- redis缓存处理机制
1.redis缓存处理机制:先从缓存里面取,取不到去数据库里面取,然后丢入缓存中 例如:系统参数处理工具类 package com.ztesoft.iotcmp.utils; import com.e ...
- Redis 内存淘汰机制
Redis内存淘汰指的是用户存储的一些键被可以被Redis主动地从实例中删除,从而产生读miss的情况,那么Redis为什么要有这种功能?这就是我们需要探究的设计初衷.Redis最常见的两种应用场景为 ...
- Redis 内存淘汰机制详解
一般来说,缓存的容量是小于数据总量的,所以,当缓存数据越来越多,Redis 不可避免的会被写满,这时候就涉及到 Redis 的内存淘汰机制了.我们需要选定某种策略将"不重要"的数据 ...
- SpringBoot缓存管理(三) 自定义Redis缓存序列化机制
前言 在上一篇文章中,我们完成了SpringBoot整合Redis进行数据缓存管理的工作,但缓存管理的实体类数据使用的是JDK序列化方式(如下图所示),不便于使用可视化管理工具进行查看和管理. 接下来 ...
随机推荐
- LLM探索:环境搭建与模型本地部署
前言 最近一直在炼丹(搞AIGC这块),突然发现业务代码都索然无味了- 上次发了篇AI画图的文章,ChatGPT虽然没法自己部署,但现在开源的LLM还是不少的,只要有一块差不多的显卡,要搞个LLM本地 ...
- 代码随想录算法训练营Day23 二叉树
代码随想录算法训练营 代码随想录算法训练营Day23 二叉树|669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 总结篇 669. 修剪二叉搜索树 题目链接 ...
- 在技术圈混,不知道这些你就 OUT 了
技术之路就是漫长的打怪升级,不断学习前人的踩坑经验才能提升自己,切忌闭门造车.所谓独乐乐不如众乐乐,强烈推荐以下公众号,让你的生活多点意思,希望小伙伴们能在 coding 的路上走的更远. OSC开源 ...
- 从 Blast2GO 本地化聊一聊 Linux 下 MySQL 的源码安装
Blast2GO 是一个基于序列相似性搜索的 GO 注释和功能分析工具,它可以直接统计分析基因功能信息,并可视化 GO 有向非循环图(DAG)上的相关功能特征,分析 BLAST.GO-mapping. ...
- Kubernetes(k8s)使用ingress发布服务
目录 一.系统环境 二.前言 三.Kubernetes ingress简介 四.Ingress vs NodePort vs LoadBalancer 五.安装部署Nginx Ingress Cont ...
- 使用 InstructPix2Pix 对 Stable Diffusion 进行指令微调
本文主要探讨如何使用指令微调的方法教会 Stable Diffusion 按照指令 PS 图像.这样,我们 Stable Diffusion 就能听得懂人话,并根据要求对输入图像进行相应操作,如: 将 ...
- MVCC并发版本控制之重点ReadView
MVCC并发版本控制 本文大部分来自<MySQL是怎样运行的>,这里只是简单总结,用于各位回忆和复习. 版本链 对于使用 InnoDB 存储引擎的表来说,它的聚簇索引记录中都包含两个必要的 ...
- mysql截取函数,拼接函数,大写函数例子
题目:这题目是牛客网sql题,因为牵扯到3个函数,都是自己没怎么用过的,所以记录一下. 答案:是别人的解题思路 可以看出在mysql中提供的函数可以供我们使用来操作字段,非常的方便
- Linux下ElasticSearch及IK分词插件安装
ElasticSearch及IK分词插件相关安装 一. 简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口. ...
- C# Collections
1. Generic 1.1 List<T> No need to say this is the most commonly used data structure in C# coll ...