一、基礎數據結構
1. String(字符串)
- 特點:二進制安全,支持字符串、數值存儲,原子性操作。
- 核心操作:
SET key value # 存儲鍵值對
GET key # 獲取值
INCR key # 數值自增1
SETEX key seconds val # 存儲帶過期時間的值
- 應用場景:
- 單值緩存(如用戶余額:
SET user:1:balance 1000
)。 - 分布式鎖(
SET lock:order 1 NX EX 10
)。 - 計數器(如點贊數:
INCR post:1:like
)。
- 單值緩存(如用戶余額:
2. Hash(哈希表)
- 特點:字段(field)與值(value)的映射,適合存儲對象。
- 核心操作:
HSET user:1 name "roy" balance 1888 # 存儲對象
HMGET user:1 name balance # 批量獲取字段
HINCRBY user:1 balance 100 # 字段值自增
- 應用場景:
- 結構化數據存儲(如用戶信息:
HSET user:1 id 1 name "roy"
)。 - 電商購物車(用戶ID為key,商品ID為field,數量為value)。
- 結構化數據存儲(如用戶信息:
3. List(列表)
- 特點:雙向鏈表,支持頭部/尾部快速操作,按索引訪問中間元素效率低。
- 核心操作:
LPUSH list:msgs "msg1" "msg2" # 左插入元素
RPOP list:msgs # 右彈出元素
LRANGE list:msgs 0 -1 # 獲取所有元素
- 應用場景:
- 消息隊列(LPUSH + RPOP實現隊列,LPUSH + LPOP實現棧)。
- 排行榜滾動數據(如最近10條消息:
LRANGE list:msgs 0 9
)。
4. Set(集合)
- 特點:無序、唯一元素,支持交集、并集、差集運算。
- 核心操作:
SADD set:users 1 2 3 # 添加元素
SMEMBERS set:users # 獲取所有元素
SINTER set:A set:B # 交集運算
- 應用場景:
- 去重統計(如UV統計:
SADD uv:202406 1 2 3
,SCARD uv:202406
)。 - 社交關系(共同關注:
SINTER follow:user1 follow:user2
)。
- 去重統計(如UV統計:
5. ZSet(有序集合)
- 特點:元素關聯分值(score),按分值排序,支持范圍查詢。
- 核心操作:
ZADD rank:202406 100 "user1" 90 "user2" # 添加帶分值元素
ZREVRANGE rank:202406 0 9 WITHSCORES # 倒序獲取前10名
ZINCRBY rank:202406 5 "user1" # 分值自增
- 應用場景:
- 排行榜(如成績排名、點贊排名)。
- 時間線(按時間戳排序的動態列表)。
二、高級數據結構
1. Bitmap(位圖)
- 特點:基于二進制位存儲,節省空間,適合統計狀態(如簽到、在線狀態)。
- 核心操作:
SETBIT sign:202406 1 1 # 用戶1在第1天簽到(offset從0開始)
GETBIT sign:202406 1 # 查詢簽到狀態
BITCOUNT sign:202406 # 統計總簽到次數
- 應用場景:
- 每日簽到(
SETBIT
標記日期,BITCOUNT
統計天數)。 - 活躍用戶統計(按天標記在線狀態)。
- 每日簽到(
2. HyperLogLog(基數統計)
- 特點:近似統計不重復元素個數,內存占用固定(約12KB),存在誤差(<1%)。
- 核心操作:
PFADD hll:uv 1 2 3 # 添加元素
PFCOUNT hll:uv # 統計UV數
PFMERGE hll:uv_week hll:uv_day1 hll:uv_day7 # 合并多日統計
- 應用場景:
- 大規模UV統計(如網站日活、月活)。
3. Geo(地理空間索引)
- 特點:存儲經緯度,支持距離計算、范圍查詢。
- 核心操作:
GEOADD cities 113.017 28.2 "Changsha" 120.15 30.2 "Hangzhou" # 添加地點
GEODIST cities "Changsha" "Hangzhou" KM # 計算距離(公里)
GEORADIUS cities 113 28 5 KM WITHCOORD # 查詢5公里內的地點并返回坐標
- 應用場景:
- 附近推薦(如外賣商家、共享單車定位)。
4. Stream(流)
- 特點:Redis實現的消息隊列,支持生產者-消費者模型,自動生成消息ID。
- 核心操作:
XADD stream:msg * user "roy" content "hello" # 添加消息(*自動生成ID)
XGROUP CREATE stream:msg group1 0 # 創建消費者組
XREADGROUP GROUP group1 consumer1 COUNT 10 STREAMS stream:msg > # 消費消息
- 應用場景:
- 輕量級消息隊列(替代Kafka/RabbitMQ的簡單場景)。
三、數據結構選型指南
場景 | 推薦結構 | 理由 |
單值緩存 | String | 簡單高效,支持過期時間 |
對象存儲 | Hash | 字段結構化,節省內存 |
消息隊列 | List/Stream | List實現簡單隊列,Stream支持消費者組 |
去重統計 | Set | 唯一元素特性 |
排行榜 | ZSet | 分值排序,范圍查詢高效 |
簽到統計 | Bitmap | 位操作節省空間 |
地理位置查詢 | Geo | 經緯度索引與距離計算 |
大規模UV統計 | HyperLogLog | 內存固定,適合億級數據 |
四、Spring Boot集成Redis
1. Maven依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. 核心配置(application.properties
)
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=your-password
spring.redis.database=0 # 數據庫索引(默認0)
3. RedisTemplate配置(解決中文亂碼)
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);// 字符串序列化(解決key和value中文亂碼)StringRedisSerializer stringSerializer = new StringRedisSerializer();template.setKeySerializer(stringSerializer);template.setValueSerializer(stringSerializer);// Hash類型序列化template.setHashKeySerializer(stringSerializer);template.setHashValueSerializer(stringSerializer);return template;
}
4. 操作示例
@Autowired
private RedisTemplate<String, Object> redisTemplate;// String操作
redisTemplate.opsForValue().set("key", "value");
String value = (String) redisTemplate.opsForValue().get("key");// Hash操作
redisTemplate.opsForHash().put("user:1", "name", "roy");
String name = (String) redisTemplate.opsForHash().get("user:1", "name");
五、注意事項
- 大Key問題:避免單個Key存儲過多數據(如List超過百萬元素),影響性能。
- 內存優化:優先使用壓縮存儲結構(如Hash比String更節省空間)。
- 持久化策略:根據業務選擇RDB或AOF,避免數據丟失。
- 集群模式:分布式場景需考慮數據分片(如Hash Tag確保相關數據在同一節點)。