redis-集群模式-lua脚本操作多个key的问题

问题描述:

fat压测环境中,突然出现大量redis相关报错:

org.springframework.dao.InvalidDataAccessApiUsageException: ERR 'EVAL' command keys must in same slot. channel: [id: 0x10457fd7...

原因分析:

开发、测试环境 redis 是公司内部搭建的单机版本,fat是模拟生产用的阿里云redis集群。导致同样的lua脚本在redis集群模式下出现错误。

在 Redis 集群模式下,需要确保 同一个Lua 脚本中的多个 key 能够位于同一个 hash 槽中!

问题解决:

1、有人提出,使用相同的key前缀,可以让有相同前缀的key分布在同一个hash槽中;(错误的方案

对于这一点,我是不认同的,因为这个无法绝对保证。

Redis 集群中,相同前缀的键并不一定会分配到同一个分片。Redis 集群采用哈希槽 (hash slot) 的方式来分配数据,每个键通过 CLUSTER KEYSLOT <key> 命令计算出它属于哪个槽。集群中的每个节点负责处理一部分槽。

但是,如果你是指同一个前缀的键在分配时会不会落到同一个节点上,那么答案是可能的,也可能不会。因为键的分配基于哈希槽,而槽的分配又基于键的哈克尔值。如果有相同前缀的键具有相似的哈克尔值,它们可能会落到相同的槽,进而被同一节点处理。但是,这并不是一个可靠的行为,因为哈克尔值的分布是不可预测的。

再一个,即使能满足需求,但是也会导致热点数据倾斜分布不均的问题。

2、使用哈希标签:{};(推荐

如果数据是不在一个slot下的键值,是不能使用mget,mset等多键操作的。
但是可以通过 {} 来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去。

类似于shardingJdbc中的用于分片的字段。

比如我们一个业务中是缓存的用户相关的缓存信息,那么就可以 key1:{userId}、 key2:{userId} 这样来设计多个不同的redis key。这样即使lua脚本中操作多个key,按理也是应该按照业务是跟这个用户相关的缓存数据。这样就可以保证然多个当前用户相关的redis key 命中到同一个solt,就可以正常使用lua脚本控制请求层面的原子性了。

会伴随一个问题;

比如 一个lua脚本中 需要操作多种业务类型的数据,比如 一个是用户相关({userId})、一个是商品相关的{skuId}。如果存在用户跟sku维度的关联业务,那么可以考虑{userId+skuId}组合。

如果是分别独立的缓存场景,我想这个实现应该不是一个好的实现,不应该存在同一个lua脚本中操作两份不搭嘎的缓存数据。业务代码层面也没有按领域的维度进行合理的拆分,遇到这种场景,我们需要考虑的是是不是更好的划分服务边界会更好一些。利用其它的一些技术手段保证一致性或者原子性,合理拆分这个lua脚本中的复杂逻辑。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里巴巴找黄金宝箱(IV)

系列文章目录 本人最近再练习算法&#xff0c;所以会发布自己的解题思路&#xff0c;希望大家多指教 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、java代码五、测试用例 前言 一、题目描述 贫如洗的椎夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现…

CICD相关概念简单理解——筑梦之路

CI/CD 是现代软件开发流程中的关键实践&#xff0c;它代表着持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;或持续交付&#xff08;Continuous Delivery&#xff09;的组合。这些实践旨在帮助软件开发团队更…

Java学习 (五) 面向对象--包概念、封装、构造器

一、 package &#xff08;包&#xff09; package 包 用于指定该文件中定义的类、接口等结构 像我们之前练习的代码&#xff0c;在顶部并没有定义package的关键字&#xff0c;这种就属于无名包 1、包 &#xff08;java 库&#xff09; 在java中的包&#xff0c;是一堆类和接…

2024我们该学习大模型吗?

一、引言 在快速变化的科技行业中&#xff0c;人工智能&#xff08;AI&#xff09;大模型已成为研究和应用的热点。随着AI技术的不断进步&#xff0c;特别是在自然语言处理、计算机视觉和机器学习平台等领域&#xff0c;许多专业人士开始将目光投向AI大模型的开发和应用。 二…

Linux挂载Windows共享文件

一、Windows共享目录 二、Linux挂载 yum install cifs-utils mkdir /aaa/ mount.cifs -o usernamexxx,passwordxxx //172.16.8.121/aaa /aaa/

【机器学习】在【PyCharm中的学习】:从【基础到进阶的全面指南】

目录 第一步&#xff1a;基础准备 1.1 Python基础 1.1.1 学习Python的基本语法 变量和数据类型&#xff1a; 1.1.2 控制流 条件语句&#xff1a; 循环语句&#xff1a; 1.1.3 函数和模块 函数&#xff1a; 模块&#xff1a; 1.2 安装PyCharm 1.2.1 下载并安装 第二…

Spring Boot 过滤器和拦截器详解

目录 Spring Boot 过滤器1.什么是过滤器2.工作机制3.实现过滤器 Spring Boot 拦截器1. 什么是拦截器2. 工作原理3.实现4.拓展&#xff08;MethodInterceptor 拦截器&#xff09;实现 过滤器和拦截器区别过滤器和拦截器应用场景过滤器拦截器 Spring Boot 过滤器 1.什么是过滤器 …

从零开始做题:LSB

1 题目 2 解题 2.1 使用stegsolve工具 ┌──(holyeyes㉿kali2023)-[~/Misc/tool-misc] └─$ java -jar Stegsolve.jar 2.1.1 发现R、G、B的plane0有隐藏信息 2.1.2 提取隐藏信息 2.1.3 save bin后得到二维码 2.1.4 QR Research得到flag 3 flag cumtctf{1sb_i4_s0_Ea4y}

leetCode.92. 反转链表 II

leetCode.92. 反转链表 II 题目思路 代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode …

【LeetCode:2742. 给墙壁刷油漆 + 递归 + 记忆化搜索 + dp】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

硬件实用技巧:摄像头常用的输出协议类型和输出接口类型

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140042485 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

正念:照进乌云的阳光,改变你的人生|流静

在人生的旅途中&#xff0c;我们时常遭遇乌云密布的时刻&#xff0c;困厄与挫折如同浓重的阴霾&#xff0c;遮挡了前行的道路。然而&#xff0c;在这黑暗之中&#xff0c;总有一束名为“正念”的阳光&#xff0c;能够穿透云层&#xff0c;照亮我们的内心&#xff0c;引领我们走…

【论文阅读 Validation Free and Replication Robust Volume-based Data Valuation】

论文题目 免验证的对于复制鲁棒性的基于量的数据估值 1. 本文具体贡献 通过数据的体积形式化了数据多样性的度量&#xff0c;并在理论上和实证上证明了体积对数据估值的适用性&#xff1b;形式化了复制鲁棒性的概念&#xff0c;并设计了一种基于稳健体积&#xff08;RV&…

【网络安全的神秘世界】解决dvwa靶场报错:Illegal mix of collations for operation ‘UNION‘

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 &#x1f6a9;问题描述 当尝试执行如下 SQL 语句时&#xff1a; 1 union select schema_name,1 from information_schema.s…

不能创建第三个变量,实现两个数的交换

目录 常规实现两个数的交换&#xff08;如&#xff1a;交换变量a和变量b&#xff09; 方法一&#xff1a;加减法 方法二&#xff1a;异或操作符 常规实现两个数的交换&#xff08;如&#xff1a;交换变量a和变量b&#xff09; 创建一个临时变量tmp&#xff0c;先将其中一个…

SpringBoot 3.3.1 + Minio 实现极速上传和预览模式

统一版本管理 <properties><minio.version>8.5.10</minio.version><aws.version>1.12.737</aws.version><hutool.version>5.8.28</hutool.version> </properties><!--minio --> <dependency><groupId>io.m…

慢动作视频怎么制作?5种方法,轻松制作慢动作视频

在短视频风靡的当下&#xff0c;慢动作视频凭借其独特的视觉效果和引人入胜的节奏感&#xff0c;成为了吸引观众眼球的利器。你是否也想知道如何制作这种令人心动的慢动作视频呢&#xff1f;下面教大家5种能够制作出慢动作视频的方法&#xff0c;一起来学习下吧。 方法一&#…

python(二)手把手导入导出工程

目录 一、导入工程 二、安装相关库 1、打开requirements.txt 文件所在目录 2、ctrlshift鼠标右键&#xff0c;点击&#xff1a; 在此处打开PowerShell窗口 3、pip install -r requirements.txt &#xff0c;回车 三、导出环境 1、使用 requirements.txt导出环境中所有使用…

Spring AI之后,阿里推出Spring Cloud Alibaba AI,接入体验篇——Java也能方便用 AI

阿里推出Spring Cloud Alibaba AI&#xff0c;接入体验篇——Java也能方便用 AI 1.Spring AI2.Spring Cloud Alibaba AI3. 接入体验 1.Spring AI Spring AI 是 Spring 官方社区项目&#xff0c;旨在简化 Java AI 应用程序开发&#xff0c;让 Java 开发者像使用 Spring 开发普通…

【从零开始实现联邦学习】

1. 环境配置如下 python3.7pip install torchpip install torchvision 2. 代码如下 原书的代码存在一点bug&#xff0c;现已被作者修复 Client端代码如下 import torch.utils.dataclass Client(object):def __init__(self,conf,model,train_dataset,id1):self.conf conf …