亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

分段存儲Redis鍵值對的方法詳解

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

場景

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

(緩存接口)

public interface CacheService {

    /**
     * 添加一個字符串鍵值對
     * @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)

有時候,我們存入的字符串可能過長,過大,有可能來自于一個大對象的序列化。這時候存入的key-value,會造成value過大,會觸發(fā)一些預(yù)警。

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

優(yōu)化

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

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

(緩存接口)

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

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

    @Override
    public void setStrSub(String key, String value, int chunkSize) {
        // 將value,按照length,分成多個部分
        int totalChunks = (int) Math.ceil((double) value.length() / chunkSize);
        // 定義一個分段數(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());
            // 獲取對應(yīng)分段數(shù)據(jù)
            String chunkValue = value.substring(startIndex, endIndex);
            // 拼接分段key
            String subKey = key + "_" + i;
            // 存儲分段數(shù)據(jù)
            setString(subKey, chunkValue);
            // 將分段key添加到集合
            subKeys.add(subKey);
        }
        // 分段key添加到集合
        setList(key, subKeys);
    }

(添加一個集合到Redis)

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

啟動,測試

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

查看Redis

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

(緩存接口)

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

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

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

(Redis獲取一個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);
    }

(打?。?/p>

總結(jié)

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

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

相關(guān)文章

  • Python交互Redis的實(shí)現(xiàn)

    Python交互Redis的實(shí)現(xiàn)

    本文主要介紹了Python交互Redis的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Redis實(shí)現(xiàn)訂單過期刪除的方法步驟

    Redis實(shí)現(xiàn)訂單過期刪除的方法步驟

    本文主要介紹了Redis實(shí)現(xiàn)訂單過期刪除的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Redis高并發(fā)分布鎖的示例

    Redis高并發(fā)分布鎖的示例

    在分布式系統(tǒng)中,實(shí)現(xiàn)分布式鎖是一項(xiàng)常見的需求,本文主要介紹了Redis高并發(fā)分布鎖的示例 ,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Redis哨兵機(jī)制的使用詳解

    Redis哨兵機(jī)制的使用詳解

    文章講解了Redis哨兵機(jī)制的基本原理、主庫和從庫自動切換的過程、如何減少誤判、哨兵集群的組成和通信機(jī)制,以及哨兵在故障發(fā)生時如何選舉Leader進(jìn)行主從切換
    2025-01-01
  • redis中key使用冒號分隔的原理小結(jié)

    redis中key使用冒號分隔的原理小結(jié)

    Redis是一種高性能的鍵值對非關(guān)系型數(shù)據(jù)庫,通過redis不同類型命令可以為其中的鍵指定不同的數(shù)據(jù)類型,其中每個鍵的命名規(guī)范通常使用冒號符號分隔字符串,本文主要介紹了redis中key使用冒號分隔的原理小結(jié),感興趣的可以了解一下
    2024-01-01
  • Redis Cluster的圖文講解

    Redis Cluster的圖文講解

    今天小編就為大家分享一篇關(guān)于Redis Cluster的圖文講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Redis中什么是Big?Key(大key)問題?如何解決Big?Key問題?

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

    大key并不是指key的值很大,而是key對應(yīng)的value很大,下面這篇文章主要給大家介紹了Redis中什么是Big?Key(大key)問題?如何解決Big?Key問題的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • Redis報錯“NOAUTH Authentication required”兩種解決方案

    Redis報錯“NOAUTH Authentication required”兩種解決方案

    Redis提供了一個命令行工具redis-cli,它允許你直接連接到Redis服務(wù)器,如果你知道Redis服務(wù)器的密碼,你可以在連接時直接提供它,本文給大家介紹連接了Redis報錯“NOAUTH Authentication required”兩種解決方案
    2024-05-05
  • 詳解redis big key 排查思路

    詳解redis big key 排查思路

    本文主要介紹了詳解redis big key 排查思路,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Redis性能監(jiān)控的實(shí)現(xiàn)

    Redis性能監(jiān)控的實(shí)現(xiàn)

    本文使用 redis_exporter + prometheus +grafana 實(shí)現(xiàn)對Redis服務(wù)進(jìn)行監(jiān)控,原因:成本低,人工干預(yù)少,感興趣的可以了解一下
    2021-07-07

最新評論