分段存儲Redis鍵值對的方法詳解
場景
當(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)文章
Redis中什么是Big?Key(大key)問題?如何解決Big?Key問題?
大key并不是指key的值很大,而是key對應(yīng)的value很大,下面這篇文章主要給大家介紹了Redis中什么是Big?Key(大key)問題?如何解決Big?Key問題的相關(guān)資料,需要的朋友可以參考下2023-03-03
Redis報(bào)錯“NOAUTH Authentication required”兩種解決方案
Redis提供了一個命令行工具redis-cli,它允許你直接連接到Redis服務(wù)器,如果你知道Redis服務(wù)器的密碼,你可以在連接時直接提供它,本文給大家介紹連接了Redis報(bào)錯“NOAUTH Authentication required”兩種解決方案2024-05-05

