如何手动实现multiSetIfAbsent、multiExpire

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

背景

实习小需求,需要考虑的点:当有多个命令要执行时,一个一个命令的执行,网络交互次数多,效率比较低,为了提高效率,可以使用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

相关推荐

  1. 如何手动实现批量添加和解除限时锁

    2024-06-13 06:16:04       8 阅读
  2. js手动实现unshift

    2024-06-13 06:16:04       11 阅读
  3. 如何实现单片机与手机的远距离通信

    2024-06-13 06:16:04       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-13 06:16:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-13 06:16:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-13 06:16:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-13 06:16:04       18 阅读

热门阅读

  1. Mysql union语句

    2024-06-13 06:16:04       5 阅读
  2. 苹果宣布iOS18开始深度集成AI

    2024-06-13 06:16:04       9 阅读
  3. Axios 二次封装详解

    2024-06-13 06:16:04       7 阅读
  4. vscode不能进行go跳转

    2024-06-13 06:16:04       8 阅读
  5. 全角半角以及Normalizer

    2024-06-13 06:16:04       8 阅读