redis初學(xué)者常見(jiàn)字符亂碼問(wèn)題及解決方案
本文開(kāi)發(fā)環(huán)境介紹
開(kāi)發(fā)依賴(lài) | 版本 |
---|---|
Spring Boot | 2.6.6 |
pom.xml依賴(lài)
<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的問(wèn)題
測(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)); } }
查看寫(xiě)入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\"}"
寫(xiě)一個(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)沒(méi)有,寫(xiě)入redis的數(shù)據(jù)最前面有一個(gè)不認(rèn)識(shí)的字符 \x00
,其實(shí)是想當(dāng)然的用錯(cuò)了方法,正確設(shè)置過(guò)期時(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è)置過(guò)期時(shí)間,再運(yùn)行下
這下就正確了
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Redis數(shù)據(jù)結(jié)構(gòu)之listpack和quicklist使用學(xué)習(xí)
這篇文章主要為大家介紹了Redis數(shù)據(jù)結(jié)構(gòu)之listpack和quicklist的使用學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Redis做數(shù)據(jù)持久化的解決方案及底層原理
Redis有兩種方式來(lái)實(shí)現(xiàn)數(shù)據(jù)的持久化,分別是RDB(Redis Database)和AOF(Append Only File),今天通過(guò)本文給大家聊一聊Redis做數(shù)據(jù)持久化的解決方案及底層原理,感興趣的朋友一起看看吧2021-07-07SpringMVC集成redis配置的多種實(shí)現(xiàn)方法
這篇文章主要介紹了SpringMVC集成redis配置的多種實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Redis中一個(gè)String類(lèi)型引發(fā)的慘案
著存儲(chǔ)的數(shù)據(jù)量越來(lái)越大,Redis的內(nèi)存的使用量也快速上升,結(jié)果遇到了大內(nèi)存Redis實(shí)例因?yàn)樯蒖DB而響應(yīng)變慢的問(wèn)題。很顯然String類(lèi)型并不是一種好的選擇,那有什么辦法可以降低內(nèi)存消耗嗎?帶著這個(gè)問(wèn)題一起通過(guò)本文學(xué)習(xí)下吧2021-07-07Redis的數(shù)據(jù)復(fù)制過(guò)程詳解
Redis 的復(fù)制功能分為同步(sync)和命令傳播(command propagate)這兩個(gè)操作,這篇文章主要介紹了Redis的數(shù)據(jù)復(fù)制,需要的朋友可以參考下2022-12-12