詳解Redis中數(shù)值亂碼的根本原因以及解決方式
1. 問題所示
某些信息存儲在緩存中,對此修改緩存,想通過可視化的Redis Desktop來操作,但是發(fā)現(xiàn)都是二進制的數(shù)據(jù),不好操作:

于是想著以命令行的方式修改,但又怕改錯,畢竟都是難以讀懂的二進制數(shù)據(jù),如圖所示:(由于信息比較隱私,此處打碼了)

2. 原理分析
RedisTemplate 存儲的數(shù)據(jù)通常是二進制的。Redis 是一個鍵值存儲系統(tǒng),它存儲的值可以是字符串、二進制數(shù)據(jù)、甚至是序列化的對象。
RedisTemplate 是 Spring Data Redis 提供的一個類,用于在 Spring 應用中與 Redis 進行交互。
它提供了一種在 Java 對象和 Redis 數(shù)據(jù)之間進行序列化和反序列化的機制。
默認情況下,RedisTemplate 使用 JDK 的序列化機制將 Java 對象轉換為二進制數(shù)據(jù),并存儲在 Redis 中。
3. 拓展
在使用Redis作為數(shù)據(jù)存儲時,合理的鍵值序列化配置和RedisTemplate的使用方式對于應用性能和數(shù)據(jù)可維護性至關重要。
默認情況下,Spring Data Redis使用JdkSerializationRedisSerializer作為RedisTemplate的默認序列化器
這意味著鍵和值都將以Java對象的二進制形式進行序列化,并以字節(jié)流的方式存儲在Redis中。
不對值進行額外序列化的理由:雖然值以二進制形式存儲,但在Java代碼中獲取值時會進行反序列化,因此這不會影響業(yè)務邏輯和數(shù)據(jù)的正確性。
同時,對值進行額外的序列化可能會限制存儲的數(shù)據(jù)類型,例如將值序列化為字符串將僅能存儲字符串類型的值。額外序列化的場景
如果需要存儲復雜的數(shù)據(jù)結構或非字符串類型的值,可以選擇配置RedisTemplate使用其他序列化器,例如JSON序列化器或自定義序列化器。- 這樣可以更靈活地存儲各種類型的數(shù)據(jù),但需要注意在讀取時正確地反序列化。
特殊值的處理
對于包含特殊類型(如LocalDateTime、LocalDate、LocalTime等)的值,可能需要注意轉換為字符串或選擇合適的序列化方式。
通過理解Redis默認行為和靈活運用RedisTemplate,可以更好地應對不同類型數(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進行可視化:
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<>();
//設置String類型的key設置序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
//設置Hash類型的key設置序列化器
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可視化,只需要刪除這兩行代碼即可:
//設置String類型的key設置序列化器 redisTemplate.setKeySerializer(new StringRedisSerializer()); //設置Hash類型的key設置序列化器 redisTemplate.setHashKeySerializer(new StringRedisSerializer());
截圖如下:

以上就是詳解Redis中數(shù)值亂碼的根本原因以及解決方式的詳細內(nèi)容,更多關于Redis數(shù)值亂碼的資料請關注腳本之家其它相關文章!
相關文章
Redis實現(xiàn)布隆過濾器緩存去重的"智能門衛(wèi)"(實例詳解)
布隆過濾器(Bloom Filter)本質(zhì)是一個基于哈希函數(shù)的概率型數(shù)據(jù)結構,核心作用是快速判斷一個元素是否存在于集合中,今天給大家介紹Redis實現(xiàn)布隆過濾器緩存去重的"智能門衛(wèi)",感興趣的朋友跟隨小編一起看看吧2026-02-02
Redis數(shù)據(jù)結構之listpack和quicklist使用學習
這篇文章主要為大家介紹了Redis數(shù)據(jù)結構之listpack和quicklist的使用學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07
記錄一次并發(fā)情況下的redis導致服務假死的問題解決
由于Redis需要依賴于操作系統(tǒng)環(huán)境,如果系統(tǒng)資源受限,比如過量的進程在擠占系統(tǒng)資源、系統(tǒng)死鎖等情況,本文主要介紹了記錄一次并發(fā)情況下的redis導致服務假死的問題解決,感興趣的可以了解一下2023-09-09
Redis集群利用Redisson實現(xiàn)分布式鎖方式
這篇文章主要介紹了Redis集群利用Redisson實現(xiàn)分布式鎖方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
使用SpringBoot?+?Redis?實現(xiàn)接口限流的方式
這篇文章主要介紹了SpringBoot?+?Redis?實現(xiàn)接口限流,Redis?除了做緩存,還能干很多很多事情:分布式鎖、限流、處理請求接口冪等,文中給大家提到了限流注解的創(chuàng)建方式,需要的朋友可以參考下2022-05-05

