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

分段存儲(chǔ)Redis鍵值對(duì)的方法詳解

 更新時(shí)間:2025年01月24日 10:40:17   作者:何中應(yīng)  
Redis是一種開(kāi)源的、基于內(nèi)存的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)系統(tǒng),它可以用作數(shù)據(jù)庫(kù)、緩存和消息中間件,Redis最常用的功能之一就是其鍵值對(duì)數(shù)據(jù)模型,本文介紹針對(duì)一個(gè)value過(guò)長(zhǎng)的鍵值對(duì),如何分段存儲(chǔ),需要的朋友可以參考下

場(chǎng)景

當(dāng)我們需要存入一個(gè)String類型的鍵值對(duì)到Redis中,如下:

(緩存接口)

public interface CacheService {

    /**
     * 添加一個(gè)字符串鍵值對(duì)
     * @param key 鍵
     * @param value 值
     */
    void setString(String key, String value);
}

(Redis實(shí)現(xiàn))

import com.hezy.service.CacheService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class RedisServiceImpl implements CacheService {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;


    @Override
    public void setString(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
    }
}

(使用)

import com.hezy.service.impl.RedisServiceImpl;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class RedisServiceImplTest {

    @Autowired
    private RedisServiceImpl redisService;

    @Test
    public void test1() {
        String key = "content";
        String value = "這是一段分非常大非常大的字符串…………………………非常大";
        redisService.setString(key, value);
    }
}

(查看Redis)

有時(shí)候,我們存入的字符串可能過(guò)長(zhǎng),過(guò)大,有可能來(lái)自于一個(gè)大對(duì)象的序列化。這時(shí)候存入的key-value,會(huì)造成value過(guò)大,會(huì)觸發(fā)一些預(yù)警。

可以采用我下面這種分段存儲(chǔ)的方法。

優(yōu)化

思路:將字符串分段,每一段生成一個(gè)key,然后將這些分段key再用Redis的List類型存儲(chǔ);獲取時(shí)就先獲取這些分段key,再循環(huán)去get對(duì)應(yīng)的字符串,拼接起來(lái)就是完整的字符串。

如下:分段存,增加一個(gè)參數(shù),設(shè)置每段字符串的長(zhǎng)度

(緩存接口)

    /**
     * 分段存儲(chǔ)
     * @param key 鍵
     * @param value 值
     * @param chunkSize 每個(gè)分段大小
     */
    void setStrSub(String key, String value, int chunkSize);

(Redis實(shí)現(xiàn))

    @Override
    public void setStrSub(String key, String value, int chunkSize) {
        // 將value,按照l(shuí)ength,分成多個(gè)部分
        int totalChunks = (int) Math.ceil((double) value.length() / chunkSize);
        // 定義一個(gè)分段數(shù)據(jù)key集合
        List<String> subKeys = new ArrayList<>(totalChunks);
        // 將字符串分成多段
        for (int i = 0; i < totalChunks; i++) {
            // 計(jì)算分段起止位置
            int startIndex = i * chunkSize;
            int endIndex = Math.min(startIndex + chunkSize, value.length());
            // 獲取對(duì)應(yīng)分段數(shù)據(jù)
            String chunkValue = value.substring(startIndex, endIndex);
            // 拼接分段key
            String subKey = key + "_" + i;
            // 存儲(chǔ)分段數(shù)據(jù)
            setString(subKey, chunkValue);
            // 將分段key添加到集合
            subKeys.add(subKey);
        }
        // 分段key添加到集合
        setList(key, subKeys);
    }

(添加一個(gè)集合到Redis)

    @Override
    public void setList(String key, List value) {
        redisTemplate.opsForList().rightPushAll(key, value);
    }

啟動(dòng),測(cè)試

    @Test
    public void test2() {
        String key = "content";
        String value = "這是一段分非常大非常大的字符串…………………………非常大";
        redisService.setStrSub(key, value, 5);
    }

查看Redis

然后,要取數(shù)據(jù),也很簡(jiǎn)單;

(緩存接口)

    /**
     * 獲取字符串(分段)
     * @param key
     * @return
     */
    String getStrSub(String key);

(Redis實(shí)現(xiàn))

    @Override
    public String getStrSub(String key) {
        // 先把分段key獲取出來(lái)
        List<String> list = getList(key);
        // 字符串拼接,用StringBuilder,線程安全
        StringBuilder stringBuilder = new StringBuilder();
        for (String subKey : list) {
            String subValue = getString(subKey);
            // 這里要跳過(guò)null,不然最后輸出會(huì)把null轉(zhuǎn)為字符串
            if (subValue == null) {
                continue;
            }
            stringBuilder.append(subValue);
        }
        // 如果沒(méi)有數(shù)據(jù),返回null
        return "".contentEquals(stringBuilder) ? null : stringBuilder.toString();
    }

(Redis獲取一個(gè)List)

    @Override
    public List getList(String key) {
        return redisTemplate.opsForList().range(key, 0, -1);
    }

(使用)

    @Test
    public void test3() {
        String content = redisService.getStrSub("content");
        System.out.println(content);
    }

(打印)

總結(jié)

本文介紹了Redis分段存儲(chǔ)一個(gè)大鍵值對(duì)(String)的一種方式,看下來(lái),實(shí)現(xiàn)并不復(fù)雜。使用上也可以很方便,可以考慮把分段的存取和普通的存取都兼容起來(lái),這樣對(duì)于使用者,只需要加一個(gè)參數(shù)(分段大?。?。

到此這篇關(guān)于分段存儲(chǔ)Redis鍵值對(duì)的方法詳解的文章就介紹到這了,更多相關(guān)Redis鍵值對(duì)分段存儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis IO多路復(fù)用模型使用及說(shuō)明

    Redis IO多路復(fù)用模型使用及說(shuō)明

    這篇文章主要介紹了Redis IO多路復(fù)用模型使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2026-03-03
  • Redis BGSAVE 內(nèi)存不足異常完美解決方案

    Redis BGSAVE 內(nèi)存不足異常完美解決方案

    這篇文章詳細(xì)介紹了Redis BGSAVE內(nèi)存不足異常的解決方案,包括緊急恢復(fù)、根本修復(fù)和長(zhǎng)期優(yōu)化三個(gè)方面,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • redis遠(yuǎn)程連接不上的解決辦法

    redis遠(yuǎn)程連接不上的解決辦法

    本文主要介紹了redis遠(yuǎn)程連接不上的解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • SpringBoot讀寫(xiě)Redis客戶端并實(shí)現(xiàn)Jedis技術(shù)切換功能

    SpringBoot讀寫(xiě)Redis客戶端并實(shí)現(xiàn)Jedis技術(shù)切換功能

    這篇文章主要介紹了SpringBoot讀寫(xiě)Redis客戶端并實(shí)現(xiàn)技術(shù)切換功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • 淺談redis的maxmemory設(shè)置以及淘汰策略

    淺談redis的maxmemory設(shè)置以及淘汰策略

    下面小編就為大家?guī)?lái)一篇淺談redis的maxmemory設(shè)置以及淘汰策略。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • redis由于目標(biāo)計(jì)算機(jī)積極拒絕,無(wú)法連接的解決

    redis由于目標(biāo)計(jì)算機(jī)積極拒絕,無(wú)法連接的解決

    這篇文章主要介紹了redis由于目標(biāo)計(jì)算機(jī)積極拒絕,無(wú)法連接的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • shell腳本批量導(dǎo)出redis key-value方式

    shell腳本批量導(dǎo)出redis key-value方式

    為避免keys全量掃描導(dǎo)致Redis卡頓,可先通過(guò)dump.rdb備份文件在本地恢復(fù),再使用scan命令漸進(jìn)導(dǎo)出key-value,通過(guò)CNT和INTERVAL參數(shù)控制負(fù)載,且scan不指定游標(biāo)可減少阻塞
    2025-08-08
  • 在Redis中存儲(chǔ)和操作JSON數(shù)據(jù)的方法詳解

    在Redis中存儲(chǔ)和操作JSON數(shù)據(jù)的方法詳解

    RedisJSON 是 Redis 的一個(gè)模塊,為 Redis 提供了 JSON 數(shù)據(jù)類型的支持,允許直接存儲(chǔ)、更新和查詢 JSON 文檔,本文給大家詳細(xì)介紹了RedisJSON 安裝部署及使用示例,需要的朋友可以參考下
    2025-07-07
  • 從一個(gè)小需求感受Redis的獨(dú)特魅力(需求設(shè)計(jì))

    從一個(gè)小需求感受Redis的獨(dú)特魅力(需求設(shè)計(jì))

    Redis在實(shí)際應(yīng)用中使用的非常廣泛,本篇文章就從一個(gè)簡(jiǎn)單的需求說(shuō)起,為你講述一個(gè)需求是如何從頭到尾開(kāi)始做的,又是如何一步步完善的
    2019-12-12
  • Redis源碼閱讀:Redis字符串SDS詳解

    Redis源碼閱讀:Redis字符串SDS詳解

    這篇文章主要介紹了Redis源碼閱讀:Redis字符串SDS,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評(píng)論

班玛县| 方山县| 惠水县| 叙永县| 平定县| 九龙城区| 台山市| 右玉县| 深州市| 彰武县| 滦平县| 尼玛县| 安乡县| 章丘市| 赣州市| 嘉鱼县| 凤山县| 巴南区| 许昌市| 临澧县| 桦甸市| 江永县| 黄骅市| 武隆县| 馆陶县| 孟州市| 西安市| 西贡区| 长葛市| 岑巩县| 禹州市| 方城县| 岑巩县| 民乐县| 磐安县| 紫金县| 安西县| 宝鸡市| 和林格尔县| 纳雍县| 凌源市|