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

如何手动实现multiSetIfAbsent、multiExpire

👽System.out.println(“👋🏼嗨,大家好,我是代码不会敲的小符,目前工作于上海某电商服务公司…”);
📚System.out.println(“🎈如果文章中有错误的地方,恳请大家指正!共同进步,共同成长✊”);
🌟System.out.println(“💡如果文章对您有所帮助,希望您可以三连支持一下博主噢🔥”);
🌈System.out.println("🚀正在完成计划中:Java应届第一年规划 ");

文章目录

    • 背景
    • Redis Pipeline 介绍
    • 实现 multiSetIfAbsent
    • 实现 multiExpire
    • 最后

背景

实习小需求,需要考虑的点:当有多个命令要执行时,一个一个命令的执行,网络交互次数多,效率比较低,为了提高效率,可以使用pipeline实现命令的批量执行。

Redis Pipeline 介绍

Pipeline模式类似流水线的工作模式:客户端发送一个命令后无需等待执行结果,会继续发送其他命令;在全部请求发送完毕后,客户端关闭请求,开始接收响应,收到执行结果后再与之前发送的命令按顺序进行一一匹配。在Pipeline模式的具体实现中,大部分Redis客户端采用批处理的方式,即一次发送多个命令,在接收完所有命令执行结果后再返回给上层业务。
将多个命令一次性发送给服务器,避免了频繁地进行网络往返,从而减少了延迟并提升了效率。
在这里插入图片描述
缺点:

  • Pipeline是非原子性的,在执行一系列命令的过程中发生错误或者崩溃,可能只有部分命令得到执行。
  • 由于服务端以及部分客户端存在缓存区限制,建议单次Pipeline中不要使用过多的命令,也避免大批量阻塞。

问题:redis集群模式下,pipeline执行命令操作的key可以跨节点吗?
回答: 可以的。 Redis 集群中,每个键根据其键名的散列值被映射到特定的节点上。如果 Pipeline 中的命令操作了不同节点上的键,这些命令将被路由到各自的节点上执行。当然也会增加网络延迟并降低性能。

实现 multiSetIfAbsent

目的: 保证keys同时被获取或者同时不被获取。
实现: 利用while循环进行重试,批量发送命令setnx。如果该key已经被获取到,则在下次循环中该key不再setnx。超过一定的尝试次数之后若还没有成功获取到所有的key,就把已经成功获取到的key再删除。保证了keys被同时获取或者不获取。
核心代码实现:

List<Object> executeResult = redisTemplate

相关文章:

  • AI图书推荐:《如何利用ChatGPT在线赚钱》
  • 时序分解 | Matlab实现SCSSA-VMD融合正余弦和柯西变异的麻雀搜索算法优化变分模态分解时间序列信号分解
  • Ps:自动批量处理照片
  • 网络学了点socket,写个聊天室,还得改进
  • 使用proteus仿真51单片机的流水灯实现
  • Codesys中根据时间生成随机数字
  • Java后端开发常见的框架以及组件
  • 欢乐钓鱼大师攻略:buff大全讲解,云手机托管使用教程!
  • 本地知识库问答系统搭建(基于langchain+LLM)
  • ISO 19115-3:2023 关于元数据最小实例的允许命名空间的详细说明
  • IDEA创建Mybatis项目
  • 【MySQL】(基础篇五) —— 排序检索数据
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • 地推数据不再迷茫,Xinstall助你一臂之力!
  • Docker与低代码跨平台开发:实现高效跨平台开发的新范式
  • 10个最佳ES6特性 ES7与ES8的特性
  • css布局,左右固定中间自适应实现
  • git 常用命令
  • Gradle 5.0 正式版发布
  • Javascript基础之Array数组API
  • Linux gpio口使用方法
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • MySQL的数据类型
  • Nacos系列:Nacos的Java SDK使用
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Tornado学习笔记(1)
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 复杂数据处理
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 看域名解析域名安全对SEO的影响
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 使用 Docker 部署 Spring Boot项目
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ​一些不规范的GTID使用场景
  • # linux 中使用 visudo 命令,怎么保存退出?
  • # Redis 入门到精通(一)数据类型(4)
  • # SpringBoot 如何让指定的Bean先加载
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (03)光刻——半导体电路的绘制
  • (1)(1.9) MSP (version 4.2)
  • (C语言)字符分类函数
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (黑马C++)L06 重载与继承
  • (六)c52学习之旅-独立按键
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (三)elasticsearch 源码之启动流程分析
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (原創) 未来三学期想要修的课 (日記)
  • .jks文件(JAVA KeyStore)
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Compact Framework 多线程环境下的UI异步刷新