redis集群的多key原子性操作如何实现?
1、背景
在单实例redis中,我们知道多key原子性操作可以用lua脚本或者multi命令来实现。
比如说有一个双删场景,要保证原子性同时删除k1和k2。
可以用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.实现代码如下(示例)…...
【面试经典150 | 栈】简化路径
文章目录 Tag题目来源题目解读解题思路方法一:字符串数组模拟栈 其他语言python3 写在最后 Tag 【栈】【字符串】 题目来源 71. 简化路径 题目解读 将 Unix 风格的绝对路径转化成更加简洁的规范路径。字符串中会出现 字母、数字、/、_、. 和 .. 这几种字符&#…...
无线电编码和记录和静音检测器 PlayOutONE LiveStream 5.0
直播编码器,随处流式传输。LiveStream 应用程序的多色图案屏幕截图,显示一波进入,四路流出来,LiveStream是一站式应用程序,可让您的电台在需要的地方输出。 对音频进行编码以进行流式传输,使用您最喜欢的V…...
React中useEffect Hook使用纠错
引言 React是一种流行的JavaScript库,用于构建用户界面。它提供了许多强大的功能和工具,使开发人员能够轻松地构建交互式和可重用的组件。其中一个最常用的功能是React的useEffect Hook,它允许我们在函数组件中执行副作用操作。然而…...
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实战经验分享  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.准备工作代码如下(示例&…...
KOOK艺术馆入门必看:Streamlit缓存机制与大模型加载优化技巧
KOOK艺术馆入门必看:Streamlit缓存机制与大模型加载优化技巧 想象一下,你刚刚部署了璀璨星河艺术馆,这个界面美得像卢浮宫画廊的AI绘画工具。你兴奋地输入了第一个创意描述,点击生成按钮,然后...开始了漫长的等待。界…...
ACadSharp:.NET平台下的CAD文件处理解决方案
ACadSharp:.NET平台下的CAD文件处理解决方案 【免费下载链接】ACadSharp C# library to read/write cad files like dxf/dwg. 项目地址: https://gitcode.com/gh_mirrors/ac/ACadSharp 计算机辅助设计(Computer Aided Design, CAD)技术已成为工程领域不可或缺…...
SEO优化的预算一般应如何合理安排
SEO优化的预算一般应如何合理安排 在当今数字化时代,网站的搜索引擎优化(SEO)已成为提升网站流量和品牌知名度的重要手段。如何合理分配SEO优化预算成为许多企业和网站管理者面临的一个重要课题。本文将从问题分析、原因说明、解决方法、注意…...
OpenClaw安全实验室:SecGPT-14B+Metasploit自动化漏洞验证环境
OpenClaw安全实验室:SecGPT-14BMetasploit自动化漏洞验证环境 1. 为什么需要自动化漏洞验证环境 作为安全研究员,我每天要处理大量漏洞扫描报告。最头疼的不是发现漏洞,而是验证这些漏洞的真实性——手动复现每个漏洞需要反复切换工具、整理…...
设备独立滚动控制:让macOS输入设备各得其所的开源解决方案
设备独立滚动控制:让macOS输入设备各得其所的开源解决方案 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 问题溯源:当滚动方向成为效率隐形杀手 在数字…...
Swift-All部署教程:快速搭建多模型推理与微调环境
Swift-All部署教程:快速搭建多模型推理与微调环境 1. 从零开始:为什么你需要Swift-All? 如果你正在研究大模型,或者想把大模型用在实际项目里,大概率会遇到这几个头疼的问题: 模型太多,下载太…...
基于U-Net的肺部CT结节检测系统设计与实现
摘要:肺癌是当前威胁人类健康的重要疾病之一,肺结节作为肺癌早期筛查和诊断的重要影像学表现,其准确检测具有重要意义。CT影像因具有较高的空间分辨率,被广泛应用于肺部疾病检查。然而,传统人工阅片方式存在工作量大、…...
intv_ai_mk11效果展示:真实用户提问‘如何提高店铺转化率’获得4维度可执行策略
intv_ai_mk11效果展示:真实用户提问如何提高店铺转化率获得4维度可执行策略 1. 案例背景与问题描述 在电商运营中,店铺转化率是衡量经营效果的核心指标之一。某服装店铺运营人员向intv_ai_mk11 AI对话机器人提出了一个典型问题:"如何提…...
Linux中以其它用户身份执行脚本或命令的全总结
Linux中以其他用户身份执行命令或脚本是一个常见的需求,最近工作中碰到了这个需求,在这里简单总结一下.假如我们在root用户下想以其它用户(例如oracle,mysql)身份执行一些脚本或命令,那么有哪一些方法呢?su命令(switch user)su命令的使用方式有两种, 如下所示:切换用户只执行一…...
从电商推荐到NLP:多任务学习中Loss平衡的行业应用案例解析
从电商推荐到NLP:多任务学习中Loss平衡的行业应用案例解析 在人工智能技术快速渗透各行业的今天,多任务学习(MTL)正成为提升模型效率的关键策略。想象一下,电商平台需要同时预测用户点击率和购买转化率,智能…...
