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集群的描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/121570.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10款轻量型的嵌入式GUI库分享

LVGL LittlevGL是一个免费的开源图形库,提供了创建嵌入式GUI所需的一切,具有易于使用的图形元素、漂亮的视觉效果和低内存占用。 特点: 强大的构建模组 按钮、图表、列表、滑块、图像等 ​先进的图形 动画、反锯齿、半透明、平滑滚动 多样…

Elasticsearch核心技术与实战-05-elasticsearch的安装与简单配置-Windows

首先下载elasticsearch的zip包:下载地址 网络不通的解决方法:国内镜像站 es、kibana、logstash均可在华为云开元镜像站自行选择版本下载:下载地址 下载插件包: .\bin\elasticsearch-plugin install analysis-icu .\bin\elasti…

HTTPS协议:保障网络安全的加密通信协议

在当今数字化时代,网络安全问题备受关注。为了保护用户的隐私和数据安全,HTTPS协议应运而生。本文将介绍HTTPS协议的定义、工作原理以及其在网络通信中的重要性。 一、HTTPS协议的定义 HTTPS(Hypertext Transfer Protocol Secure)…

Oracle RU 19.21及 datapatch -sanity_checks

参考文档: Oracle Database Patch 35643107 - Database Release Update 19.21.0.0.231017 Datapatch User Guide (Doc ID 2680521.1) datapatch fails with ORA-04061/ORA-4065/ORA-04045/ORA-04067 due to Golden Gate triggers. (Doc ID 2301658.1) 在19.21的…

用Scapy模块中的sr()函数提供一个程序的例子

from scapy.all import *# 构造ARP请求包 arp_request ARP(pdst192.168.1.1)# 发送ARP请求并获取响应 arp_response sr(arp_request, timeout1, verboseFalse)# 解析响应数据包中的MAC地址 if arp_response[0]:mac_address arp_response[0][ARP].hwsrcprint(fThe MAC addres…

Ensemble Methods集成学习大比拼:性能、应用场景和可视化对比总结

集成学习(Ensemble Learning)是一种机器学习范式,其中多个模型(通常称为“弱学习器”)被训练以解决相同的问题,并且通过某种方式结合它们的预测以提高整体性能。这种方法的核心思想是,多个模型比单一模型更能准确地预测未知数据。在本文中,我们将探讨多种集成学习算法,…

LLM在text2sql上的应用 | 京东云技术团队

一、前言: 目前,大模型的一个热门应用方向text2sql它可以帮助用户快速生成想要查询的SQL语句。那对于用户来说,大部分简单的sql都是正确的,但对于一些复杂逻辑来说,需要用户在产出SQL的基础上进行简单修改&#xff0c…

c 从avi 视频中提取图片

avi 视频的视频流编码必须是jpeg&#xff0c;或者mjpg 直接用摄像头录取的视频都是这两种格式&#xff0c;不能用ffmpeg转成avi的视频。 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.…

shell_52.Linux测试与其他网络主机的连通性脚本

实战演练 本节将展示一个实用脚本&#xff0c;该脚本在处理用户输入的同时&#xff0c;使用 ping 命令或 ping6 命令来测试与其他网络主机的连通性。 ping 命令或 ping6 命令可以快速测试网络主机是否可用。这个命令很有用&#xff0c;经常作为首选工具。如果只是检查单个主机&…

【Apache Flink】基于时间和窗口的算子-配置时间特性

文章目录 前言配置时间特性将时间特性设置为事件时间时间戳分配器周期性水位线分配器创建一个实现AssignerWithPeriodicWatermarks接口的类&#xff0c;目的是为了周期性生成watermark 定点水位线分配器示例 参考文档 前言 Apache Flink 它提供了多种类型的时间和窗口概念&…

C#WinformListView实现缺陷图片浏览器

C#&Winform&ListView实现缺陷图片浏览器 功能需求图像浏览行间距调整悬浮提示 功能需求 机器视觉检测系统中特别是缺陷检测系统&#xff0c;通常需要进行对已经检出的缺陷图片进行浏览查阅。主要是通过条件筛选查询出所需要的数据&#xff0c;进行分页再展示到界面中。…

[计算机提升] Windows系统各种开机启动方式介绍

1.14 开机启动 在Windows系统中&#xff0c;开机启动是指开启电脑后&#xff0c;自动运行指定的程序或服务的技术。一些程序或服务需要在开机后自动启动&#xff0c;以便及时响应用户操作&#xff0c;比如防安防软件、即时通信工具、文件同步软件等。 同时&#xff0c;一些系统…

深入剖析SQL与NoSQL的优劣势,帮你决定最佳数据存储方案

你是否在为系统的数据库来一波大流量就几乎打满 CPU&#xff0c;日常 CPU 居高不下烦恼?你是否在各种 NoSQL 间纠结不定&#xff0c;到底该选用哪种最好?今天的你就是昨天的我&#xff0c;这也是我写这篇文章的初衷。 作为互联网从业人员&#xff0c;我们要知道关系型数据库…

电感基础复盘

1、在高速电路中&#xff0c;我们通常选用SMD贴片电阻&#xff0c;有薄膜和厚膜之分。 2、电容的性质主要为“充放电”和”隔直通交“。获得电荷为充电&#xff0c;反之为放电。隔离直流电不能通过电容器&#xff0c;⽽交流电能通过电容器。充电时直流电相当于导通&#xff0c;…

如何快速安装MONAI(莫奈)医学标注软件

安装 MONAI Label软件怕【官网】 python -m pip install --upgrade pip setuptools wheel# Install latest stable version for pytorch pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113# Check if cuda enabled python …

FPGA时序分析与约束(7)——通过Tcl扩展SDC

一、概述 术语“Synopsys公司设计约束”&#xff08;又名SDC&#xff0c;Synopsys Design Constraints&#xff09;用于描述对时序、功率和面积的设计要求&#xff0c;是EDA工具中用于综合、STA和布局布线最常用的格式。本文介绍时序约束的历史概要和SDC的描述。 二、时序约束…

综合性练习

名片管理系统 综合性项目实现—详细请点这里 dict {} # 定义一个空字典&#xff0c;用于存储信息。 list [] # 定义一个列表&#xff0c;存储name值 list1 [] #存储age值 list2 [] #存储phone值 def people_tips(): #提示print("*****" * 10)print("…

10月25日,每日信息差

今天是2023年10月26日&#xff0c;以下是为您准备的14条信息差 第一、百世集团牵头成立全国智慧物流与供应链行业产教融合共同体在杭州正式成立&#xff0c;该共同体由百世集团、浙江工商大学、浙江经济职业技术学院共同牵头 第二、问界M9预定量突破15000台 第三、前三季度我…

python:使用Scikit-image对遥感影像进行小波变换特征提取(wavelet)

作者:CSDN @ _养乐多_ 在本博客中,我们将介绍如何使用Scikit-image库进行单波段遥感图像的特征提取,重点关注小波变换方法,特别是Gabor滤波器。我们将详细解释代码中的参数以及如何调整它们以满足不同需求。 小波变换是一种数学工具,用于将信号分解成不同尺度和频率的成…

leetcode做题笔记204. 计数质数

给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 示例 1&#xff1a; 输入&#xff1a;n 10 输出&#xff1a;4 解释&#xff1a;小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。示例 2&#xff1a; 输入&#xff1a;n 0 输出&#xff1a;0示例 3&#…