在某个查询场景的性能测试过程中,遇到了一个问题:测试过程中报错率逐渐攀升。进一步检查后发现,在查询业务所在应用的后台日志和平台应用的后台日志中,都出现了用户登录相关的报错信息。经过排查分析,发现了问题的根源,并做出了解决方案。

问题描述

在测试过程中,发现报错率逐渐增加,并且在后台日志中出现以下错误信息:

查询业务应用后台日志:

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: 基础资料调用平台权限数据查询接口失败!

被调用的平台应用后台日志:

用户未登录或会话过期!

排查过程

进行了以下排查步骤来找到问题的根源:

  1. 完成9750个用户登录,并登入Redis集群,使用命令keys userlogininfo:*查询。发现每个节点平均分配了3000多个用户的tokenid。
  2. 在执行业务压测时,观察到Redis缓存中的tokenid逐渐减少。
  3. 查看redis集群监控,内存达到上限。
  4. 检查Redis配置的缓存淘汰机制,发现设置为volatile-lru,即在设置了过期时间的键空间中,优先移除最近未使用的key。

问题分析

通过以上排查过程,初步得出以下结论和分析:

  • 用户登录时生成的tokenid被写入Redis缓存。
  • 在业务场景压测过程中,大量的业务要素写入Redis缓存,导致内存占用逐渐增加。
  • 当Redis达到内存上限时,根据缓存淘汰机制的设定,会删除最近未使用的key。
  • 这就导致了用户的tokenid被误删,从而引发了报错和用户登录失效的问题。

解决思路

基于以上问题分析,提出了以下解决思路:

  1. 将Redis配置的缓存淘汰机制设置为volatile-ttl,即在设置了过期时间的键空间中,具有更早过期时间的key优先移除。
  2. 调整tokenid的过期时间较长,同时将业务要素的过期时间调短。
  3. 进行再次压测,观察性能测试结果。

解决方案实施

按照上述解决思路进行实施:

  1. 将Redis配置的缓存淘汰机制设置为volatile-ttl
  2. 调整tokenid的过期时间为较长时间,例如86400秒(24小时),以确保用户登录信息在一定时间内不会被过期清理。
    #session的超时时间默认86400秒(登录超过1天必须重新登录)
    sessionTimeOut=86400
    #userLoginInfo的超时时间默认14400秒(没有操作超过4小时需要重新登录)
    userLoginInfoTimeOut=86400
  3. 同时,调整业务要素的过期时间为较短时间,以避免大量业务要素占用过多的内存资源(已设置为默认)。
  4. 再次进行性能测试,观察报错率和后台日志。

结果与总结

经过上述优化方案的实施,得到了以下结果和结论:

结果:

  • 在再次执行压测后,我们观察到测试结果的报错率为0,并且应用后台日志中不再出现用户登录失效的报错信息,问题成功解决。

结论:

  • 在高并发场景下,Redis的内存资源可能会因为大量业务要素的写入而达到上限。
  • 使用缓存淘汰机制时,应根据业务需求调整设置,以确保重要数据的有效性和可用性。
  • 调整tokenid的过期时间和业务要素的过期时间,可以有效减少缓存清理过程中用户登录信息被误删除的情况。

通过本次经验,我们了解到在进行性能测试或高并发压力测试时,需要充分考虑缓存管理的影响,并针对具体业务场景进行优化。同时,通过正确的排查和分析,结合合理的解决思路和方案,我们能够有效地解决问题并提升系统的稳定性和性能表现。

优化Redis缓存淘汰机制解决性能测试中报错率逐渐攀升问题的更多相关文章

  1. Redis 的缓存淘汰机制(Eviction)

    本文从源码层面分析了 redis 的缓存淘汰机制,并在文章末尾描述使用 Java 实现的思路,以供参考. 相关配置 为了适配用作缓存的场景,redis 支持缓存淘汰(eviction)并提供相应的了配 ...

  2. Redis内存淘汰机制

    转自:https://my.oschina.net/andylucc/blog/741965 摘要 Redis是一款优秀的.开源的内存数据库,我在阅读Redis源码实现的过程中,时时刻刻能感受到Red ...

  3. Redis 数据淘汰机制

    为了更好的利用内存,使Redis存储的都是缓存的热点数据,Redis设计了相应的内存淘汰机制(也叫做缓存淘汰机制) 通过maxmemory 配置项来设置允许用户使用的最大内存大小,当内存数据集大小达到 ...

  4. Redis之Redis缓存管理机制

    Redis缓存管理机制 目录 Redis缓存管理机制 缓存过期 && 缓存淘汰 缓存穿透 && 布隆过滤器 缓存击穿 && 缓存雪崩 总结 彩蛋 从博客 ...

  5. Redis过期--淘汰机制的解析和内存占用过高的解决方案

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! Red ...

  6. Redis 缓存失效机制

    Redis缓存失效的故事要从EXPIRE这个命令说起,EXPIRE允许用户为某个key指定超时时间,当超过这个时间之后key对应的值会被清除,这篇文章主要在分析Redis源码的基础上站在Redis设计 ...

  7. redis缓存处理机制

    1.redis缓存处理机制:先从缓存里面取,取不到去数据库里面取,然后丢入缓存中 例如:系统参数处理工具类 package com.ztesoft.iotcmp.utils; import com.e ...

  8. Redis 内存淘汰机制

    Redis内存淘汰指的是用户存储的一些键被可以被Redis主动地从实例中删除,从而产生读miss的情况,那么Redis为什么要有这种功能?这就是我们需要探究的设计初衷.Redis最常见的两种应用场景为 ...

  9. Redis 内存淘汰机制详解

    一般来说,缓存的容量是小于数据总量的,所以,当缓存数据越来越多,Redis 不可避免的会被写满,这时候就涉及到 Redis 的内存淘汰机制了.我们需要选定某种策略将"不重要"的数据 ...

  10. SpringBoot缓存管理(三) 自定义Redis缓存序列化机制

    前言 在上一篇文章中,我们完成了SpringBoot整合Redis进行数据缓存管理的工作,但缓存管理的实体类数据使用的是JDK序列化方式(如下图所示),不便于使用可视化管理工具进行查看和管理. 接下来 ...

随机推荐

  1. 2014年蓝桥杯C/C++大学B组省赛真题(李白打酒)

    题目描述: 题目描述 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱: 无事街上走,提壶去打酒. 逢店加一倍,遇花喝一斗. 这一路上,他一共遇到店 ...

  2. Linux系统 2023年5月1号

    今天正式进入了LINUX基础核心  下载了centos7.4镜像 和vmware12版本,还未安装vmware和centos镜像7.4

  3. 如何使用 Megatron-LM 训练语言模型

    在 PyTorch 中训练大语言模型不仅仅是写一个训练循环这么简单.我们通常需要将模型分布在多个设备上,并使用许多优化技术以实现稳定高效的训练.Hugging Face  Accelerate 的创建 ...

  4. Python 列表、字典、元组的一些小技巧

    1. 字典排序 我们知道 Python 的内置 dictionary 数据类型是无序的,通过 key 来获取对应的 value.可是有时我们需要对 dictionary 中的 item 进行排序输出, ...

  5. NLM 公布了一个新的重新设计的 PubMed 数据库

    经常使用 PubMed 的童鞋可能已经发现,美国国家医学图书馆(NLM)在今年 10 月份左右发布了一个新的重新设计的版本以取代 PubMed 数据库的现有版本,新版本现在已经上线,可以通过下面的链接 ...

  6. Linux安装MongoDB 4.0.3

    Linux安装MongoDB 4.0.3   1.准备 CentOS下安装MongoDB 官网提供windows.Linux.OSX系统环境下的安装包,这里主要是记录一下在Linux下的安装.首先到官 ...

  7. C++ Tips of the Week-01 string_view

    1: string_view ref https://abseil.io/tips/1 函数参数需要是一个字符串的时候,通常的实现有以下几种: // C Convention void TakesCh ...

  8. Task Execution and Scheduling In SpringBoot

    开天辟地 Task Execution and Scheduling In the absence of an Executor bean in the context, Spring Boot au ...

  9. Python Django 模版全解与实战

    本文首先介绍了Django模板系统的基础知识,接着探讨了如何安装和配置Django模板系统,然后深入解析了Django模板的基本结构.标签和过滤器的用法,阐述了如何在模板中展示模型数据,最后使用一个实 ...

  10. Vue-Element UI 文件上传与下载

    项目结构 后端 前端 效果演示 上传文件 下载文件 Code 后端代码 跨域 /** * 跨域配置 * @author Louis * @date Jan 12, 2019 */ @Configura ...