RedisTemplate的序列化問題研究

RedisTemplate<K, V>

Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
redistemplate<String, Object> 可以將java對象set成json字符串,但是get的時候卻不能直接返回響應的對象,而是一個LinkedHashMap。
1、怎麼樣才能更優雅的用指定的對象接收?
2、key set 1.6  返回是Double類型的1.6, 將key incrby 1.4,現在key的值變成了3, 現在get 返回的是Integer類型的3 。這種存在類型變化的情況,用固定類型不太好接收返回
還是這個問題,怎麼樣優雅的接收返回值。

Jackson 插入的值都帶有雙引號, 類似這種的,"\"1\"" ,不能進行incr incrby系列的操作
127.0.0.1:6379> get testvalue
"1"
127.0.0.1:6379> incrby testvalue 1
ERR value is not an integer or out of range


JdkSerializationRedisSerializer 這個默認的序列化,序列化的字符串帶有type(類型全限定名),表明了當前字符串值是什麼類型。
1、這種帶有type(類型全限定名)數據,如果是自定義對象在不同的系統之間傳遞不太方便(因爲不同的系統之間全限定類名很少一樣的)。
2、hash類型,用put填入的值,帶有type(類型全限定名),不能用increment。 increment的hash,值是字符串的,沒有type

 StringRedisSerializer stringSerializer = new StringRedisSerializer();
 這個序列化的工具只能 set,和get string類型的數據, Integer,Long,自定義對象等等都都不行
 
 
StringRedisTemplate

等同於 RedisTemplate<String, String> 他們只能用StringRedisSerializer,用其他類型的序列化會出現各種各樣的問題。
比如用Jackson2JsonRedisSerializer 獲取json字符的value,會報下面的錯誤
class java.util.LinkedHashMap cannot be cast to class java.lang.String (java.util.LinkedHashMap and java.lang.String are in module java.base of loader 'bootstrap')

問題:怎樣用RedisTemplate優雅的取出想要的數據類型呢?取出數據後不需要強制類型轉換,在redis裏面呈現的數據可讀性高,可以進行incr,incrby等操作。

答案:使用RedisTemplate<String, String> Jackson2JsonRedisSerializer序列化工具或者用StringRedisRemplate,再用fastjson,jackson等序列化工具自己來序列化和反序列化處理。

jedis等其他一些客戶端估計也是這麼一個套路。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章