Redis Template使用append方法不起作用的解决办法以及序列化/反序列化的解释
今天使用Redis Template進(jìn)行測(cè)試發(fā)現(xiàn)的問(wèn)題,
遇到這個(gè)錯(cuò)
從github復(fù)制過(guò)來(lái)清除空格后解決,如果沒有解決,下面配置序列化可能有所幫助。
調(diào)用該測(cè)試時(shí)出現(xiàn)append方法沒用
//不報(bào)錯(cuò),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"));}需要進(jìn)行配置
將
修改為如下形式得以解決
template.setValueSerializer(new StringRedisSerializer());解釋如下:
關(guān)于數(shù)據(jù)的“序列化/反序列化”,提供了多種可選擇策略(RedisSerializer)
| JdkSerializationRedisSerializer | POJO對(duì)象的存取場(chǎng)景,使用JDK本身序列化機(jī)制,將pojo類通過(guò)ObjectInputStream/ObjectOutputStream進(jìn)行序列化操作,最終redis-server中將存儲(chǔ)字節(jié)序列。 |
| StringRedisSerializer | 適用于Key或者value為字符串的場(chǎng)景,根據(jù)指定的charset對(duì)數(shù)據(jù)的字節(jié)序列編碼成string |
| JacksonJsonRedisSerializer | 提供了javabean與json之間的轉(zhuǎn)換能力,可以將pojo實(shí)例序列化成json格式存儲(chǔ)在redis中,也可以將json格式的數(shù)據(jù)轉(zhuǎn)換成pojo實(shí)例。 |
| OxmSerializer | 提供了將javabean與xml之間的轉(zhuǎn)換能力,目前可用的三方支持包括jaxb,apache-xmlbeans;redis存儲(chǔ)的數(shù)據(jù)將是xml工具。 |
上面4種策略中:
JdkSerializationRedisSerializer和StringRedisSerializer是最基礎(chǔ)的策略,在設(shè)計(jì)時(shí)仍然不推薦直接使用后面兩種,即JacksonJsonRedisSerializer和OxmSerializer,因?yàn)闊o(wú)論是json還是xml,他們本身仍然是String。
如果數(shù)據(jù)需要被第三方工具解析,那么數(shù)據(jù)應(yīng)該使用StringRedisSerializer而不是JdkSerializationRedisSerializer。
如果數(shù)據(jù)格式必須為json或者xml,那么在編程級(jí)別,在redisTemplate配置中仍然使用StringRedisSerializer,在存儲(chǔ)之前或者讀取之后,使用“SerializationUtils”工具轉(zhuǎn)換轉(zhuǎn)換成json或者xml
最后附上配置信息
@Beanpublic RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {//配置連接工廠StringRedisTemplate template = new StringRedisTemplate(factory);//使用Jackson2JsonRedisSerializer來(lái)序列化和反序列化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用法詳解
總結(jié)
以上是生活随笔為你收集整理的Redis Template使用append方法不起作用的解决办法以及序列化/反序列化的解释的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SpringBoot使用Redis和My
- 下一篇: Redis简介和Redis Templa