Redis批量获取缓存的方法

使用multiGet方法

优点:简单易用,适用于获取少量键的场景。

缺点:当获取的键数量较多时,可能会因为网络延迟导致性能下降。此外,如果某个键不存在,对应的返回值会是null,需要额外处理。

其他说明:

multiGet方法适合处理的键的数量并没有一个严格的限制,但是它的性能会随着键的数量增加而逐渐下降。这是因为multiGet方法会将所有的键在一次请求中发送到Redis服务器,如果键的数量非常多,可能会导致以下几个问题:

  1. 网络延迟:如果键的数量很多,那么构建请求和接收响应所需的时间会增加,这可能导致网络延迟成为性能瓶颈。
  2. 响应体大小:如果这些键对应的值都比较大,那么一次multiGet请求的响应体可能会非常大,这不仅会占用大量的网络带宽,还可能对客户端和服务器的内存造成压力。
  3. Redis服务器压力:如果大量的multiGet请求同时发送到Redis服务器,尤其是在键的数量很多的情况下,可能会对服务器造成较大的压力,影响其他操作的性能。
  4. 超时风险:在高负载或者网络条件不佳的情况下,大量的键可能会导致multiGet请求超时。

在实践中,如果需要获取的键的数量在几十个到几百个,通常使用multiGet方法不会出现性能问题。但是,如果键的数量达到几千个或者更多,可能就需要考虑其他策略,比如:

  1. 分批获取:将大量的键分成多个批次,每批次使用multiGet获取一部分键的值。
  2. 使用scan命令:对于需要匹配模式的大量键,使用scan命令进行迭代获取。
  3. 使用管道:对于写入操作,可以使用管道(pipeline)来减少网络往返次数,提高效率。

总的来说,是否使用multiGet方法以及适合处理多少键,需要根据实际的应用场景和性能测试来决定。在不确定的情况下,建议进行性能测试,以确定在特定的环境下最佳的操作方式。

/*** 测试StringRedisTemplate.opsForValue().multiGet方法* * @author 付聪* @time 2024-10-11 15:36:26*/
@Test
public void testMultiGet() {List<String> keys = Arrays.asList("test-multiGet:key1", "test-multiGet:key2", "test-multiGet:key3");Integer i = 1;for (String key : keys) {stringRedisTemplate.opsForValue().set(key, "test-multiGet:value" + i++, 1, TimeUnit.HOURS);}List<String> values = stringRedisTemplate.opsForValue().multiGet(keys);PrintUtil.println(StrUtil.format("values:{}", values));
}

使用executePipelined方法

优点:可以显著减少网络往返次数,提高批量操作的性能。适用于执行大量独立的写入或读取操作。

缺点:编程模型相对复杂,需要手动管理命令的发送和结果的收集。此外,如果操作非常频繁,可能会对Redis服务器造成压力。

/*** 测试StringRedisTemplate.executePipelined方法** @author 付聪* @time 2024-10-11 15:36:26*/
@Test
public void testExecutePipelined() {List<String> keys = Arrays.asList("test-executePipelined:key1", "test-executePipelined:key2", "test-executePipelined:key3");Integer i = 1;for (String key : keys) {stringRedisTemplate.opsForValue().set(key, "test-executePipelined:value" + i++, 1, TimeUnit.HOURS);}/**** 该函数使用stringRedisTemplate执行管道操作,批量获取多个键对应的值。具体步骤如下:* 使用executePipelined方法执行管道操作。* 定义一个RedisCallback匿名类,重写doInRedis方法。* RedisCallback#doInRedis是Spring Data Redis中的一个接口方法,其作用是在Redis连接上执行自定义的Redis操作。具体来说:* 参数:RedisConnection connection,表示当前的Redis连接。* 返回值:可以是任意类型,通常用于返回操作的结果。* 用途:* 提供对底层Redis连接的直接访问,允许执行更复杂的或自定义的Redis命令。* 可以在事务或管道中使用,提高性能和效率。* 通过实现doInRedis方法,开发者可以在Redis连接上执行任意的Redis命令,从而实现更灵活的Redis操作。* 在doInRedis方法中,遍历keys列表,对每个键调用connection.get(key.getBytes())获取其值。* 返回null,因为doInRedis方法的返回值不会影响最终结果。* executePipelined方法返回一个包含所有获取到的值的列表values。**/List<Object> values = stringRedisTemplate.executePipelined(new RedisCallback<String>() {@Overridepublic String doInRedis(RedisConnection connection) throws DataAccessException {for (String key : keys) {connection.get(key.getBytes());}// 返回null,因为结果已经通过executePipelined返回。return null;}});PrintUtil.println(StrUtil.format("values:{}", values));
}

使用管道可以减少网络延迟,提高Redis的操作效率。但是,需要注意的是,管道中的命令不能包含事务性的命令,如MULTIEXEC,否则会抛出异常 。

使用scan方法

优点:可以迭代地获取匹配特定模式的键,适用于需要匹配大量键的场景,且不会阻塞Redis服务器。

缺点scan命令返回的是游标,需要多次迭代才能获取所有匹配的键,且每次迭代返回的键数量有限,可能需要多次迭代才能获取全部数据。此外,scan命令在处理大量数据时效率较低。

/*** 测试scan方法** @author 付聪* @time 2024-10-18 10:09:38*/
@Test
public void testScan() {List<String> keys = Arrays.asList("test-scan:key1", "test-scan:key2", "test-scan:key3");Integer i = 1;for (String key : keys) {stringRedisTemplate.opsForValue().set(key, "test-scan:value" + i++, 1, TimeUnit.HOURS);}/**** 该函数通过stringRedisTemplate执行一个Redis操作,具体功能如下:* (RedisCallback<Set<String>>) 是一个类型转换操作,作用如下:* 将lambda表达式转换为RedisCallback<Set<String>>类型。* RedisCallback是Spring Data Redis提供的一个接口,用于执行自定义的Redis操作。* 通过这个转换,可以将lambda表达式传递给stringRedisTemplate.execute方法,从而在Redis连接上下文中执行自定义的逻辑。* 使用connection.scan方法扫描Redis中匹配模式test-scan:*的所有键。* count(100) 的作用是:* 设置每次扫描操作返回的最大元素数量为100。* 这个参数可以控制每次scan操作返回的键的数量,减少单次操作的数据量,提高性能和响应速度。* 如果不设置count,默认值通常为10。设置为100可以在一次扫描中返回更多的键,减少总的扫描次数。* 将扫描结果中的每个键转换为字符串并添加到result集合中。* 最终返回包含所有匹配键的字符串集合。**/Set<String> values = stringRedisTemplate.execute((RedisCallback<Set<String>>) connection -> {Set<String> result = new HashSet<>();Cursor<byte[]> cursor = connection.scan(ScanOptions.scanOptions().match("test-scan:*").count(100).build());while (cursor.hasNext()) {result.add(new String(cursor.next()));}return result;});PrintUtil.println(StrUtil.format("values:{}", values));
}

使用scan方法可以避免keys命令可能带来的性能问题,但是需要注意调节count的值,避免产生和keys命令类似的效果,可能会阻塞Redis 。

总结

每种方法都有其适用场景,可以根据实际需求和性能测试结果选择最合适的方法。

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

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

相关文章

深入浅出MySQL:概述与体系结构解析

目录 1. 初识MySQL1.1. 数据库1.1.1. OLTP&#xff08;联机事务处理&#xff09;1.1.2. OLAP&#xff08;联机分析处理&#xff09; 2. SQL2.1. 定义2.2. DQL&#xff08;数据查询语言&#xff09;2.3. DML&#xff08;数据操纵语言&#xff09;2.4. DDL&#xff08;数据定义语…

Python基于OpenCV的实时疲劳检测

2.检测方法 1&#xff09;方法 与用于计算眨眼的传统图像处理方法不同&#xff0c;该方法通常涉及以下几种组合&#xff1a; 1、眼睛定位。 2、阈值找到眼睛的白色。 3、确定眼睛的“白色”区域是否消失了一段时间&#xff08;表示眨眼&#xff09;。 相反&#xff0c;眼睛长…

Python网络请求库requests的10个基本用法

大家好&#xff01;今天我们要聊聊Python中非常实用的一个库——requests。这个库让发送HTTP请求变得超级简单。无论你是想抓取网页数据还是测试API接口&#xff0c;requests都能派上大用场。下面我们就一起来看看如何使用requests完成一些常见的任务。 引言 随着互联网技术的…

队列(数据结构)——C语言

目录 1.概念与结构 2.队列的实现 初始化QueueInit 申请新节点BuyNode 入队QueuePush 判断队为空QueueEmpty 出队QueuePop 读取队头数据QueueFront 读取队尾数据QueueBack 元素个数QueueSize 销毁队列QueueDestroy 3.整体代码 (文章中结点和节点是同一个意思) 1.概…

keil兼容C51和ARM,C251

三合一 C51,AEM,C251获取STC32的包 将 C51,AEM,C251安装到一块。 C51,AEM,C251 将三个软件分别下载到不同的文件夹KEIL,MDK,KEIL2里。 然后打开KEIL,MDK,KEIL2文件夹&#xff0c;复制KEIL文件夹里的C51和KEIL2文件夹里的C251的文件夹到MDK文件夹里。 打开KEIL和KEIL2文件夹里…

单链表的经典算法OJ

目录 1.反转链表 2.链表的中间节点 3.移除链表元素 ——————————————————————————————————————————— 正文开始 1.反转链表 typedef struct ListNode ListNode; struct ListNode* reverseList(struct ListNode* head) {//判空if(…

运行kafka查看所有主题Topic报错zookeeper is not a recognized option

执行命令查看&#xff1a;./kafka-topics.sh --list --zookeeper localhost:2181 报错 zookeeper is not a recognized option joptsimple.UnrecognizedOptionException: zookeeper is not a recognized optionat joptsimple.OptionException.unrecognizedOption(OptionExcept…

000010 - Mapreduce框架原理

Mapreduce框架原理 1. InputFormat 数据输入1.1 切片与 MapTask 并行度决定机制1.2 Job 提交流程源码和切片源码详解1.2.1 Job 提交流程源码详解1.2.2 FileInputFormat 切片源码解析&#xff08;input.getSplits(job)&#xff09; 1.3 FileInputFormat 切片机制1.3.1 切片机制1…

二、PyCharm基本设置

PyCharm基本设置 前言一、设置中文汉化二、设置代码字体颜色三、设置鼠标滚轮调整字体大小四、修改 PyCharm 运行内存4.1 方式一4.1 方式二 五、显示 PyCharm 运行时内存六、设置代码模版配置的参数有&#xff1a; 七、PyCharm设置背景图总结 前言 为了让我们的 PyCharm 更好用…

一家射频芯片企业终止,报告期持续亏损,高端产品占比不足

飞骧科技终止原因如下&#xff1a;飞骧科技从事的射频芯片行业如今竞争激烈&#xff0c;飞骧科技的产品主要应用于中低端手机&#xff0c;如摩托罗拉、传音&#xff0c;相比同行业上市公司已经退出的低集成度市场&#xff0c;相关产品展飞骧科技业务比重仍然不低。交易所质疑其…

【Matlab】基于Prandtl−Ishlinskii的迟滞模型-RLS辨识

PI模型 PI迟滞模型的输出公式&#xff1a; 代码记录 此代码为根据PI模型&#xff0c;已知输入&#xff08;正弦函数幅值为3.5&#xff09;、阈值以及权重值&#xff0c;利用matlab生成迟滞回线。 %% The Prandtl-Ishlinskii Hysteresis Model- %% 20241021 clc;clear; close…

数据结构与算法——Java实现 44.翻转二叉树

目录 226. 翻转二叉树 思路 代码 本地代码测试 不管前方的路有多苦 只要走的方向正确 不管多么崎岖不平 都比站在原地更接近幸福 —— 24.10.21 226. 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输…

Unity AnimationClip详解(2)——动画数据的优化

【内存优化】 首先要意识到运行时和编辑时的区别&#xff0c;当运行时和编辑时所需的数据相差不大时&#xff0c;我们用同一套数据结构即可&#xff0c;当两者差异较多或者数据量很大时&#xff0c;需要有各自的数据结构&#xff0c;这意味着在打包或构建时需要将编辑时数据转…

【Linux探索学习】第七弹——Linux的工具(二):Linux下vim编辑器的使用详解

Linux的工具&#xff08;一&#xff09;&#xff1a;【Linux探索学习】第六弹——Linux的工具&#xff08;一&#xff09;&#xff1a;Ubuntu系统下的软件包管理器_ubuntu软件管理器-CSDN博客 前言&#xff1a; 在学习Linux之前&#xff0c;相信大家都或多或少的学习过一些计算…

微信小程序用开发工具在本地真机调试可以正常访问摄像头,发布了授权后却无法访问摄像头,解决方案

今天开发上线了一个拍照的微信小程序&#xff0c;用uniapp的Vue3开发的&#xff0c;调用的camera组件&#xff0c;相关代码如下&#xff1a; <!-- 微信小程序相机组件 --><view v-if"showCamera" class"camera-container"><camera :device…

Adobe Acrobat DC 打印PDF文件,没有打印出注释的解决方法

adobe acrobat在打印的时候&#xff0c;打印不出来注释内容&#xff08;之前一直可以&#xff0c;突然就不行&#xff09;&#xff0c;升级版本、嵌入字体等等都试过&#xff0c;也在Google找了半天和问了GPT也么找着办法。 无奈之下&#xff0c;自己通过印前检查&#xff0c;…

免费开源AI助手,颠覆你的数字生活体验

Apt Full作为一款开源且完全免费的软件&#xff0c;除了强大的自然语言处理能力&#xff0c;Apt Full还能够对图像和视频进行一系列复杂的AI增强处理&#xff0c;只需简单几步即可实现专业级的效果。 在图像处理方面&#xff0c;Apt Full提供了一套全面的AI工具&#xff0c;包…

Windows环境下Qt Creator调试模式下qDebug输出中文乱码问题

尝试修改系统的区域设置的方法&#xff1a; 可以修复问题。但会出现其它问题&#xff1a; 比如某些软件打不开&#xff0c;或者一些软件界面的中文显示乱码&#xff01; 暂时没有找到其它更好的办法。

《YOLO目标检测》—— YOLO的简单介绍及Map评估指标

文章目录 一、简单概述二、YOLO中的Map指标1.定义与计算2.应用与意义3.注意事项 一、简单概述 YOLO&#xff08;You Only Look Once&#xff09;是一种目标检测算法&#xff0c;由Redmon等人在2016年提出。它的主要特点是速度快且准确性高&#xff0c;非常适合用于实时目标检测…

C# WebApi 接口测试工具:WebApiTestClient应用技术详解

目录 一、引言 二、WebApiTestClient介绍 1、特性 2、应用场景 三、WebApiTestClient具体使用 1、WebApi项目引入组件 2、如何使用组件 1、修改Api.cshtml文件 2、配置读取注释的xml路径 3、测试接口 四、总结 一、引言 由于最近项目需要开发WebApi接口&…