欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis?Hash序列化存儲的問題及解決方案

 更新時間:2022年11月16日 11:07:40   作者:月未明  
這篇文章主要介紹了Redis?Hash序列化存儲的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

這里說的是Spring Data Redis(一下簡稱SDR)設置Hash存儲的序列化。

SDR序列化方式有多種

如:

  • StringRedisSerializer
  • JdkSerializationRedisSerializer
  • Jackson2JsonRedisSerializer
  • OxmSerializer
  • 等等

目前我有個需求,是將數(shù)據(jù)用hash的形式存到Redis數(shù)據(jù)庫中,在網(wǎng)上搜了下實現(xiàn)方式,部分代碼如下:

    @Bean
    public RedisTemplate<String,Object> redisTemplate(){
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
        return redisTemplate;
    }

    /**
     * 設置數(shù)據(jù)存入 redis 的序列化方式
     *
     * @param redisTemplate
     * @param factory
     */
    private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.setConnectionFactory(factory);
    }


    /**
     * 實例化 HashOperations 對象,可以使用 Hash 類型操作
     *
     * @param redisTemplate
     * @return
     */
    @Bean
    public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
        return redisTemplate.opsForHash();
    }

對Redis的存儲設置是我自己寫的

    /**
     * 添加
     *
     * @param key    key
     * @param filed    filed
     * @param domain 對象
     */
    public void hset(String key,String filed,Object domain){
        System.out.println("開始使用filed設置");
        hashOperations.put(key, filed, domain);
    }

    /**
     * 查詢
     *
     * @param key 查詢的key
     * @param field 查詢的field
     * @return
     */
    public Object hget(String key,String field) {
        return hashOperations.get(key, field);
    }

方法:

    @RequestMapping("/mytest")
    public Object myTest() {

        redisUtils.hset("mykey","myfield","myvalue");

       return redisUtils.hget("mykey","myfield");
    }

Hash的存儲跟String有些不同,從表面上看Hash多了個field,這個自己稍微想下就可以理解了。

執(zhí)行上面的代碼后,用客戶端查看所存儲的值:

上圖顯示的是亂碼。

用redis-cli查看:

這里顯示的是我存的值myvalue前多了些東西,這是序列化的時候所加的一些東西。

執(zhí)行方法時前端得到的值:

這里可見從redis中取出的值是跟我存入的完全一樣的(這是因為取出的時候Spring有做反序列化處理)。

如果從redis-cli中直接存儲:

host:6379> hset mykey2 myfield2 myvalue2
(integer) 1
host:6379> hget mykey2 myfield2
"myvalue2"

查看客戶端中的值:

在這里存入的hash顯示的是正常的。

所以我猜測之前redis桌面客戶端顯示“不正常”的原因應該是出在序列化的時候。

更改序列化方法

改為StringRedisSerializer方式(一般key都是字符串,所以繼續(xù)使用StringRedisSerializer,這里把Hash的value序列化改為StringRedisSerializer):

    /**
     * 設置數(shù)據(jù)存入 redis 的序列化方式
     *
     * @param redisTemplate
     * @param factory
     */
    private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.setConnectionFactory(factory);
    }

查看客戶端的值:

這時顯示OK了,redis-cli中顯示的也是OK的。

所以,我們遇到的問題貌似解決了。

因為我要存儲的是hash,而hashOperations為我們提供了另外一個方法putAll,這個方法支持對HashMap的操作。

代碼:

    /**
     * 添加
     *
     * @param key    key
     * @param hm    要存入的hash表
     */
    public void hset(String key, HashMap<String,Object> hm){
        System.out.println("開始使用hashmap設置");
        hashOperations.putAll(key,hm);
    }

因為我的hashmap中要存的值包含時間,所以就要把值設為Object,代碼:

    @RequestMapping("/hm")
    public void hmsetTest() {

        HashMap<String,Object> hm =new HashMap<String,Object>();

        hm.put("myFieldKey","myFieldKey");
        hm.put("createTime",new Date());

        redisUtils.hset("mykey",hm);
    }

執(zhí)行結果:

這時在調用的時候直接報錯了,說是Date類型無法轉String。

回到單個值存入的方法上:

    public void hset(String key,String filed,Object domain){
        System.out.println("開始使用filed設置");
        hashOperations.put(key, filed, domain);
    }

用這里執(zhí)行Date的存儲,結果還是包這個異常。

由此可見,使用StringRedisSerializer序列化并不能解決我們的問題,而且還有使用的限制。OxmSerializer這個東西我不太熟悉,所以沒有測試。

使用Jackson2JsonRedisSerializer

更改序列化方式

redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));

執(zhí)行單個日期操作結果如下:

這里顯示的日期被轉成時間戳形式存儲的。

執(zhí)行hashmap:

結果顯示執(zhí)行的也是成功的,如果跟StringRedisSerializer比較會發(fā)現(xiàn),存儲字符串的時候值得最外層會被加上“”。

繼續(xù)使用JdkSerializationRedisSerializer

可以正常存儲,但是顯示形式一樣不是我們期望的。

對于這個問題我網(wǎng)上有種解決方法,在redis-cli中查看的時候使用–raw指令

即啟動指令為:redis-cli –raw。這種方式也可以正常的查看中文。但是查看的時候日期依然有問題,而且字符串前邊會多些東西(t)。

OxmSerializer這個東西我不熟悉,所以就沒有測試,但是網(wǎng)上一般都說建議使用JdkSerializationRedisSerializer,而且這種效率是最高的,沒辦法,畢竟是原生的。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • redis在Linux系統(tǒng)下的環(huán)境配置和redis的全局命令大全

    redis在Linux系統(tǒng)下的環(huán)境配置和redis的全局命令大全

    在Linux系統(tǒng)中我們經常使用Redis作為高性能的緩存數(shù)據(jù)庫,然而有時候我們需要在系統(tǒng)中多個地方使用Redis命令,這就需要將Redis的全局命令設置好,這篇文章主要給大家介紹了關于redis在Linux系統(tǒng)下的環(huán)境配置和redis的全局命令大全的相關資料,需要的朋友可以參考下
    2024-05-05
  • redis擊穿 雪崩 穿透超詳細解決方案梳理

    redis擊穿 雪崩 穿透超詳細解決方案梳理

    這篇文章主要為大家介紹了Redis擊穿穿透雪崩產生原因及解決思路的解決方案參考,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進步
    2022-03-03
  • 淺談redis內存數(shù)據(jù)的持久化方式

    淺談redis內存數(shù)據(jù)的持久化方式

    這篇文章主要介紹了淺談redis內存數(shù)據(jù)的持久化方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Redis分布式鎖方案設計之防止訂單重復提交或支付

    Redis分布式鎖方案設計之防止訂單重復提交或支付

    這篇文章主要為大家介紹了Redis分布式鎖之防止訂單重復提交或支付方案設計示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • redis keys與scan命令的區(qū)別說明

    redis keys與scan命令的區(qū)別說明

    這篇文章主要介紹了redis keys與scan命令的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • 深入解析Redis中常見的應用場景

    深入解析Redis中常見的應用場景

    這篇文章主要給大家介紹了關于Redis中常見的應用場景的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-09-09
  • Redis中什么是Big?Key(大key)問題?如何解決Big?Key問題?

    Redis中什么是Big?Key(大key)問題?如何解決Big?Key問題?

    大key并不是指key的值很大,而是key對應的value很大,下面這篇文章主要給大家介紹了Redis中什么是Big?Key(大key)問題?如何解決Big?Key問題的相關資料,需要的朋友可以參考下
    2023-03-03
  • 詳解redis端口號

    詳解redis端口號

    在本篇內容中我們給大家整理了關于redis端口號的相關知識點內容,有興趣的朋友們學習下。
    2019-06-06
  • Redis做數(shù)據(jù)持久化的解決方案及底層原理

    Redis做數(shù)據(jù)持久化的解決方案及底層原理

    Redis有兩種方式來實現(xiàn)數(shù)據(jù)的持久化,分別是RDB(Redis Database)和AOF(Append Only File),今天通過本文給大家聊一聊Redis做數(shù)據(jù)持久化的解決方案及底層原理,感興趣的朋友一起看看吧
    2021-07-07
  • 詳解Redis分布式鎖的原理與實現(xiàn)

    詳解Redis分布式鎖的原理與實現(xiàn)

    在單體應用中,如果我們對共享數(shù)據(jù)不進行加鎖操作,會出現(xiàn)數(shù)據(jù)一致性問題,我們的解決辦法通常是加鎖。下面我們一起聊聊使用redis來實現(xiàn)分布式鎖
    2022-06-06

最新評論