文章讲述了在项目中使用Jedis和Lettuce处理Lua脚本时遇到的跨slot错误,由于RedisCluster的键空间划分,多键操作受限于哈希槽。作者解释了问题的原因,即键必须位于同一哈希槽中,以及如何通过散列标签来解决。参考了Redis官方文档和StackOverflow资源。 摘要由CSDN通过智能技术生成

项目使用jedis,执行lua脚本报错:No way to dispatch this command to Redis Cluster because keys have different slots.

jedis版本如下

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.6.3</version>
</dependency>

查了下报错原因,是 JedisCluster不支持涉及不同slot上多个key的脚本 ,于是切lettuce

lettuce版本如下

<dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId>
    <version>6.2.3.RELEASE-h1</version>
</dependency>

切完还是报错:io.lettuce.core.RedisCommandExecutionException: CROSSSLOT Keys in request don't hash to the same slot

在集群拓扑中,keyspace 被划分为哈希槽,不同的节点将持有哈希槽的子集。涉及多个键的多键操作、事务或Lua脚本只有在所有涉及的键都在属于同一节点的哈希槽中时才被允许

哈希标签是一种确保多个键分配在同一个哈希槽中的方法。这是为了在Redis Cluster中实现多键操作

为了实现散列标签,在某些条件下,key的散列槽的计算方式略有不同。如果键包含“{...}”模式,则只对{和}之间的子字符串进行哈希运算,以获得哈希槽

Redis Cross Slot error - Stack Overflow

Redis cluster specification | Redis

最近,一个同事开发的SparkStreaming程序,在使用JPools 工具包处理 redis ,来删除一条哈希 hset插入的数据时,报了如下错误: Caused by: redis .clients.jedis.exceptions.Jedis Cluster Exception: No way to dispatch this command to Redis Cluster because key s have diff erent slots . 错误直译: 引起: redis .clients.jedis.e
解决办法 :所有的集合和有序集合 key 都加一个前缀,是的所有的数据都在一个 redis 集群的终端。 private static final String prefix = "luffi:lbl"; private static final String KEY _SPLIT = ":"; //用于隔开缓存前缀与缓存键值 //将文章放入时间排列表中 jedis Cluster .zadd("{" + prefix + KEY _SPLIT + "}" + "time", Double
解决办法,推荐更改 redis 的驱动修改为: lettuce lettuce 项目地址:https://github.com/lettuce-io 建议使用最新版本;3.x, 4.x版本 和5.x 不兼容,建议使用5.x的最新版本 使用jedis Cluster 的mget操作报如下 异常 EvalSha is not supported in cluster environment No way to dispatch this command to Redis Cluster because key s have diff erent slots Jedis does not support password protected Redis Cluster configurations! 背景:最近项目新引入 redis ,代码中为了保证 redis 原子操作,大部分操作
以下纯属个人观点,如有错误或疑问,非常欢迎和感谢指正与讨论 1. 对数据较大,如百万级、千万级的value一定要考虑分片。制定分片均匀的方案,键的设计可为固定键加分片位,value最好不要超过10W。 这样可以将一个大的计算任务分为多个小的计算任务,(很多公司的 redis 服务器应该都是有超时策略的)不会过度影响到读请求。也可以采用读写分离,计算任务放到一个 redis 服务器,读请求放到另一台服务器
redis Java 客户端 (jedis): ->使用set(String key , String Value)将大量的 key -value写入 redis 中,受限于网络IO,400万的数据需要2个小时写入; ->hmset(String key , Map<String, String>)对于 Java 客户端 来说能够很快的进行写入(对于vaid下的fields-values和oai...
一、现象: 我们的 redis 私有云,对外提供了 redis -standalone, redis -sentinel, redis - cluster 三种类型的 redis 服务。 其中 redis - cluster , 使用的版本是 Red...
Redis 单机是支持事务的, Redis 的事务是下面 4 个命令来实现: 1.multi开启 Redis 的事务,置 客户端 为事务态。 2.exec提交事务,执行从 multi 到此命令前的命令队列,置 客户端 为非事务态。 3.discard取消事务,置 客户端 为非事务态。 4.watch监视键值对,作用时如果事务提交 exec 时发现监视的键值对发生变化,事务将被取消。 将是否有 watch 命令分为普通类型事务和 CAS(Check An...
org.springframework.data. redis . Redis SystemException: Unable to write command into connection!
org.springframework.data. redis . Redis SystemException是Spring Data Redis 框架中的一个 异常 类表示在与 Redis 连接时发生了写入命令失败的情况。 通常情况下,这个 异常 是由于以下原因之一引起的: 1. Redis 服务器连接问题:可能是由于网络故障、 Redis 服务器宕机或者连接超时等原因导致无法与 Redis 建立连接。 2. Redis 命令写入失败:可能是由于 Redis 服务器内部错误、 Redis 命令执行超时或者 Redis 服务器内存不足等原因导致写入命令失败。 解决这个 异常 的方法可以包括: 1. 检查 Redis 服务器的状态:确保 Redis 服务器正常运行,并且网络连接正常。 2. 检查 Redis 配置:检查 Redis 服务器的配置文件,确保配置正确,并且内存设置合理。 3. 检查网络连接:如果是网络连接问题,可以尝试重新连接或者检查网络设置。 4. 检查 Redis 命令执行情况:如果是由于 Redis 命令执行失败导致的 异常 可以检查 Redis 服务器的日志,查看是否有相关错误信息。 5. 更新Spring Data Redis 版本:如果是由于框架本身的问题导致的 异常 ,可以尝试更新Spring Data Redis 的版本,以获取修复的bug或者改进的功能。 --相关--: 1. 什么是Spring Data Redis ? 2. Redis 是什么?有什么特点3. 如何在Spring Boot项目中使用Spring Data Redis ? 4. 如何处理 Redis 连接超时的问题?