redis初學(xué)者常見字符亂碼問題及解決方案
本文開發(fā)環(huán)境介紹
| 開發(fā)依賴 | 版本 |
|---|---|
| Spring Boot | 2.6.6 |
pom.xml依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>redis保存數(shù)據(jù)后出現(xiàn)\xac\xed\x00\x05t\x00的問題
測(cè)試代碼
public class RedisTemplateTest extends DemoRedisTestBase {
@SneakyThrows
@Test
void testSet() {
String key = String.join(":", "user", RandomStringUtils.randomAlphabetic(10));
Map<String, String> value = new HashMap<>();
value.put("id", RandomStringUtils.randomAlphabetic(10));
value.put("name", RandomStringUtils.randomAlphabetic(10));
redisTemplate.opsForValue().set(key, objectMapper.writeValueAsString(value));
}
}查看寫入redis的數(shù)據(jù)
127.0.0.1:6379> keys *user* 1) "\xac\xed\x00\x05t\x00\x0fuser:mnaurYPzBt"
這是因?yàn)槟J(rèn)把key和value的值序列化成**byte[]**格式。
解決辦法
@Configuration
public class RedisTemplateBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if(RedisTemplate.class.isAssignableFrom(bean.getClass())) {
RedisTemplate redisTemplate = (RedisTemplate)bean;
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setValueSerializer(stringRedisSerializer);
}
return bean;
}
}再次運(yùn)行測(cè)試代碼,結(jié)果如下
127.0.0.1:6379> keys *user*
1) "user:PvwBNJFUKn"
2) "\xac\xed\x00\x05t\x00\x0fuser:mnaurYPzBt"
127.0.0.1:6379> get user:PvwBNJFUKn
"{\"name\":\"mfEESamnux\",\"id\":\"OFPcKTgwAm\"}"
寫一個(gè)帶有效期的數(shù)據(jù)
public class RedisTemplateTest extends DemoRedisTestBase {
@SneakyThrows
@Test
void testSet() {
String key = String.join(":", "user", RandomStringUtils.randomAlphabetic(10));
Map<String, String> value = new HashMap<>();
value.put("id", RandomStringUtils.randomAlphabetic(10));
value.put("name", RandomStringUtils.randomAlphabetic(10));
redisTemplate.opsForValue().set(key, objectMapper.writeValueAsString(value), 1L);
String json = redisTemplate.opsForValue().get(key);
System.out.println(json);
}
}指定了第3個(gè)參數(shù) 1L ,運(yùn)行查看數(shù)據(jù)

發(fā)現(xiàn)沒有,寫入redis的數(shù)據(jù)最前面有一個(gè)不認(rèn)識(shí)的字符 \x00 ,其實(shí)是想當(dāng)然的用錯(cuò)了方法,正確設(shè)置過期時(shí)間的姿勢(shì)應(yīng)該是這樣
public class RedisTemplateTest extends DemoRedisTestBase {
@SneakyThrows
@Test
void testSet() {
String key = String.join(":", "user", RandomStringUtils.randomAlphabetic(10));
Map<String, String> value = new HashMap<>();
value.put("id", RandomStringUtils.randomAlphabetic(10));
value.put("name", RandomStringUtils.randomAlphabetic(10));
redisTemplate.opsForValue().set(key, objectMapper.writeValueAsString(value), 1L, TimeUnit.DAYS);
String json = redisTemplate.opsForValue().get(key);
System.out.println(json);
}
}應(yīng)該使用這個(gè)4個(gè)參數(shù)的方法才是設(shè)置過期時(shí)間,再運(yùn)行下

這下就正確了
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
小白也能看懂的Redis遍歷鍵和數(shù)據(jù)庫管理詳解
這篇文章主要為大家介紹了小白也能看懂的Redis遍歷鍵和數(shù)據(jù)庫管理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Redis做數(shù)據(jù)持久化的解決方案及底層原理
Redis有兩種方式來實(shí)現(xiàn)數(shù)據(jù)的持久化,分別是RDB(Redis Database)和AOF(Append Only File),今天通過本文給大家聊一聊Redis做數(shù)據(jù)持久化的解決方案及底層原理,感興趣的朋友一起看看吧2021-07-07
Redis?sentinel哨兵集群的實(shí)現(xiàn)步驟
本文主要介紹了Redis?sentinel哨兵集群的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
redis主從切換導(dǎo)致的數(shù)據(jù)丟失與陷入只讀狀態(tài)故障解決方案
這篇文章主要介紹了redis主從切換導(dǎo)致的數(shù)據(jù)丟失與陷入只讀狀態(tài)故障解決方案的相關(guān)資料,需要的朋友可以參考下2023-05-05
Redis過期監(jiān)聽機(jī)制,訂單超時(shí)自動(dòng)取消方式
這篇文章主要介紹了Redis過期監(jiān)聽機(jī)制,訂單超時(shí)自動(dòng)取消方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
高并發(fā)場(chǎng)景分析之redis+lua防重校驗(yàn)
這篇文章主要介紹了高并發(fā)場(chǎng)景分析之redis+lua防重校驗(yàn),本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
用Lua腳本實(shí)現(xiàn)Redis原子操作的示例
本文主要介紹了用Lua腳本實(shí)現(xiàn)Redis原子操作的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03

