日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis Template使用append方法不起作用的解决办法以及序列化/反序列化的解释

發布時間:2025/4/5 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis Template使用append方法不起作用的解决办法以及序列化/反序列化的解释 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天使用Redis Template進行測試發現的問題,
遇到這個錯

org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Unrecognized token 'testtest': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')

從github復制過來清除空格后解決,如果沒有解決,下面配置序列化可能有所幫助。

調用該測試時出現append方法沒用

//不報錯,append不管用@Testpublic void string5() {redisTemplate.opsForValue().set("k", "test");redisTemplate.opsForValue().append("k","test");System.out.println(redisTemplate.opsForValue().get("k"));redisTemplate.opsForValue().append("k","nihaoya");System.out.println(redisTemplate.opsForValue().get("k"));}

需要進行配置

//值采用Json序列template.setValueSerializer(jackson2JsonRedisSerializer);

修改為如下形式得以解決

template.setValueSerializer(new StringRedisSerializer());

解釋如下:

關于數據的“序列化/反序列化”,提供了多種可選擇策略(RedisSerializer)

序列化/發序列化解釋
JdkSerializationRedisSerializerPOJO對象的存取場景,使用JDK本身序列化機制,將pojo類通過ObjectInputStream/ObjectOutputStream進行序列化操作,最終redis-server中將存儲字節序列。
StringRedisSerializer適用于Key或者value為字符串的場景,根據指定的charset對數據的字節序列編碼成string
JacksonJsonRedisSerializer提供了javabean與json之間的轉換能力,可以將pojo實例序列化成json格式存儲在redis中,也可以將json格式的數據轉換成pojo實例。
OxmSerializer提供了將javabean與xml之間的轉換能力,目前可用的三方支持包括jaxb,apache-xmlbeans;redis存儲的數據將是xml工具。

上面4種策略中:

JdkSerializationRedisSerializer和StringRedisSerializer是最基礎的策略,在設計時仍然不推薦直接使用后面兩種,即JacksonJsonRedisSerializer和OxmSerializer,因為無論是json還是xml,他們本身仍然是String。

如果數據需要被第三方工具解析,那么數據應該使用StringRedisSerializer而不是JdkSerializationRedisSerializer。

如果數據格式必須為json或者xml,那么在編程級別,在redisTemplate配置中仍然使用StringRedisSerializer,在存儲之前或者讀取之后,使用“SerializationUtils”工具轉換轉換成json或者xml

最后附上配置信息

@Beanpublic RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {//配置連接工廠StringRedisTemplate template = new StringRedisTemplate(factory);//使用Jackson2JsonRedisSerializer來序列化和反序列化redis 的value值Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();//指定要序列化的域,field,get和set,以及修飾符范圍om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);//om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);//指定序列化輸入的類型,類必須是非final類om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance ,ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);jackson2JsonRedisSerializer.setObjectMapper(om);//序列化配置為String格式template.setValueSerializer(new StringRedisSerializer());//template.setKeySerializer(new StringRedisSerializer());template.afterPropertiesSet();return template;}

參考博客:RedisTemplate用法詳解

總結

以上是生活随笔為你收集整理的Redis Template使用append方法不起作用的解决办法以及序列化/反序列化的解释的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。