当前位置: 首页 > news >正文

如何测试 Redis 缓存?

作者:陈霞 毕小烦

欢迎订阅我的新专栏《现代命令行工具指南》,精讲目前最流行的开源命令行工具,定能大大提升你的工作效率。

简单了解一下 Redis

Redis(Remote Dictionary Server,远程字典服务)是一个速度非常快的非关系数据库

它可以存储键值对,支持的 5 种数据类型分别是:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合)。

它可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片来扩展写性能。

Redis 主要用在什么地方呢?

主要用于:
缓存、数据共享分布式、分布式锁、全局 ID、计数器、限流、购物车、消息队列、抽奖、点赞、签到、打卡等场景。

本文我们主要关注缓存的测试。

为什么要使用缓存?

当然是为了快和省。

快是因为业务系统的数据处理结果暂时存在内存中,下次访问时直接从内存取出,所以会很快。省是节省数据的处理流程及服务器的资源消耗。

所以,什么时候使用缓存呢?

当业务出现性能瓶颈时(比如 QPS 较高/对 RT 有要求或服务器/DB 性能较差),可以考虑使用缓存来提升系统性能。

Redis 缓存怎么用?

Redis 一般和其他数据库(如:MySQL)搭配使用,用来减轻后端数据库的压力。

如下所示:

Redis 会把 MySQL 中经常被查询的数据缓存起来,这样当用户来访问的时候,直接从 Redis 中获取缓存的数据就可以了。

如果 Redis 中没有用户所要查询的数据,就会去 MySQL 查询,当数据返回给客户端时,同时也会将数据缓存到 Redis 中,下次就可以直接从 Redis 中获取了。

如何测试 Redis 缓存?

我们在测试 Redis 缓存时,测试思路跟测试业务功能类似,主要从评审、测试、监控三个方面来进行设计。

下面是一些思路。

1. 评审设计的合理性

  • 确认缓存的应用场景:
    • 评估业务场景是否真的需要使用缓存;
    • 评估 Redis 与 DB 数据短暂不一致对业务的影响。
  • 规范键值对的设计:
    • key:
      • 一般使用业务名或数据库名作为前缀,以冒号(:)分隔来构造 key 名,不使用含义不清的 key 或特别长的 key;
      • 命名中只能出现小写字母、数字、点(.)和冒号(😃。不要包含特殊字符,如下划线、空格、换行、单双引号以及其他转义字符;
    • value:
      • 禁止超过 10KB 的 String 类型的大 key,防止网卡流量、慢查询。
      • 非 String 类型的大 key,不要使用 del 删除,要使用 hscan、sscan、zscan 方式渐进删除。
  • 选择合适的缓存模式:
    • 旁路缓存模式/读写穿透模式/异步缓存写入
  • 确认缓存的更新策略:
      1. 先更新数据库,再更新缓存;
      1. 先更新缓存,再更新数据库;
      1. 先淘汰缓存,再更新数据库;
    • 4. 先更新数据库,再淘汰缓存。(推荐)
  • 确认缓存的过期机制:
    • 主动的定期删除/被动的惰性删除
  • 是否有缓存预热机制:
    • 数据量不大的时候可以不进行缓存预热,或者可以在项目启动的时候自动进行加载。
    • 数据量很大的时候,一定要保证热点数据提前加载到缓存。
  • 确认缓存的淘汰策略:
    • 淘汰最久没有使用的数据:LRU(Least Recently Used)
    • 淘汰最不频繁使用的数据:LFU(Least Frequently Used)
    • 淘汰最先放入缓存的数据:FIFO (first in first out)
  • 评估业务所需缓存空间大小
  • 缓存时间设置合理性:
    • 缓存时间太长会导致用户访问到的数据一直是老的,缓存设置时间太短对数据库访问会比较频繁,所以要设置合理,最好清楚实际数据更新的频次后再设置。

2. 校验缓存的正确性

验证基本功能

  • 缓存增加:
    • 增加缓存,校验功能和数据是否正确,DB 中的数据跟 Redis 是否一致,缓存过期时间与设计是否一致;
  • 缓存更新:
    • 更新缓存,校验功能和数据是否正确,DB 中的数据跟 Redis 是否一致;缓存过期时间与设计是否一致;
    • 对同一条数据并发执行更新和查询操作,校验功能和数据是否正确,DB 中的数据跟 Redis 是否一致;缓存过期时间与设计是否一致;
  • 缓存删除:
    • 删除缓存,校验功能和数据是否正确,再次请求,缓存是否被正确写入,DB 中的数据跟 Redis 是否一致;
  • 缓存过期:
    • 设置 Redis 过期时间,校验缓存是否正常过期失效。再次写入缓存,缓存过期时间被更新。(可通过修改服务器时间或手动修改缓存的 TTL)
  • 缓存读取:
    • 校验数据在缓存和 DB 中都存在时,系统功能是否正常;
    • 校验数据在 DB 存在,但缓存中不存在时,系统功能是否正常;
    • 校验数据在缓存和 DB 中都不存在时,系统功能是否正常;
    • 验证 DB 返回的数据异常时,没有去缓存;

验证特殊场景

  • 缓存超时:
    • 校验缓存查询达到超时时间后,未返回指定的数据,对系统的影响。
  • 缓存穿透:
    • 不断查询一个 DB 和缓存中一定不存在的数据,验证返回数据为空。
  • 缓存雪崩:
    • 校验缓存是否采用了相同的过期时间。如果缓存大指量同时失效,验证系统功能是否正常,性能指标是否正常。
  • 缓存击穿:
    • 缓存中的数据没有人查询过 ,第一次就大并发的访问;
    • 缓存中的某条数据刚好失效后,就进行大并发访问,校验功能是否正常,各项性能指标是否正常。
  • 缓存预热:
    • 大批量缓存在同一时间点过期,验证缓存预热耗时及预热时机。
    • 在缓存预热期间请求更新接口和查询接口,验证返回数据的正确性。
  • 缓存上限:
    • 校验缓存淘汰参数配置与预期一致:增加缓存至达到 maxmemory 限制时(可修改 redis.conf 配置文件中配置的最大可用内存值),再次请求查询,数据返回正确,且缓存淘汰正确。
  • 缓存停服:
    • 校验关闭缓存服务后,系统功能和性能的运行情况。
    • 验证重启 Redis 服务后,请求查询返回的数据正确,DB 中的数据跟 Redis 一致。
  • 测试并发:
    • 并发请求缓存中有的数据,校验返回数据是否正确,各项性能指标是否正常。
    • 并发请求缓存中没有但 DB 中有的数据,校验返回数据是否正确,各项性能指标是否正常。
    • 并发请求缓存中没有 DB 中也没有的数据,校验返回数据是否为空,各项性能指标是否正常。
  • 性能测试:一般用 redis-benchmark 测试一些场景的性能基准,比如:
    • 对比单机和集群 Redis 吞吐量;
    • 评估不同类型的存储性能;
    • 对比开启和关闭持久化的吞吐量;
    • 对比调优前后的吞吐量;
    • 对比不同版本的 Redis 的吞吐量;

3. 监控线上的稳定性

  • 监控缓存的命中率:评估缓存的设计是否达到预期;
  • 监控中间件:CPU、内存是否异常;
  • 监控是否有某个 key 过大;
  • 监控是否存在缓存的频繁更新。

思维导图如下所示:

Redis 管理工具有哪些?

为了更好的测试 Redis,我们需要一些好用的管理工具,下面推荐 4 款免费开源的。

1. AnotherRedisDesktopManager

image.png
Another Redis Desktop Manager 是一款非常好用的 Redis 可视化管理工具,开源免费,兼容 Windows、macOS 和 Linux,性能出众。

开源地址:
https://github.com/qishibo/AnotherRedisDesktopManager/

2. QuickRedis

image.png
QuickRedis 是也是一款非常好用的 Redis 可视化管理工具。开源免费,兼容 Windows、macOS 和 Linux。它支持直连、哨兵、集群模式,支持亿万数量级的 key。

开源地址:
https://github.com/quick123official/quick_redis_blog

3. IRedis

image.png
IRedis 是一个支持自动补全和语法高亮 的 Redis 命令行工具,可用来替代 redis-cli。使用 IRedis 可以流畅地输入 Redis 命令,显示结果也非常友好。

开源地址:
https://github.com/laixintao/iredis

4. Redis Commander

image.png
Redis Commander 是一款用 node.js 编写的 Redis 网页管理工具。

开源地址:
https://github.com/joeferner/redis-commander

参考资料

  • 《Redis实战》

(完)

如果文章对你有帮助,记得留言、点赞、加关注哦!

欢迎订阅我的新专栏《现代命令行工具指南》,精讲目前最流行的开源命令行工具,定能大大提升你的工作效率。

相关文章:

  • 二叉树的一些基本操作
  • 湖仓一体电商项目(二十四):合并Iceberg小文件
  • Java中如何向一个HashSet对象中添加元素呢?
  • 静态HTML CSS网站制作成品 简单的学生网页作业代码【带视频演示】
  • 达梦数据库整合在springboot的使用教程
  • 【Linux】Linux的基本指令(Linux入门、用户的创建和切换)
  • C语言进阶——动态内存管理
  • C#面向对象程序设计课程实验一:实验名称:C#语言基础、程序流程控制
  • 公司级攻防比赛常用的突破方法
  • 多线程概述(线程创建,方法(等待,通知,加入,睡眠,礼让,中断),上下文切换,死锁,守护线程与用户线程)
  • 编译方式安装nginx
  • 【第48篇】MaxViT:多轴视觉转换器
  • shell 基础
  • 《uni-app》uni-app实现疯狂点赞效果(一)
  • service 自我升级遇到的问题
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Elasticsearch 参考指南(升级前重新索引)
  • EventListener原理
  • Java方法详解
  • js正则,这点儿就够用了
  • leetcode388. Longest Absolute File Path
  • markdown编辑器简评
  • pdf文件如何在线转换为jpg图片
  • PhantomJS 安装
  • PHP面试之三:MySQL数据库
  • Vue全家桶实现一个Web App
  • 多线程 start 和 run 方法到底有什么区别?
  • 规范化安全开发 KOA 手脚架
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 前端工程化(Gulp、Webpack)-webpack
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 云大使推广中的常见热门问题
  • 转载:[译] 内容加速黑科技趣谈
  • 《天龙八部3D》Unity技术方案揭秘
  • ​2020 年大前端技术趋势解读
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • # C++之functional库用法整理
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • (2022 CVPR) Unbiased Teacher v2
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (二)WCF的Binding模型
  • (附源码)php投票系统 毕业设计 121500
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (一)Linux+Windows下安装ffmpeg
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)甲方乙方——赵民谈找工作
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .jks文件(JAVA KeyStore)
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .Net各种迷惑命名解释
  • .Net小白的大学四年,内含面经