詳解Redis中數(shù)值亂碼的根本原因以及解決方式
1. 問題所示
某些信息存儲在緩存中,對此修改緩存,想通過可視化的Redis Desktop來操作,但是發(fā)現(xiàn)都是二進(jìn)制的數(shù)據(jù),不好操作:
于是想著以命令行的方式修改,但又怕改錯,畢竟都是難以讀懂的二進(jìn)制數(shù)據(jù),如圖所示:(由于信息比較隱私,此處打碼了)
2. 原理分析
RedisTemplate
存儲的數(shù)據(jù)通常是二進(jìn)制的。Redis 是一個鍵值存儲系統(tǒng),它存儲的值可以是字符串、二進(jìn)制數(shù)據(jù)、甚至是序列化的對象。
RedisTemplate
是 Spring Data Redis 提供的一個類,用于在 Spring 應(yīng)用中與 Redis 進(jìn)行交互。
它提供了一種在 Java 對象和 Redis 數(shù)據(jù)之間進(jìn)行序列化和反序列化的機制。
默認(rèn)情況下,RedisTemplate
使用 JDK 的序列化機制將 Java 對象轉(zhuǎn)換為二進(jìn)制數(shù)據(jù),并存儲在 Redis 中。
3. 拓展
在使用Redis作為數(shù)據(jù)存儲時,合理的鍵值序列化配置和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代碼中獲取值時會進(jìn)行反序列化,因此這不會影響業(yè)務(wù)邏輯和數(shù)據(jù)的正確性。
同時,對值進(jìn)行額外的序列化可能會限制存儲的數(shù)據(jù)類型,例如將值序列化為字符串將僅能存儲字符串類型的值。額外序列化的場景
如果需要存儲復(fù)雜的數(shù)據(jù)結(jié)構(gòu)或非字符串類型的值,可以選擇配置RedisTemplate
使用其他序列化器,例如JSON序列化器或自定義序列化器。- 這樣可以更靈活地存儲各種類型的數(shù)據(jù),但需要注意在讀取時正確地反序列化。
特殊值的處理
對于包含特殊類型(如LocalDateTime、LocalDate、LocalTime等)的值,可能需要注意轉(zhuǎn)換為字符串或選擇合適的序列化方式。
通過理解Redis默認(rèn)行為和靈活運用RedisTemplate
,可以更好地應(yīng)對不同類型數(shù)據(jù)的存儲需求,從而優(yōu)化系統(tǒng)性能并提升開發(fā)效率
給出一個Demo代碼更加容易懂:
先引入這兩個依賴包:
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>2.6.5.RELEASE</version> <!-- 使用你項目中的實際版本 --> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.7.0</version> <!-- 使用你項目中的實際版本 --> </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")); // 手動調(diào)用 afterPropertiesSet() jedisConnectionFactory.afterPropertiesSet(); // 創(chuàng)建 RedisTemplate 實例 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可視化,只需要刪除這兩行代碼即可:
//設(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)的三種實現(xiàn)
鍵遷移就是把數(shù)據(jù)由一個Redis遷移到另一個Redis,本文主要介紹了Redis鍵遷移(move、dump、restore、migrate)的三種實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializ
本文主要介紹了Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializer區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Windows操作系統(tǒng)下Redis服務(wù)安裝圖文教程
這篇文章主要介紹了Windows操作系統(tǒng)下Redis服務(wù)安裝圖文教程,文中給大家提供了redis的下載地址,安裝程序步驟,需要的朋友可以參考下2018-03-03