JedisDataException

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";  //这里计算的是一个库存量的keyJedis 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 10OK

希望我的解答对大家有帮助,有疑问或者建议可以评论噢!!!

来源:https://www.icode9.com/content-4-857451.html

(0)

相关推荐