分段存儲(chǔ)Redis鍵值對(duì)的方法詳解
場(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í)候,我們存入的字符串可能過長(zhǎng),過大,有可能來(lái)自于一個(gè)大對(duì)象的序列化。這時(shí)候存入的key-value,會(huì)造成value過大,會(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); // 這里要跳過null,不然最后輸出會(huì)把null轉(zhuǎn)為字符串 if (subValue == null) { continue; } stringBuilder.append(subValue); } // 如果沒有數(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); }
(打?。?/p>
總結(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中key使用冒號(hào)分隔的原理小結(jié)
Redis是一種高性能的鍵值對(duì)非關(guān)系型數(shù)據(jù)庫(kù),通過redis不同類型命令可以為其中的鍵指定不同的數(shù)據(jù)類型,其中每個(gè)鍵的命名規(guī)范通常使用冒號(hào)符號(hào)分隔字符串,本文主要介紹了redis中key使用冒號(hào)分隔的原理小結(jié),感興趣的可以了解一下2024-01-01Redis中什么是Big?Key(大key)問題?如何解決Big?Key問題?
大key并不是指key的值很大,而是key對(duì)應(yīng)的value很大,下面這篇文章主要給大家介紹了Redis中什么是Big?Key(大key)問題?如何解決Big?Key問題的相關(guān)資料,需要的朋友可以參考下2023-03-03Redis報(bào)錯(cuò)“NOAUTH Authentication required”兩種解決方案
Redis提供了一個(gè)命令行工具redis-cli,它允許你直接連接到Redis服務(wù)器,如果你知道Redis服務(wù)器的密碼,你可以在連接時(shí)直接提供它,本文給大家介紹連接了Redis報(bào)錯(cuò)“NOAUTH Authentication required”兩種解決方案2024-05-05