| redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key holding the wrong kind of value
我們來(lái)探究一下這個(gè)錯(cuò)誤,一步一步分析 首先看一下異常名稱 “JedisDataException”,很明顯,是Jedis數(shù)據(jù)異常,再看后面提示 “對(duì)持有錯(cuò)誤類型值的鍵執(zhí)行的錯(cuò)誤類型操作” ,異常錯(cuò)誤原因就已經(jīng)出來(lái)了
 操作的類型與當(dāng)前的類型不一致導(dǎo)致的,或者說(shuō)使用了不同類型下的命令,操作了類外一種類型的數(shù)據(jù)(也就是說(shuō)使用了string的命令,操作了set的數(shù)據(jù))。
 打個(gè)比方:我們這里計(jì)算一個(gè)秒殺事件,計(jì)算庫(kù)存,庫(kù)存是String對(duì)象
 public static boolean dosk(String proId) throws IOException {
String proIdKey = "sk:"   proId  ":kc";  //這里計(jì)算的是一個(gè)庫(kù)存量的key
Jedis jedis = new Jedis("192.168.4.176", 6379);
//監(jiān)視庫(kù)存
jedis.watch(proIdKey );
//獲取庫(kù)存
String kc = jedis.get(proIdKey );
省略一大段無(wú)關(guān)代碼............
//庫(kù)存大于0,減庫(kù)存,加人
Transaction transaction = jedis.multi(); //開啟事務(wù)
(異常報(bào)錯(cuò)點(diǎn))
transaction.decr(proIdKey ); //減去庫(kù)存   (異常報(bào)錯(cuò)點(diǎn))
List<Object> exec = transaction.exec(); //執(zhí)行
 
transaction.decr(proIdKey );為什么這段代碼是異常報(bào)錯(cuò)點(diǎn)呢?因?yàn)檫@里操作了一個(gè)proIdKey對(duì)象,是String類型的,用的是decr命令(String的命令)
 我們轉(zhuǎn)過(guò)來(lái)看一下自己redis里面怎么設(shè)置數(shù)據(jù)的
 127.0.0.1:6379> sadd sk:0101:kc 10
(integer) 1
 
redis設(shè)置的 proIdKey(庫(kù)存) 是set類型,所以我在操作proIdKey(庫(kù)存)的時(shí)候,也就報(bào)錯(cuò)了,主要原因是,我eclipse里面使用的是 decr 命令(String類型的命令)
 但是我們操作的數(shù)據(jù)(proIdKey)在redis里面是以set類型存放的,所以,造成使用了不同類型下的命令,操作了類外一種類型的數(shù)據(jù)(也就是說(shuō)使用了string的命令,操作了set的數(shù)據(jù))。
 
所以只要將數(shù)據(jù)類型改一下就可以了,要么改redis存放的數(shù)據(jù)類型,要么改eclipse操作的數(shù)據(jù)類型,然后使用正確的命令去操作。我這里只要把庫(kù)存的類型在redis里面改為String就可以了
 127.0.0.1:6379> set sk:0101:kc 10
OK
 希望我的解答對(duì)大家有幫助,有疑問或者建議可以評(píng)論噢?。?!來(lái)源:https://www./content-4-857451.html |