Redis 除了作為高性能緩存外,還因其豐富的數據結構和功能,廣泛應用于多種場景。以下是 Redis 的十大核心用途及具體示例:
1. 分布式會話存儲
- 用途:存儲用戶會話信息(如登錄狀態),實現多服務間共享會話。
- 優勢:避免傳統 Session 存儲在單點故障或擴展性問題。
- 數據結構:Hash(存儲會話字段)、String(簡單鍵值)。
- 示例:
# 存儲用戶會話 HSET user:session:1234 username "john" role "admin" expires 3600 # 獲取會話信息 HGETALL user:session:1234
2. 分布式鎖
- 用途:實現跨服務的互斥鎖,防止并發操作導致的數據不一致。
- 核心命令:
SET key value NX PX 30000
(原子操作 + 超時)。 - 示例(防止重復下單):
# 嘗試獲取鎖(存在則失敗) SET order_lock:1001 "locked" NX PX 10000 # 釋放鎖(需結合Lua腳本保證原子性) if redis.call("get", KEYS[1]) == ARGV[1] thenreturn redis.call("del", KEYS[1]) elsereturn 0 end
3. 消息隊列
- 用途:實現輕量級消息隊列,支持異步任務處理。
- 數據結構:List(LPUSH/RPOP)、Stream(支持消費者組)。
- 示例(使用 List):
# 生產者推送任務 LPUSH task_queue "send_email:user1@example.com" # 消費者獲取任務 RPOP task_queue
4. 實時排行榜
- 用途:實時更新和查詢排行榜(如游戲積分、商品銷量)。
- 數據結構:Sorted Set(按分數排序)。
- 示例(游戲積分排行榜):
# 添加玩家積分 ZADD game_leaderboard 1500 "player1" 2000 "player2" 1800 "player3" # 獲取前10名 ZREVRANGE game_leaderboard 0 9 WITHSCORES
5. 計數器與限流
- 用途:統計訪問量、點贊數,或限制接口請求頻率。
- 核心命令:
INCR
、INCRBY
、EXPIRE
。 - 示例(接口限流:每分鐘最多100次請求):
# 每次請求遞增計數器 INCR api_rate_limit:user123 # 設置過期時間(首次設置時) EXPIRE api_rate_limit:user123 60 # 檢查是否超限 GET api_rate_limit:user123 # 超過100則拒絕
6. 發布/訂閱(Pub/Sub)
- 用途:實現消息廣播,支持實時通知(如聊天室、實時數據推送)。
- 核心命令:
PUBLISH
、SUBSCRIBE
。 - 示例(實時新聞推送):
# 訂閱頻道 SUBSCRIBE news_channel # 發布消息 PUBLISH news_channel "Breaking: Redis 7.0 released!"
7. 地理位置服務
- 用途:存儲和查詢地理位置(如附近的人、商家)。
- 數據結構:GEO(基于 Sorted Set 實現)。
- 示例(查找附近的餐廳):
# 添加地理位置 GEOADD restaurants 116.404269 39.913818 "restaurant_A" GEOADD restaurants 116.407531 39.915264 "restaurant_B" # 查找2公里內的餐廳 GEORADIUS restaurants 116.405285 39.912987 2 km WITHDIST
8. 布隆過濾器(Bloom Filter)
- 用途:高效判斷元素是否存在(如防止緩存穿透、去重)。
- 原理:基于概率的數據結構,占用空間極小。
- 示例(校驗新用戶是否已注冊):
# 添加元素 BF.ADD users "user123" # 檢查是否存在 BF.EXISTS users "user123" # 返回1(可能存在)或0(一定不存在)
9. 實時數據分析
- 用途:統計在線用戶數、實時點擊量等。
- 數據結構:HyperLogLog(去重計數)、Bitmap(位操作)。
- 示例(統計每日活躍用戶):
# 記錄用戶訪問(用戶ID為整型) SETBIT daily_active:20231001 1001 1 # 統計總活躍用戶數 BITCOUNT daily_active:20231001
10. 數據庫與緩存的二級存儲
- 用途:作為 MySQL 的二級存儲,緩存復雜查詢結果。
- 模式:先查 Redis,未命中則查數據庫并回填。
- 示例(緩存商品詳情):
# 查詢商品信息 GET product:detail:1001 # 未命中時從數據庫加載并寫入Redis SET product:detail:1001 '{"id":1001,"name":"Phone"}' EX 3600
總結
Redis 的多樣化應用得益于其 高性能、豐富的數據結構 和 原子操作。合理使用 Redis 可以顯著提升系統性能,解決分布式場景下的復雜問題。根據具體需求選擇合適的數據結構和功能,是最大化 Redis 價值的關鍵。