文章讲述了在项目中使用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
连接超时的问题?