Java使用RedisTemplate操作Redis遇到的坑
坑一
方法:
直接使用注入的方式
@AutoWired private RedisTemplate redisTemplate;
異常現(xiàn)象:
key會(huì)出現(xiàn)亂碼
127.0.0.1:6379> keys *
1) "\xac\xed\x00\x05t\x00\x04name"
原因:
spring-data-redis的RedisTemplate<K, V>模板類在操作redis時(shí)默認(rèn)使用JdkSerializationRedisSerializer來進(jìn)行序列化
解決:
自定義RestTemplate,使用GenericJackson2JsonRedisSerializer解決序列化問題,注入的@AutoWired private RedisTemplate redisTemplate;其實(shí)是自定義的RestTemplate,
注意事項(xiàng):
@Bean注入的bean是方法名,所以要目方法名寫成restTemplate,要么寫自定義的(如restTemplateInit()),在注入的時(shí)候就要用@Resources(name="restTemplateInit")
package com.example.demo.config;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
@Data
@Component
@Configuration
@Slf4j
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// // 使用Jackson2JsonRedisSerialize 替換默認(rèn)序列化
// Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//
// ObjectMapper objectMapper = new ObjectMapper();
// objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
//
// jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// 設(shè)置value的序列化規(guī)則和 key的序列化規(guī)則
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setDefaultSerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setEnableDefaultSerializer(true);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}坑二、用StringRedisTemplate和RedisTemplate取值賦值問題
redisTemplate.opsForValue().set("test1", "123");
redisTemplate.opsForValue().set("test2", ayUser);//stringRedisTemplate.opsForValue().set("test3", "{\"name\":\"jack\"}");
//value設(shè)置成{\"name\":\"jack\"}這樣的json也沒用,需要帶上序列化的類,像下面這樣
stringRedisTemplate.opsForValue().set("test3", "{\"@class\":\"com.example.demo.model.AyUser\",\"id\":null,\"name\":\"shenzhen\",\"password\":null}");
System.out.println((String) redisTemplate.opsForValue().get("test1"));//123
System.out.println(stringRedisTemplate.opsForValue().get("test1"));//"123"
System.out.println((AyUser) redisTemplate.opsForValue().get("test2"));//AyUser(id=null, name=shenzhen, password=null)
System.out.println(redisTemplate.opsForValue().get("test3"));//AyUser(id=null, name=shenzhen, password=null)
System.out.println(stringRedisTemplate.opsForValue().get("test3"));//{"@class":"com.example.demo.model.AyUser","id":null,"name":"shenzhen","password":null}使用上面注入的自定義的RedisTemplate都是可以反序列化成功的,如下!
但是使用的stringRedisTemplate雖然set的是返祖json格式的且?guī)蛄谢?,但是不能直接通過強(qiáng)轉(zhuǎn)實(shí)現(xiàn)(AyUser),需要通過com.alibaba.fastjson.JSON去反序列化
AyUser ayUser_3_0 = JSON.parseObject(stringRedisTemplate.opsForValue().get("test3_0"), AyUser.class);通過ayUser_3_0.getName()就可以取到。
AyUser ayUser_2 = (AyUser) redisTemplate.opsForValue().get("test2");//ayUser_2.getName()
AyUser ayUser_3 = (AyUser) redisTemplate.opsForValue().get("test3");//ayUser_3.getName()
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Java使用RedisTemplate如何根據(jù)前綴獲取key列表
- 使用redisTemplate從redis獲取所有數(shù)據(jù)
- SpringBoot整合Redis使用RedisTemplate和StringRedisTemplate
- Java中StringRedisTemplate和RedisTemplate的區(qū)別及使用方法
- 使用StringRedisTemplate操作Redis方法詳解
- Spring Boot中RedisTemplate的使用示例詳解
- Spring中RedisTemplate使用方法詳解
- Redis使用RedisTemplate導(dǎo)致key亂碼問題解決
- RedisTemplate的使用與注意事項(xiàng)小結(jié)
相關(guān)文章
Java中notify和notifyAll的區(qū)別及何時(shí)使用
本文主要介紹了Java中notify和notifyAll的區(qū)別及何時(shí)使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Java中的方法引用操作符(::)詳解與實(shí)戰(zhàn)應(yīng)用小結(jié)
在Java 8中引入的::操作符是方法引用(Method Reference)的語法表示,它是Lambda表達(dá)式的一種簡(jiǎn)化形式,本文給大家介紹Java中的方法引用操作符(::)詳解與實(shí)戰(zhàn)應(yīng)用小結(jié),感興趣的朋友跟隨小編一起看看吧2025-09-09
多個(gè)springboot項(xiàng)目如何使用一個(gè)外部共同的application.yml
這篇文章主要介紹了多個(gè)springboot項(xiàng)目如何使用一個(gè)外部共同的application.yml問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
IDEA編譯報(bào)錯(cuò): Error:(2048,1024) java: 找不到符號(hào)的解決辦法
這篇文章主要介紹了IDEA編譯報(bào)錯(cuò): Error:(2048,1024) java: 找不到符號(hào)的解決辦法,提供了詳細(xì)的排查步驟和代碼示例,幫助開發(fā)者快速定位和解決該問題,需要的朋友可以參考下2025-05-05
淺談@RequestParam 參數(shù)是否必須傳的問題
這篇文章主要介紹了淺談@RequestParam 參數(shù)是否必須傳的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02
java使用poi自定義excel標(biāo)題頭并導(dǎo)出方式
這篇文章主要介紹了java使用poi自定義excel標(biāo)題頭并導(dǎo)出方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
java文件刪除不了File類的delete方法刪不掉文件的原因以及分析
這篇文章主要介紹了java文件刪除不了File類的delete方法刪不掉文件的原因以及分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
IDEA生成項(xiàng)目后出現(xiàn)的iml和idea文件問題
這篇文章主要介紹了IDEA生成項(xiàng)目后出現(xiàn)的iml和idea文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08

