Redis(Remote Dictionary Server)作為當今最流行的開源內存鍵值存儲,憑藉亞毫秒級延遲、豐富數據結構、原子操作、主從復制/哨兵/集群高可用架構,已成為現代互聯網架構中緩存、會話存儲、排行榜、分佈式鎖、消息隊列、流式處理等場景的基石組件。本文系統梳理 Redis 核心知識體系,從安裝驗證到五大基礎數據類型、進階特性(HyperLogLog、發布訂閱、事務、Lua 腳本、管道、分區)、安全與備份、性能基準測試,為開發者與運維人員提供一份可落地的實戰參考。
# 1. 安裝
sudo apt-get update && sudo apt-get install redis-server
# 2. 啟動服務
redis-server # 前台運行,生產建議用 systemctl start redis-server
# 3. 連線驗證
redis-cli
127.0.0.1:6379> PING
PONG # 返回 PONG 表示服務正常
圖形化管理: 推薦 Redis Desktop Manager (RDM),提供直觀的 Key 瀏覽、數據編輯、慢日誌分析、內存分析功能。
SET key value [EX seconds] [NX|XX]、GET key、INCR/DECR key、MGET/MSET、GETSET、APPEND、STRLEN。127.0.0.1:6379> SET name "yiibai"
OK
127.0.0.1:6379> GET name
"yiibai"
HSET/HGET/HMSET/HMGET/HGETALL/HDEL/HEXISTS/HLEN/HKEYS/HVALS/HINCRBY。127.0.0.1:6379> HMSET user:1 username yiibai password yiibai points 200
OK
127.0.0.1:6379> HGETALL user:1
1) "username" 2) "yiibai" 3) "password" 4) "yiibai" 5) "points" 6) "200"
LPUSH/RPUSH/LPOP/RPOP/LRANGE/LLEN/LINDEX/LSET/LTRIM/BLPOP/BRPOP。BLPOP/BRPOP 完美支撐生產者-消費者模式;LTRIM 實現定長滾動窗口(如最新 100 條評論)。127.0.0.1:6379> LPUSH tutorials redis mongodb mysql
(integer) 3
127.0.0.1:6379> LRANGE tutorials 0 10
1) "mysql" 2) "mongodb" 3) "redis"
SADD/SREM/SMEMBERS/SISMEMBER/SCARD/SINTER/SUNION/SDIFF/SRANDMEMBER/SSCAN。127.0.0.1:6379> SADD tutorials redis mongodb mysql
(integer) 3
127.0.0.1:6379> SADD tutorials mysql # 重複自動去重
(integer) 0
127.0.0.1:6379> SMEMBERS tutorials
1) "mysql" 2) "mongodb" 3) "redis"
score(雙精度浮點),按 score 升序排列,score 可重複。ZADD/ZREM/ZRANGE/ZREVRANGE/ZRANGEBYSCORE/ZREVRANGEBYSCORE/ZRANK/ZSCORE/ZINCRBY/ZCOUNT/ZUNIONSTORE/ZINTERSTORE。127.0.0.1:6379> ZADD tutorials 1 redis 2 mongodb 3 mysql
(integer) 3
127.0.0.1:6379> ZRANGE tutorials 0 -1 WITHSCORES
1) "redis" 2) "1" 3) "mongodb" 4) "2" 5) "mysql" 6) "4"
PFADD key element...、PFCOUNT key...、PFMERGE destkey sourcekey...。127.0.0.1:6379> PFADD tutorials redis mongodb mysql
(integer) 1
127.0.0.1:6379> PFCOUNT tutorials
(integer) 3
SUBSCRIBE channel、PUBLISH channel message、PSUBSCRIBE pattern、PUNSUBSCRIBE。# 終端 1(訂閱者)
127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe" 2) "redisChat" 3) (integer) 1
# 終端 2(發布者)
127.0.0.1:6379> PUBLISH redisChat "Redis is great"
(integer) 1 # 返回訂閱者數量
# 終端 1 收到
1) "message" 2) "redisChat" 3) "Redis is great"
MULTI 開啟 → 多命令入隊(返回 QUEUED)→ EXEC 原子提交 / DISCARD 取消。WATCH key 實現樂觀鎖(CAS)。127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET tutorial redis
QUEUED
127.0.0.1:6379> GET tutorial
QUEUED
127.0.0.1:6379> INCR visitors
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) "redis"
3) (integer) 1
EVAL script numkeys key [key ...] arg [arg ...]、EVALSHA sha1 numkeys key [key ...] arg [arg ...](緩存腳本)。127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1" 2) "key2" 3) "first" 4) "second"
# Shell 管道示例
(echo -en "PING\r\nSET tutorial redis\r\nGET tutorial\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n"; sleep 1) | nc localhost 6379
+PONG
+OK
$6
redis
:1
:2
:3
| 策略 | 原理 | 優點 | 缺點 | 典型實現 |
|---|---|---|---|---|
| 範圍分區 | Key 範圍映射實例(如 user:1~10000 → R0) | 範圍查詢高效、實現簡單 | 熱點傾斜、再平衡困難 | 早期客戶端分片 |
| 哈希分區 | CRC32/一致性哈希 → 實例 | 數據均勻、擴容平滑(一致性哈希) | 跨鍵操作受限、範圍查詢不可用 | Redis Cluster (16384 slots)、Codis、Twemproxy |
分區代價: 失去多鍵事務、Lua 跨槽執行、交集/並集運算;備份恢復需聚合多節點 RDB/AOF;運維複雜度指數級上升。非必要不分片,必要時首選 Redis Cluster 官方方案。
# 設置密碼(需 redis.conf 配合 requirepass 永久生效)
CONFIG SET requirepass "strong_password"
# 客戶端認證
AUTH "strong_password"
# 禁用高危命令
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command KEYS ""
rename-command CONFIG ""
生產環境必須綁定內網 IP(`bind 10.x.x.x`)、啟用密碼、重命名/禁用危險命令、配置防火牆策略。
SAVE(阻塞)/ BGSAVE(fork 子進程異步,生產首選)。生成 `dump.rdb`。redis-benchmark -n 100000 -q
# 關鍵輸出解讀:
# PING_INLINE: 141043.72 req/s
# SET: 141442.72 req/s
# GET: 145348.83 req/s
# LPUSH: 145348.83 req/s
# SADD: 146198.83 req/s
# LRANGE_100: 58411.21 req/s (列表範圍讀取隨長度遞減)
重點關注 GET/SET 延遲分位數(P50/P99) 而非純 QPS,結合 `--latency` 參數分析抖動。
Redis 以極簡內核支撐起極豐富的業務語義,掌握其數據結構本質、單線程模型邊界、分佈式擴展代價,才能在架構決策中游刃有餘。願這份攻略成為你 Redis 之旅的得力地圖。