五大金剛-Redis的五種數(shù)據(jù)類型設(shè)計靈活,組合用滿足復(fù)雜的應(yīng)用
Redis 提供了多種內(nèi)置的數(shù)據(jù)類型,每種類型都針對特定的使用場景進行了優(yōu)化。
以下是 Redis 的五種主要數(shù)據(jù)類型及其用途:
String(字符串)
描述:最簡單的數(shù)據(jù)類型,一個鍵對應(yīng)一個值,值可以是字符串或數(shù)字。
使用場景:適合用于緩存簡單的鍵值對數(shù)據(jù),如會話信息、計數(shù)器等。
特殊操作:INCR、DECR(遞增或遞減數(shù)字型字符串的值)。
List(列表)
描述:一個鍵對應(yīng)一個雙向鏈表,可以從頭部或尾部添加或彈出元素。
使用場景:適用于消息隊列、最近最少使用(LRU)緩存、歷史記錄等。
特殊操作:LPUSH、RPUSH(在列表頭部或尾部添加元素),LPOP、RPOP(從列表頭部或尾部彈出元素)。
Set(集合)
描述:一個鍵對應(yīng)一個無序的、不重復(fù)的字符串集合。
使用場景:適合用于存儲唯一元素的集合,如標簽、好友列表等。
特殊操作:
SADD(添加元素到集合),
SMEMBERS(獲取集合的所有元素),
SINTER、SUNION、SDIFF(集合的交集、并集、差集)。
Hash(哈希)
描述:一個鍵對應(yīng)一個字段-值對的映射,類似于字典或關(guān)聯(lián)數(shù)組。
使用場景:適合用于存儲結(jié)構(gòu)化的數(shù)據(jù),如用戶信息、產(chǎn)品詳情等。
特殊操作:HSET、HGET(設(shè)置或獲取哈希中的字段值),HGETALL(獲取哈希中所有字段的值)。
Sorted Set(有序集合)
描述:類似于集合,但每個成員都關(guān)聯(lián)了一個分數(shù),用于排序。
使用場景:適合用于排行榜、評分系統(tǒng)、時間序列數(shù)據(jù)等。
特殊操作:
ZADD(添加元素到有序集合),ZRANGE、ZREVRANGE(獲取排序后的元素),ZSCORE(獲取元素的分數(shù))。
/**------------------zSet相關(guān)操作--------------------------------*/
// 添加元素,有序集合是按照元素的score值由小到大排列
ceshiRedisUtilService.zAdd("ceshi-web-zadd", "test-ceshi-web-zadd1", 100);
ceshiRedisUtilService.zAdd("ceshi-web-zadd", "test-ceshi-web-zadd2", 104);
ceshiRedisUtilService.zAdd("ceshi-web-zadd", "test-ceshi-web-zadd3", 108);
ceshiRedisUtilService.zAdd("ceshi-web-zadd", "test-ceshi-web-zadd4", 103);
ceshiRedisUtilService.zAdd("ceshi-web-zadd", "test-ceshi-web-zadd5", 10);
//zRange 獲取集合的元素,value 從小到大排序
Set<String> zRange = ceshiRedisUtilService.zRange("ceshi-web-zadd", 0, 4);
for (String string : zRange) {
System.out.println(string);
}
// zReverseRange 獲取集合的元素,value 從大到小排序
Set<String> zReverseRange = ceshiRedisUtilService.zReverseRange("ceshi-web-zadd", 0, 4);
for (String string : zReverseRange) {
System.out.println(string);
}
---------------ceshiRedisUtilService.zRange---------------------------------
public Set<String> zRange(String key, long start, long end) {
try {
return redisTemplate.opsForZSet().
range(key,start,end).stream().
map(Object::toString).
collect(Collectors.toCollection(LinkedHashSet::new));
}catch (Exception e){
logger.error("=======Exception When zRange",e);
}
return null;
}
public Set<String> zReverseRange(String key, long start, long end) {
try {
return redisTemplate.
opsForZSet().
reverseRange(key,start,end).
stream().
map(Object::toString).
collect(Collectors.toCollection(LinkedHashSet::new));
}catch (Exception e){
logger.error("=======Exception When zReverseRange",e);
}
return null;
}
Redis 的數(shù)據(jù)類型設(shè)計靈活,可以組合使用以滿足復(fù)雜的應(yīng)用場景。
例如,可以使用哈希存儲用戶信息,再使用有序集合來維護用戶的游戲得分排名。通過合理利用這些數(shù)據(jù)類型,可以構(gòu)建高性能、低延遲的應(yīng)用。