一、Redis全局命令詳解
1.1 鍵查看與管理
-
dbsize:高效獲取鍵總數(O(1)操作)
127.0.0.1:6379> dbsize
(integer) 8
-
keys:生產環境避免使用(O(n)操作)
# 查找user開頭的鍵(不推薦生產使用)
127.0.0.1:6379> keys user:*
-
exists:檢查鍵是否存在
127.0.0.1:6379> exists user:1
(integer) 1
1.2 鍵刪除與過期
-
del:刪除單個或多個鍵
# 刪除多個鍵
127.0.0.1:6379> del user:1 user:2
(integer) 2
-
expire:設置過期時間(秒)
127.0.0.1:6379> set session:1 "data"
OK
127.0.0.1:6379> expire session:1 300
(integer) 1
-
ttl:查看剩余生存時間
127.0.0.1:6379> ttl session:1
(integer) 287 # 剩余秒數
1.3 高級過期控制
-
pexpire:毫秒級過期設置
127.0.0.1:6379> pexpire temp:key 5000
(integer) 1
-
expireat:指定時間戳過期
# 設置今晚22:00過期
127.0.0.1:6379> expireat event:1 1730000000
(integer) 1
過期時間陷阱:修改鍵值會清除過期時間
127.0.0.1:6379> set user:1 "John" ex 60
OK
127.0.0.1:6379> ttl user:1
(integer) 57
127.0.0.1:6379> set user:1 "Mike"
OK
127.0.0.1:6379> ttl user:1
(integer) -1 # 永久有效
1.4 鍵重命名注意事項
-
rename:可能覆蓋現有鍵
127.0.0.1:6379> set old_key "value1"
OK
127.0.0.1:6379> set new_key "value2"
OK
127.0.0.1:6379> rename old_key new_key
OK
127.0.0.1:6379> get new_key
"value1" # 原值被覆蓋
-
renamenx:安全重命名(僅當新鍵不存在時)
127.0.0.1:6379> renamenx safe_key new_key
(integer) 0 # 重命名失敗
二、Redis數據類型深度解析
2.1 字符串(String)
核心命令:
# 批量操作提升性能
127.0.0.1:6379> mset counter:1 100 counter:2 200
OK# 原子計數器
127.0.0.1:6379> incr counter:1
(integer) 101# 分布式鎖實現
127.0.0.1:6379> setnx lock:order 1
(integer) 1 # 獲取鎖成功
使用場景:
-
緩存熱點數據
-
分布式Session存儲
-
計數器(點擊量/瀏覽量)
-
簡單限流系統
2.2 哈希(Hash)
對象存儲最佳實踐:
# 存儲用戶對象
127.0.0.1:6379> hmset user:1001 name "John" age 30 city "New York"
OK# 獲取部分字段
127.0.0.1:6379> hmget user:1001 name age
1) "John"
2) "30"# 字段自增
127.0.0.1:6379> hincrby user:1001 age 1
(integer) 31
vs 字符串存儲方案:
方案 | 優點 | 缺點 |
---|---|---|
哈希存儲 | 字段級訪問,內存效率高 | 不支持復雜查詢 |
JSON序列化 | 直觀,結構清晰 | 讀寫需序列化,無法部分更新 |
多鍵存儲 | 靈活,支持獨立過期 | 鍵數量膨脹,管理復雜 |
2.3 列表(List)
實現隊列與棧:
# 消息隊列實現
# 生產者
127.0.0.1:6379> lpush msg:queue "task1"
(integer) 1# 消費者(阻塞式)
127.0.0.1:6379> brpop msg:queue 30
1) "msg:queue"
2) "task1"# 棧實現
127.0.0.1:6379> lpush stack "A"
127.0.0.1:6379> lpush stack "B"
127.0.0.1:6379> lpop stack
"B"
高級應用:
-
文章分頁列表
-
最近聯系人列表
-
有限集合(LTRIM)
2.4 集合(Set)
標簽系統實現:
# 用戶標簽
127.0.0.1:6379> sadd user:1001:tags "sports" "music"
(integer) 2# 內容標簽
127.0.0.1:6379> sadd news:1001:tags "politics" "economics"# 查找共同興趣
127.0.0.1:6379> sinter user:1001:tags user:1002:tags
1) "sports"
抽獎系統:
# 參與抽獎
127.0.0.1:6379> sadd lottery:2023 "user1001" "user1002" "user1003"# 隨機抽取3名中獎者
127.0.0.1:6379> srandmember lottery:2023 3
1) "user1002"
2) "user1001"
3) "user1003"
2.5 有序集合(Zset)
排行榜實現:
# 添加玩家分數
127.0.0.1:6379> zadd leaderboard 3500 "player1"
127.0.0.1:6379> zadd leaderboard 4200 "player2"# 更新分數
127.0.0.1:6379> zincrby leaderboard 500 "player1"
"4000"# 獲取Top3
127.0.0.1:6379> zrevrange leaderboard 0 2 withscores
1) "player2"
2) "4200"
3) "player1"
4) "4000"
多維度評分:
# 計算用戶綜合評分(50%行為分+50%消費分)
127.0.0.1:6379> zinterstore user:composite 2 user:behavior_scores user:spending_scores weights 0.5 0.5 aggregate sum
三、Redis最佳實踐
3.1 鍵命名規范
推薦格式:?業務名:對象名:id[:屬性]
示例:?ecommerce:user:1001:profile
優勢:
-
避免鍵沖突
-
結構清晰可維護
-
支持部分匹配查詢
3.2 性能優化要點
-
避免大Key:
-
字符串值 < 10KB
-
集合元素 < 5000
-
-
批量操作:
# 低效方式 for i in {1..100}; do redis-cli set key:$i value; done# 高效方式 redis-cli mset $(printf "key:%d value " {1..100})
-
合理使用數據結構:
場景 推薦結構 對象存儲 Hash 排行榜 Zset 消息隊列 List 標簽系統 Set
3.3 高級特性應用
位圖(Bitmap):
# 用戶簽到系統
127.0.0.1:6379> setbit sign:user:1001 0 1 # 第1天簽到
127.0.0.1:6379> bitcount sign:user:1001 # 總簽到次數
地理空間(Geo):
# 添加位置
127.0.0.1:6379> geoadd shops 116.404 39.915 "shopA"# 查找5km內的店鋪
127.0.0.1:6379> georadius shops 116.400 39.910 5 km
1) "shopA"
四、實戰:電商場景Redis應用
4.1 購物車實現(Hash)
# 添加商品
127.0.0.1:6379> hset cart:user1001 prod1001 2
(integer) 1# 增加數量
127.0.0.1:6379> hincrby cart:user1001 prod1001 1
(integer) 3# 獲取全部商品
127.0.0.1:6379> hgetall cart:user1001
1) "prod1001"
2) "3"
4.2 秒殺系統(String+List)
# 商品庫存預熱
127.0.0.1:6379> set stock:prod2023 100# 扣減庫存(Lua腳本保證原子性)
local stock = redis.call('get', KEYS[1])
if stock and tonumber(stock) > 0 thenredis.call('decr', KEYS[1])redis.call('lpush', 'seckill:success', ARGV[1])return 1
end
return 0
4.3 好友推薦(Set)
# 計算共同好友
127.0.0.1:6379> sinter friends:user1001 friends:user1002# 推薦可能認識的人
127.0.0.1:6379> sdiff friends:user1002 friends:user1001
總結
Redis作為高性能的內存數據庫,其核心價值在于合理利用不同數據結構解決特定場景問題:
-
字符串:簡單緩存、計數器首選
-
哈希:對象存儲最佳選擇,節省內存
-
列表:消息隊列、最新列表實現
-
集合:標簽系統、社交關系處理
-
有序集合:排行榜、優先級隊列場景
提示:本文所有命令均在Redis 6.x版本驗證,不同版本命令支持可能略有差異。生產環境建議使用連接池管理連接,避免頻繁創建連接開銷。