最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中Redis存儲String類型會有亂碼的問題及解決方案

 更新時間:2024年04月03日 11:11:52   作者:樹若逝花若殤  
在java中使用Redis存儲String類型的數(shù)據(jù)時,會出現(xiàn)亂碼,我寫了一條存儲key為name,值為虎哥的字符串,然后獲取一下這個key為name的值,打印得到的值,下面通過實(shí)例代碼介紹Java中Redis存儲String類型會有亂碼的問題及解決方案,一起看看吧

項(xiàng)目場景:

背景:在java中使用Redis存儲String類型的數(shù)據(jù)時,會出現(xiàn)亂碼。

問題描述:

例如:在java中創(chuàng)建RedisTemplate操作String類型的數(shù)據(jù)存儲時,會出現(xiàn)亂碼,如下代碼,

我寫了一條存儲key為name,值為虎哥的字符串。

然后獲取一下這個key為name的值,打印得到的值

package com.sxy.redis;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
@SpringBootTest
class SpringDataRedisDemoApplicationTests {
    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    void contextLoads() {
        //        寫入一條String數(shù)據(jù)
        redisTemplate.opsForValue().set("name", "虎哥");
        //        獲取String數(shù)據(jù)
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println("name=" + name);
    }
}

我們可以看到出現(xiàn)了亂碼問題:這里不單單是值出現(xiàn)了亂碼,而且key也有亂碼問題

原因分析:

Redis的序列化分析:

因?yàn)镾pringDataRedis的功能可以接收任何類型的對象,可以幫我們將java對象轉(zhuǎn)成Redis可處理的字節(jié),所以我們存進(jìn)去的 name和虎哥 都被當(dāng)成了java對象,而redisTemplate的底層,默認(rèn)對這些對象得處理方式就是利用JDK的序列化工具,ObjectOutPutStream

進(jìn)入redisTemplate我們發(fā)現(xiàn)了四個屬性的值都是對應(yīng)的數(shù)據(jù)的序列化

這里我們發(fā)現(xiàn)上面四個屬性的值的,都是下面這個方法定義的默認(rèn)的jdk的序列化器

通過斷點(diǎn)調(diào)試redisTemplate.opsForValue().set("name", "虎哥");我們可以發(fā)現(xiàn),進(jìn)入了JdkSerializationRedisSerializer的類中

最后進(jìn)入了這里,可以看到有ObjectOutputStream來寫對象,這個流的作用就是把java對象轉(zhuǎn)換為字節(jié)進(jìn)行writeObject進(jìn)行寫入

所以我們看到的值就是這樣子的數(shù)據(jù)

缺點(diǎn):

  • 可讀性差
  • 內(nèi)存占用較大

解決方案:

我們可以通過修改RedisTemplate的序列化來實(shí)現(xiàn)數(shù)據(jù)亂碼問題。

RedisSerializer有一些實(shí)現(xiàn)類

這里會有兩個我們需要用到的

  • StringRedisSerializer

    如果我的key和hash可以是字符串的情況下就用它

  • GenericJackson2JsonRedisSerializer

    如果我的值是對象就用它

上代碼:

代碼如下,寫了一個配置類注冊Bean對象給spring容器管理

package com.sxy.redis.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
//        創(chuàng)建RedisTemplate對象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
//        設(shè)置連接工廠
        template.setConnectionFactory(redisConnectionFactory);
//        創(chuàng)建JSON序列化工具
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
//        設(shè)置key的序列化為 = String
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
//        設(shè)置value的序列化為 = GenericJackson2JsonRedisSerializer
        template.setValueSerializer(genericJackson2JsonRedisSerializer);
        template.setHashValueSerializer(genericJackson2JsonRedisSerializer);
//        返回
        return template;
    }
}

注意:如果這里運(yùn)行的話會報(bào)錯為如下:

Caused by: java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/JsonProcessingException

這是個明顯的錯誤,告訴我們用了如下這個JSON序列化類沒有引入jackson的依賴才報(bào)錯

 GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = 
new GenericJackson2JsonRedisSerializer();

我們只需要添加如下依賴即可

<!--        Jackson依賴-->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
</dependency>

隨后我們嘗試對其進(jìn)行寫入和讀取數(shù)據(jù),發(fā)現(xiàn)key和value都是正常的顯示

總結(jié):

直接在java中使用RedisTemplate模板進(jìn)行寫入字符串?dāng)?shù)據(jù)時會出現(xiàn),key和value都是亂碼問題,

我們修改了RedisTemplate默認(rèn)的序列化器StringRedisSerializer即可解決此問題。

到此這篇關(guān)于Java中Redis存儲String類型會有亂碼的文章就介紹到這了,更多相關(guān)java redis存儲亂碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • GsonFormat快速生成JSon實(shí)體類的實(shí)現(xiàn)

    GsonFormat快速生成JSon實(shí)體類的實(shí)現(xiàn)

    GsonFormat主要用于使用Gson庫將JSONObject格式的String?解析成實(shí)體,本文主要介紹了GsonFormat快速生成JSon實(shí)體類的實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-05-05
  • Java+MySQL前后端連接新手小白教程

    Java+MySQL前后端連接新手小白教程

    Java作為一種廣泛使用的編程語言之一,在開發(fā)Web應(yīng)用程序時經(jīng)常需要連接MySQL數(shù)據(jù)庫進(jìn)行數(shù)據(jù)操作,下面這篇文章主要給大家介紹了關(guān)于Java+MySQL前后端連接的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • mybatis-plus 實(shí)現(xiàn)分頁查詢的示例代碼

    mybatis-plus 實(shí)現(xiàn)分頁查詢的示例代碼

    本文介紹了在MyBatis-Plus中實(shí)現(xiàn)分頁查詢,包括引入依賴、配置分頁插件、使用分頁查詢以及在控制器中調(diào)用分頁查詢的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • Java中final、static關(guān)鍵字與方法的重寫和繼承易錯點(diǎn)整理

    Java中final、static關(guān)鍵字與方法的重寫和繼承易錯點(diǎn)整理

    這篇文章主要給大家介紹了關(guān)于Java中final、static關(guān)鍵字與方法的重寫和繼承易錯點(diǎn)的相關(guān)資料,在Java編程中final關(guān)鍵字用于限制方法或類的進(jìn)一步修改,final方法不能被子類重寫,而static方法不可被重寫,只能被遮蔽,需要的朋友可以參考下
    2024-10-10
  • Ubuntu 15下安裝Eclipse經(jīng)驗(yàn)分享

    Ubuntu 15下安裝Eclipse經(jīng)驗(yàn)分享

    這篇文章主要為大家分享了Ubuntu 15下安裝Eclipse經(jīng)驗(yàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 輕松掌握J(rèn)ava享元模式

    輕松掌握J(rèn)ava享元模式

    這篇文章主要幫助大家輕松掌握J(rèn)ava享元模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • JDBC如何通過SSL方式連接MySQL

    JDBC如何通過SSL方式連接MySQL

    文章介紹了如何配置MySQL以支持SSL連接,并通過JDBC進(jìn)行安全連接,主要內(nèi)容包括查看MySQL SSL支持、創(chuàng)建SSL連接用戶、配置用戶是否強(qiáng)制使用SSL、JDBC配置導(dǎo)入證書以及使用Go編寫一個簡單的HTTP文件服務(wù)器來提供SSL證書
    2025-02-02
  • Sentinel的熔斷降級、資源規(guī)則詳解與實(shí)例

    Sentinel的熔斷降級、資源規(guī)則詳解與實(shí)例

    這篇文章主要介紹了Sentinel的熔斷降級、資源規(guī)則詳解與實(shí)例,Sentinel是阿里巴巴開源的一款流量控制和熔斷降級的框架,它主要用于保護(hù)分布式系統(tǒng)中的服務(wù)穩(wěn)定性,Sentinel通過對服務(wù)進(jìn)行流量控制和熔斷降級,可以有效地保護(hù)系統(tǒng)的穩(wěn)定性,需要的朋友可以參考下
    2023-09-09
  • 多數(shù)據(jù)源下@transactional事務(wù)踩坑實(shí)戰(zhàn)指南

    多數(shù)據(jù)源下@transactional事務(wù)踩坑實(shí)戰(zhàn)指南

    在微服務(wù)架構(gòu)日益普及的現(xiàn)在,多數(shù)據(jù)源事務(wù)管理成為常見需求,這篇文章主要介紹了多數(shù)據(jù)源下@transcation事務(wù)踩坑的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-05-05
  • idea啟動報(bào)錯:Command line is too long問題

    idea啟動報(bào)錯:Command line is too long問題

    在使用IDEA時,若遇到"Commandlineistoolong"錯誤,通常是因?yàn)槊钚虚L度超限,這是因?yàn)镮DEA通過命令行或文件將classpath傳遞至JVM,操作系統(tǒng)對命令行長度有限制,解決方法是切換至動態(tài)類路徑,通過修改項(xiàng)目的workspace.xml文件
    2024-09-09

最新評論

巢湖市| 洛南县| 钟山县| 和田市| 邵武市| 咸宁市| 措勤县| 齐齐哈尔市| 班戈县| 临潭县| 砚山县| 石棉县| 通山县| 濉溪县| 井陉县| 株洲县| 连山| 嘉义市| 刚察县| 乌拉特后旗| 石林| 高州市| 洪洞县| 特克斯县| 达拉特旗| 太谷县| 保定市| 金寨县| 荣昌县| 仁布县| 渑池县| 延寿县| 包头市| 清水河县| 汪清县| 武义县| 岱山县| 尚志市| 延安市| 固阳县| 华亭县|