詳解Redis中數(shù)值亂碼的根本原因以及解決方式
1. 問題所示
某些信息存儲在緩存中,對此修改緩存,想通過可視化的Redis Desktop來操作,但是發(fā)現(xiàn)都是二進(jìn)制的數(shù)據(jù),不好操作:
于是想著以命令行的方式修改,但又怕改錯(cuò),畢竟都是難以讀懂的二進(jìn)制數(shù)據(jù),如圖所示:(由于信息比較隱私,此處打碼了)
2. 原理分析
RedisTemplate
存儲的數(shù)據(jù)通常是二進(jìn)制的。Redis 是一個(gè)鍵值存儲系統(tǒng),它存儲的值可以是字符串、二進(jìn)制數(shù)據(jù)、甚至是序列化的對象。
RedisTemplate
是 Spring Data Redis 提供的一個(gè)類,用于在 Spring 應(yīng)用中與 Redis 進(jìn)行交互。
它提供了一種在 Java 對象和 Redis 數(shù)據(jù)之間進(jìn)行序列化和反序列化的機(jī)制。
默認(rèn)情況下,RedisTemplate
使用 JDK 的序列化機(jī)制將 Java 對象轉(zhuǎn)換為二進(jìn)制數(shù)據(jù),并存儲在 Redis 中。
3. 拓展
在使用Redis作為數(shù)據(jù)存儲時(shí),合理的鍵值序列化配置和RedisTemplate
的使用方式對于應(yīng)用性能和數(shù)據(jù)可維護(hù)性至關(guān)重要。
默認(rèn)情況下,Spring Data Redis使用JdkSerializationRedisSerializer
作為RedisTemplate
的默認(rèn)序列化器
這意味著鍵和值都將以Java對象的二進(jìn)制形式進(jìn)行序列化,并以字節(jié)流的方式存儲在Redis中。
不對值進(jìn)行額外序列化的理由
:雖然值以二進(jìn)制形式存儲,但在Java代碼中獲取值時(shí)會(huì)進(jìn)行反序列化,因此這不會(huì)影響業(yè)務(wù)邏輯和數(shù)據(jù)的正確性。
同時(shí),對值進(jìn)行額外的序列化可能會(huì)限制存儲的數(shù)據(jù)類型,例如將值序列化為字符串將僅能存儲字符串類型的值。額外序列化的場景
如果需要存儲復(fù)雜的數(shù)據(jù)結(jié)構(gòu)或非字符串類型的值,可以選擇配置RedisTemplate
使用其他序列化器,例如JSON序列化器或自定義序列化器。- 這樣可以更靈活地存儲各種類型的數(shù)據(jù),但需要注意在讀取時(shí)正確地反序列化。
特殊值的處理
對于包含特殊類型(如LocalDateTime、LocalDate、LocalTime等)的值,可能需要注意轉(zhuǎn)換為字符串或選擇合適的序列化方式。
通過理解Redis默認(rèn)行為和靈活運(yùn)用RedisTemplate
,可以更好地應(yīng)對不同類型數(shù)據(jù)的存儲需求,從而優(yōu)化系統(tǒng)性能并提升開發(fā)效率
給出一個(gè)Demo代碼更加容易懂:
先引入這兩個(gè)依賴包:
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>2.6.5.RELEASE</version> <!-- 使用你項(xiàng)目中的實(shí)際版本 --> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.7.0</version> <!-- 使用你項(xiàng)目中的實(shí)際版本 --> </dependency>
對key進(jìn)行可視化:
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; public class Demo { public static void main(String[] args) { // 創(chuàng)建 Redis 連接配置 JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(); jedisConnectionFactory.setHostName("localhost"); jedisConnectionFactory.setPort(6379); // jedisConnectionFactory.setPassword(RedisPassword.of("your-redis-password")); // 手動(dòng)調(diào)用 afterPropertiesSet() jedisConnectionFactory.afterPropertiesSet(); // 創(chuàng)建 RedisTemplate 實(shí)例 RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); //設(shè)置String類型的key設(shè)置序列化器 redisTemplate.setKeySerializer(new StringRedisSerializer()); //設(shè)置Hash類型的key設(shè)置序列化器 redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setConnectionFactory(jedisConnectionFactory); redisTemplate.afterPropertiesSet(); // 存儲字符串 redisTemplate.opsForValue().set("message", "Hello, Redis!"); // 獲取字符串 String message = (String) redisTemplate.opsForValue().get("message"); System.out.println("Message: " + message); // 存儲哈希 HashOperations<String, String, String> hashOperations = redisTemplate.opsForHash(); hashOperations.put("user", "id", "1"); hashOperations.put("user", "name", "碼農(nóng)研究僧"); // 獲取哈希 String userId = hashOperations.get("user", "id"); String userName = hashOperations.get("user", "name"); System.out.println("User ID: " + userId); System.out.println("User Name: " + userName); } }
如果不對key可視化,只需要?jiǎng)h除這兩行代碼即可:
//設(shè)置String類型的key設(shè)置序列化器 redisTemplate.setKeySerializer(new StringRedisSerializer()); //設(shè)置Hash類型的key設(shè)置序列化器 redisTemplate.setHashKeySerializer(new StringRedisSerializer());
截圖如下:
以上就是詳解Redis中數(shù)值亂碼的根本原因以及解決方式的詳細(xì)內(nèi)容,更多關(guān)于Redis數(shù)值亂碼的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Redis鍵遷移(move、dump、restore、migrate)的三種實(shí)現(xiàn)
鍵遷移就是把數(shù)據(jù)由一個(gè)Redis遷移到另一個(gè)Redis,本文主要介紹了Redis鍵遷移(move、dump、restore、migrate)的三種實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04Redis進(jìn)行緩存操作的實(shí)現(xiàn)
本文主要介紹了Redis進(jìn)行緩存操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializ
本文主要介紹了Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializer區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Windows操作系統(tǒng)下Redis服務(wù)安裝圖文教程
這篇文章主要介紹了Windows操作系統(tǒng)下Redis服務(wù)安裝圖文教程,文中給大家提供了redis的下載地址,安裝程序步驟,需要的朋友可以參考下2018-03-03Redis 使用跳表實(shí)現(xiàn)有序集合的方法
Redis有序集合底層為什么使用跳表而非其他數(shù)據(jù)結(jié)構(gòu)如平衡樹、紅黑樹或B+樹的原因在于其特殊的設(shè)計(jì)和應(yīng)用場景,跳表提供了與平衡樹類似的效率,同時(shí)實(shí)現(xiàn)更簡單,調(diào)試和修改也更加容易,感興趣的朋友一起看看吧2024-09-09