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

redis集群的多key原子性操作如何实现?

1、背景

在单实例redis中,我们知道多key原子性操作可以用lua脚本或者multi命令来实现。
比如说有一个双删场景,要保证原子性同时删除k1k2

可以用lua双删

EVAL "redis.call('del', KEYS[1]);redis.call('del', KEYS[2])" 2 k1 k2

也可以用事务双删

MULTI
del k1
del k2
EXEC

但是在redis的集群中,key被hash到不同的slot,slot又被分配到多个不同redis实例。那么多key原子性操作如何实现呢?

2、冲突

在redis集群中执行多key原子性操作,意味着要在不用redis实例之间执行多key原子性操作,要满足这个诉求,我们可以通过探索下面这个疑问,来挖掘正确解决方案。

参考单实例的思路,用lua脚本、multi能支持吗?
引申问题1:如果能,那么原理是怎样的?
引申问题2:如果不能,那么应该如何实现?

3、分析

参考腾讯云的解答

我们业务常用腾讯云,所以想到使用指南上一定有关于这个场景的方案。

关于集群版事务的描述

不建议使用事务
Redis 的事务功能较弱,不支持回滚,而且集群版本要求一次事务操作的 Key 必须在同一个 Slot 上。

这里腾讯云并没有说用了事务会如何?是会失效还是会报错?我觉得这个可以描述更清晰一些。读者知道可以评论回复。

关于集群版lua的描述

集群版使用 Lua 的特殊要求
所有 Key 都应该由 KEYS 数组来传递。redis.call/pcall 里面调用的 Redis 命令,Key 的位置必须是 KEYS array, 否则直接返回如下错误信息:error,“-ERR bad lua script for redis cluster,all the keys that the script uses should be passed using the KEYS array”
单个 Lua 脚本操作的 Key 必须在同一个节点上,否则直接返回如下错误信息:error, “-ERR eval/evalsha command keys must in same slotrn”

用lua脚本强调的是key必须都落到同一slot上,这里并没有说怎么使key落到同一slot上,所以我认为这个答案也并不完美。

总结一下,大致就是腾讯云不具备集群多实例间的多key原子性操作能力。
但是,可以通过将操作的多key都落到同一slot,利用单实例redis的能力来实现

参考redis官方的解答

经过上面的思考后,我想看看标准redis集群应该是怎么玩的?

关于"能力" 的描述

Redis Cluster implements all the single key commands available in the non-distributed version of Redis. Commands performing complex multi-key operations like set unions and intersections are implemented for cases where all of the keys involved in the operation hash to the same slot.

  • redis 集群实现所有非集群版本的单key操作能力
  • redis 集群复杂的多key操作能力是基于所有key都落在同一slot的原则上实现的

问题一的思考,两个命令都属于#2,所以,官方也是建议多key原子性操作将操作的多key都落到同一slot,利用单实例redis的能力来实现

那么怎么使key落到同一slot上

关于多key落同一slot

Redis Cluster implements a concept called hash tags that can be used to force certain keys to be stored in the same hash slot.

redis集群提供了一个叫hash tags的概念,利用这个能力,可以将多key都落到同一个slot中。

4、解决

解答疑问

综合上面的信息,我们可以解答我们的问题了。
参考单实例的思路,用lua脚本、multi能支持吗?
是,可以的。但是有一个前提,就是保证多key都落在同一个slot中。其原理是,将多key收拢在同一个slot中,并利用单实例redis的多key原子性操作能力。

使多key落在同一slot-hash tags

Hash tags
There is an exception for the computation of the hash slot that is used in order to implement hash tags. Hash tags are a way to ensure that multiple keys are allocated in the same hash slot. This is used in order to implement multi-key operations in Redis Cluster.
To implement hash tags, the hash slot for a key is computed in a slightly different way in certain conditions. If the key contains a “{…}” pattern only the substring between { and } is hashed in order to obtain the hash slot.

大概的意思就是,原来key落到slot的方式是根据key进行hash的,如果我们给key起名的时候带上{x}标志,那么进行hash的时候就会以x作为hash key了。

用上述的例子,我们可将key名改成{k}1,{k}2,那么就可以使这两个key落在同一slot,就可以用起集群版的多key原子性操作能力了。

更好的使用方式

抛开redis集群自身的能力,应该还有更好的解决方案,比如分布式锁等这里就不再探讨,有更好的方式可以评论区交流。

参考:
腾讯云-命令使用准则
redis官方关于redis集群的描述

相关文章:

redis集群的多key原子性操作如何实现?

1、背景 在单实例redis中,我们知道多key原子性操作可以用lua脚本或者multi命令来实现。 比如说有一个双删场景,要保证原子性同时删除k1和k2。 可以用lua双删 EVAL "redis.call(del, KEYS[1]);redis.call(del, KEYS[2])" 2 k1 k2也可以用事务…...

密码学与网络安全:量子计算的威胁与解决方案

第一章:引言 在当今数字化世界中,网络安全一直是一个备受关注的话题。密码学作为网络安全的基石,扮演着至关重要的角色。然而,随着科学技术的不断进步,特别是量子计算的崛起,传统密码学的基础受到了严重威…...

GoLong的学习之路(十二)语法之标准库 flag的使用

上回书说到,fmt的标准库的一些常用的使用函数。这次说flag的使用,以下这些库要去做了解。不然GG,Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单。 文章目录 os.Argsflag包flag.Type()flag.TypeVar(…...

mac git ssh

1.作用 1.不用账号密码拉取git项目 2.使用 1.检查是否生成ssh的公钥和私钥 命令: cd ~/.ssh表示没有 No such file or directory 2.如果没有就生成公钥和私钥 ssh-keygen -t rsa -C "帅哥***.com"后面的是git邮箱地址 然后一直按enter,…...

栈、共享栈、链式栈(C++实现)

文章目录 前言1. 栈的顺序存储(顺序栈)2. 栈的基本操作🍑 入栈操作🍑 出栈操作🍑 获取栈顶元素🍑 获取栈的长度🍑 判断是否为空栈🍑 判断栈是否满了🍑 打印栈内的元素&am…...

MySQL实战2

文章目录 主要内容一.回访用户1.准备工作代码如下(示例): 2.目标3.实现代码如下(示例): 二.如何找到每个人每月消费的最大天数1.准备工作代码如下(示例): 2.目标3.实现代码如下(示例&#xff09…...

【面试经典150 | 栈】简化路径

文章目录 Tag题目来源题目解读解题思路方法一:字符串数组模拟栈 其他语言python3 写在最后 Tag 【栈】【字符串】 题目来源 71. 简化路径 题目解读 将 Unix 风格的绝对路径转化成更加简洁的规范路径。字符串中会出现 字母、数字、/、_、. 和 .. 这几种字符&#…...

无线电编码和记录和静音检测器 PlayOutONE LiveStream 5.0

直播编码器,随处流式传输。LiveStream 应用程序的多色图案屏幕截图,显示一波进入,四路流出来,LiveStream是一站式应用程序,可让您的电台在需要的地方输出。 对音频进行编码以进行流式传输,使用您最喜欢的V…...

React中useEffect Hook使用纠错

引言 React是一种流行的JavaScript库,用于构建用户界面。它提供了许多强大的功能和工具,使开发人员能够轻松地构建交互式和可重用的组件。其中一个最常用的功能是React的useEffect Hook,它允许我们在函数组件中执行副作用操作。然而&#xf…...

0049【Edabit ★☆☆☆☆☆】【修改Bug代码】Buggy Code

0049【Edabit ★☆☆☆☆☆】【修改Bug代码】Buggy Code bugs language_fundamentals Instructions The challenge is to try and fix this buggy code, given the inputs true and false. See the examples below for the expected output. Examples has_bugs(true) // &qu…...

javaswing/gui的科学计算器

一个使用javajavaswing/gui的科学计算器程序。 支持加减乘除,函数运算,清空,退回等操作。 还支持进制运算。 源码下载地址 支持:远程部署/安装/调试、讲解、二次开发/修改/定制...

Chapter1:C++概述

此专栏为移动机器人知识体系的 C {\rm C} C基础,基于《深入浅出 C {\rm C} C》(马晓锐)的笔记, g i t e e {\rm gitee} gitee链接: 移动机器人知识体系. 1.C概述 1.1 C概述 计算机系统分为硬件系统和软件系统。 硬件系统:指组成计算机的电子…...

实战经验分享FastAPI 是什么

FastAPI 是什么?FastAPI实战经验分享 ![在这里插入图片描述](https://img-blog.csdnimg.cn/7e9e23e6fe3444238413d91f37064b65.png](https://fastapi.tiangolo.com/) FastAPI 是一个先进、高效的 Python Web 框架,专门用于构建基于 Python 的 API。它是…...

Edge浏览器中常用的20个快捷键

Microsoft Edge,和许多其他网络浏览器一样,设有一系列的键盘快捷方式,旨在提高用户效率。以下是Edge浏览器的20个实用快捷键: Ctrl T - 打开一个新标签页。Ctrl W(或 Ctrl F4)- 关闭当前标签页。Ctrl …...

winscp显示隐藏文件

当前目录下有被隐藏的文件时,会在右下角看到 “已隐藏” 的字样,双击这个字样,就会显示被隐藏的文件和文件夹...

uniapp获取地理位置的API是什么?

UniApp获取地理位置的API是uni.getLocation。它的作用是获取用户的当前地理位置信息,包括经纬度、速度、高度等。通过该API,开发者能够实现基于地理位置的功能,如显示用户所在位置附近的商家、导航服务、天气查询等。 以下是一个示例&#x…...

【ARMv8 SIMD和浮点指令编程】NEON 通用数据处理指令——复制、反转、提取、转置...

NEON 通用数据处理指令包括以下指令(不限于): • DUP 将标量复制到向量的所有向量线。 • EXT 提取。 • REV16、REV32、REV64 反转向量中的元素。 • TBL、TBX 向量表查找。 • TRN 向量转置。 • UZP、ZIP 向量交叉存取和反向交叉存取。 1 DUP (element) 将…...

C#,数值计算——分类与推理,基座向量机的 Svmgenkernel的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public abstract class Svmgenkernel { public int m { get; set; } public int kcalls { get; set; } public double[,] ker { get; set; } public double[] y { get; set…...

08.K8S高可用方案

K8S高可用方案 1、高可用部署方式 官方提供两种高可用实现方式: 堆叠etcd 拓扑,其中 etcd 节点与控制平面节点共存;外部 etcd 节点,其中 etcd 与控制平面在不同的节点上运行;1.1、堆叠 etcd 拓扑 主要特点: 每个 master 节点上运行一个 apiserver 和 etcd, etcd 只与本…...

MySQL实战1

文章目录 主要内容一.墨西哥和美国第三高峰1.准备工作代码如下(示例): 2.目标3.实现代码如下(示例): 4.相似例子代码如下(示例): 二.用latest_event查找当前打开的页数1.准备工作代码如下(示例&…...

储能变流器双向软开关设计:从拓扑选型到控制策略的工程实现

一、储能PCS的技术挑战与设计目标1.1 储能系统的核心需求储能变流器(PCS)是实现电池与电网之间能量双向流动的关键设备,在充电模式下将电网交流电转换为直流电为电池充电,在放电模式下将电池直流电转换为交流电馈入电网或供给负载…...

显卡显存稳定性终极检测指南:memtest_vulkan免费工具快速诊断GPU问题

显卡显存稳定性终极检测指南:memtest_vulkan免费工具快速诊断GPU问题 【免费下载链接】memtest_vulkan Vulkan compute tool for testing video memory stability 项目地址: https://gitcode.com/gh_mirrors/me/memtest_vulkan 核心关键词:显卡显…...

基于springboot+vue超市进销存管理系统hx0897

文章目录详细视频演示技术介绍功能介绍核心代码系统效果图源码获取详细视频演示 文章底部名片,获取项目的完整演示视频,免费解答技术疑问 技术介绍 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomca…...

思源宋体:3大核心优势+5步落地指南,免费商用中文字体解决方案

思源宋体:3大核心优势5步落地指南,免费商用中文字体解决方案 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 在数字化设计与开发中,中文字体的选择一…...

3个高效技巧:用Elsevier Tracker实现投稿状态智能监控

3个高效技巧:用Elsevier Tracker实现投稿状态智能监控 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker 你是否也曾经历过这样的科研日常:每天打开Elsevier投稿系统,重复登录、点击…...

Agent 不是玄学!前端只需要会做步骤可视化就够了

“AI 智能体”“思考链”“工具调用”—— 这些词听着就像 “AI 要统治世界”,是不是觉得离前端特别远?其实不然!对前端来说,Agent 就是 “一个会自己做任务的 AI”—— 比如 “让 AI 自动查天气、写周报、发邮件”,你…...

C++的std--ranges视图转换

C的std::ranges视图转换:现代序列处理的利器 在C20中,std::ranges库的引入彻底改变了序列处理的方式,其中视图转换(View Adaptors)作为核心功能之一,为开发者提供了高效、声明式的数据操作工具。通过视图转…...

Qwen3-ASR-1.7B车载场景应用:驾驶语音助手开发

Qwen3-ASR-1.7B车载场景应用:驾驶语音助手开发 1. 引言 开车时操作导航、切歌、调音量,这些看似简单的操作却暗藏风险。低头一秒,车辆就能开出几十米,事故往往就发生在这瞬间。传统的触屏操作不仅分心,还让驾驶变得不…...

终极NVIDIA显卡调优指南:5个隐藏设置提升游戏性能200%

终极NVIDIA显卡调优指南:5个隐藏设置提升游戏性能200% 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA显卡性能优化是每个游戏玩家都关注的核心话题,而通过专业工具NVIDIA…...

创建使用费曼学习技能,让 AI 帮你快速学习新领域知识(实战教程)

看完一篇文章、学习一个知识,当时感觉懂了。过三天,有人问你,你发现说不清楚。又或者准备运用这个知识,尝试解决问题,又觉得似是而非。这不是记忆力的问题,是你从来没有真正理解过它。有个方法专门解决这件…...