Redis—JedisDataException异常
redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key holding the wrong kind of value我们来探究一下这个错误,一步一步分析 首先看一下异常名称 “JedisDataException”,很明显,是Jedis数据异常,再看后面提示 “对持有错误类型值的键执
redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key holding the wrong kind of value
我们来探究一下这个错误,一步一步分析 首先看一下异常名称 “JedisDataException”,很明显,是Jedis数据异常,
再看后面提示 “对持有错误类型值的键执行的错误类型操作” ,异常错误原因就已经出来了
操作的类型与当前的类型不一致导致的,或者说使用了不同类型下的命令,操作了类外一种类型的数据(也就是说使用了string的命令,操作了set的数据)。
打个比方:
我们这里计算一个秒杀事件,计算库存,库存是String对象
public static boolean dosk(String proId) throws IOException {
String proIdKey = "sk:" + proId+ ":kc"; //这里计算的是一个库存量的key
Jedis jedis = new Jedis("192.168.4.176", 6379);
//监视库存
jedis.watch(proIdKey );
//获取库存
String kc = jedis.get(proIdKey );
省略一大段无关代码............
//库存大于0,减库存,加人
Transaction transaction = jedis.multi(); //开启事务
(异常报错点)
transaction.decr(proIdKey ); //减去库存 (异常报错点)
List<Object> exec = transaction.exec(); //执行
transaction.decr(proIdKey );
为什么这段代码是异常报错点呢?因为这里操作了一个proIdKey对象,是String类型的,用的是decr命令(String的命令)
我们转过来看一下自己redis里面怎么设置数据的
127.0.0.1:6379> sadd sk:0101:kc 10
(integer) 1
redis设置的 proIdKey(库存) 是set类型,所以我在操作
proIdKey(库存)的时候,也就报错了,主要原因是,我eclipse里面使用的是 decr 命令(String类型的命令)
但是我们操作的数据(proIdKey)在redis里面是以set类型存放的,所以,造成使用了不同类型下的命令,操作了类外一种类型的数据(也就是说使用了string的命令,操作了set的数据)。
所以只要将数据类型改一下就可以了,要么改redis存放的数据类型,要么改eclipse操作的数据类型,然后使用正确的命令去操作。
我这里只要把库存的类型在redis里面改为String就可以了
127.0.0.1:6379> set sk:0101:kc 10
OK
希望我的解答对大家有帮助,有疑问或者建议可以评论噢!!!
更多推荐
所有评论(0)