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

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

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

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

SDR序列化方式有多種

如:

  • StringRedisSerializer
  • JdkSerializationRedisSerializer
  • Jackson2JsonRedisSerializer
  • OxmSerializer
  • 等等

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

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

    /**
     * 設(shè)置數(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);
    }


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

對(duì)Redis的存儲(chǔ)設(shè)置是我自己寫的

    /**
     * 添加
     *
     * @param key    key
     * @param filed    filed
     * @param domain 對(duì)象
     */
    public void hset(String key,String filed,Object domain){
        System.out.println("開始使用filed設(shè)置");
        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的存儲(chǔ)跟String有些不同,從表面上看Hash多了個(gè)field,這個(gè)自己稍微想下就可以理解了。

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

上圖顯示的是亂碼。

用redis-cli查看:

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

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

這里可見從redis中取出的值是跟我存入的完全一樣的(這是因?yàn)槿〕龅臅r(shí)候Spring有做反序列化處理)。

如果從redis-cli中直接存儲(chǔ):

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

查看客戶端中的值:

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

所以我猜測(cè)之前redis桌面客戶端顯示“不正常”的原因應(yīng)該是出在序列化的時(shí)候。

更改序列化方法

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

    /**
     * 設(shè)置數(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);
    }

查看客戶端的值:

這時(shí)顯示OK了,redis-cli中顯示的也是OK的。

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

因?yàn)槲乙鎯?chǔ)的是hash,而hashOperations為我們提供了另外一個(gè)方法putAll,這個(gè)方法支持對(duì)HashMap的操作。

代碼:

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

因?yàn)槲业膆ashmap中要存的值包含時(shí)間,所以就要把值設(shè)為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í)行結(jié)果:

這時(shí)在調(diào)用的時(shí)候直接報(bào)錯(cuò)了,說是Date類型無法轉(zhuǎn)String。

回到單個(gè)值存入的方法上:

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

用這里執(zhí)行Date的存儲(chǔ),結(jié)果還是包這個(gè)異常。

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

使用Jackson2JsonRedisSerializer

更改序列化方式

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

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

這里顯示的日期被轉(zhuǎn)成時(shí)間戳形式存儲(chǔ)的。

執(zhí)行hashmap:

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

繼續(xù)使用JdkSerializationRedisSerializer

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

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

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

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

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Redis異步隊(duì)列的實(shí)現(xiàn)及應(yīng)用場景

    Redis異步隊(duì)列的實(shí)現(xiàn)及應(yīng)用場景

    異步隊(duì)列是一種底層基于異步 I/O 模型的消息隊(duì)列,用于在分布式系統(tǒng)中進(jìn)行同步和異步的通訊和協(xié)作,本文主要介紹了Redis異步隊(duì)列的實(shí)現(xiàn)及應(yīng)用場景,感興趣的可以了解一下
    2023-12-12
  • Redis全局ID生成器的實(shí)現(xiàn)

    Redis全局ID生成器的實(shí)現(xiàn)

    全局ID生成器,是一種在分布式系統(tǒng)下用來生成全局唯一ID的工具,本文主要介紹了Redis全局ID生成器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Redis 持久化 RDB 與 AOF的執(zhí)行過程

    Redis 持久化 RDB 與 AOF的執(zhí)行過程

    本文給大家記錄Redis 持久化RDB 與 AOF的執(zhí)行過程與配置,通過內(nèi)部觸發(fā) RDB 場景分析Redis 持久化 RDB的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-11-11
  • redis限流的實(shí)際應(yīng)用

    redis限流的實(shí)際應(yīng)用

    這篇文章主要介紹了redis限流的實(shí)際應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • redis適合場景八點(diǎn)總結(jié)

    redis適合場景八點(diǎn)總結(jié)

    在本篇文章中我們給大家整理了關(guān)于redis適合什么場景的8點(diǎn)知識(shí)點(diǎn)內(nèi)容,需要的朋友們參考下。
    2019-06-06
  • Redis Value過大問題(鍵值過大)

    Redis Value過大問題(鍵值過大)

    這篇文章主要介紹了Redis Value過大問題(鍵值過大),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Redis批量刪除key的命令詳解

    Redis批量刪除key的命令詳解

    這篇文章主要介紹了Redis批量刪除key的命令詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • redis實(shí)現(xiàn)加鎖的幾種方法示例詳解

    redis實(shí)現(xiàn)加鎖的幾種方法示例詳解

    這篇文章主要給大家介紹了關(guān)于redis實(shí)現(xiàn)加鎖的幾種方法,加鎖命令分別是INCR、SETNX和SET,文中給出了詳細(xì)的示例代碼,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • Win10下通過Ubuntu安裝Redis的過程

    Win10下通過Ubuntu安裝Redis的過程

    這篇文章主要介紹了Win10下通過Ubuntu安裝Redis,在安裝Ubuntu需要先打開Windows功能,接著創(chuàng)建一個(gè)用戶及密碼,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Redis恢復(fù)被移除集群的服務(wù)器實(shí)操步驟

    Redis恢復(fù)被移除集群的服務(wù)器實(shí)操步驟

    這篇文章主要為大家介紹了Redis恢復(fù)被移除集群的服務(wù)器實(shí)操步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評(píng)論

阜新| 景宁| 双城市| 梨树县| 松江区| 蒲城县| 龙陵县| 北辰区| 枞阳县| 辽阳县| 巴南区| 格尔木市| 鄯善县| 蓬莱市| 门源| 从化市| 嘉定区| 香河县| 宁安市| 仙居县| 金山区| 光山县| 卓资县| 金平| 色达县| 通许县| 鄢陵县| 乌海市| 德州市| 铜陵市| 邢台县| 吴旗县| 齐齐哈尔市| 全州县| 湖州市| 沧源| 大冶市| 黑龙江省| 门源| 搜索| 福安市|