👽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