Redis (REmote DIctionary Server) 是 C 語言開發的高性能鍵值存儲,支持字符串、哈希、列表、集合、有序集合五大數據結構,操作原子、單線程模型極致快 (QPS 10w+)、支持持久化 (RDB/AOF)、主從複製、哨兵/集群高可用。本文面向「菜鳥」系統講解核心概念、Java (Jedis) 實戰、六大經典場景。
| 特性 | 說明 |
|---|---|
| 數據結構豐富 | String/Hash/List/Set/ZSet,比 Memcached 更通用 |
| 操作原子性 | 單命令原子,支持 Lua 腳本多命令原子 |
| 高性能 | 純內存 + 單線程無鎖 + I/O 多路復用,讀寫 10w+/s |
| 持久化 | RDB 快照 + AOF 日志,重啟不丟數據 |
| 高可用 | 主從異步複製、哨兵故障轉移、Cluster 分片 |
| 語言支持 | Java/Python/Go/JS/C# 等主流語言客戶端完善 |
Jedis jedis = new Jedis("192.168.146.129", 6379);
// 基礎 KV
jedis.set("name", "boruoyihao");
jedis.get("name"); // boruoyihao
jedis.exists("name"); // true
jedis.append("name", ",Hello"); // 追加
jedis.del("name"); // 刪除
// 批量操作
jedis.mset("name", "boreyihao", "age", "26");
jedis.mget("name", "age"); // [boreyihao, 26]
// 過期時間 (緩存核心)
jedis.setex("name", 2, "boruo"); // 2秒後過期
Thread.sleep(3000);
jedis.get("name"); // null
// 原子計數器 (線程安全!)
jedis.set("age", "26");
jedis.incr("age"); // 27
jedis.decrBy("age", 3); // 24
Map user = new HashMap<>();
user.put("name", "Tom"); user.put("major", "Software"); user.put("age", "43");
jedis.hmset("user:1", user); // 寫入整個對象
jedis.hmget("user:1", "name"); // [Tom] - 只取需要的字段
jedis.hgetAll("user:1"); // 取全對象
jedis.hkeys("user:1"); jedis.hvals("user:1"); // 字段/值列表
// 字段級原子增減
jedis.hset("user:2", "age", "25");
jedis.hincrBy("user:2", "age", 3); // 28
// 優勢:修改年齡無需讀取整個對象、反序列化、改、序列化、寫回 (Memcached 痛點)
jedis.del("task");
jedis.rpush("task", "do homework", "clean house"); // 右進 (隊列尾)
jedis.lpush("task", "rest", "watch tv"); // 左進 (棧頂/隊列頭)
jedis.llen("task"); // 4
jedis.lrange("task", 0, -1); // [watch tv, rest, do homework, clean house] 全範圍
jedis.lindex("task", 2); // do homework
jedis.lpop("task"); // watch tv (左出)
jedis.rpop("task"); // clean house (右出)
// 應用:微博最新評論 lrange(key, 0, 99) 取前 100,避免 MySQL 全表排序
jedis.sadd("s1", "4","1","3","20"); // 自動去重、自動排序 (JDK 實現有序)
jedis.smembers("s1"); // [1, 3, 4, 20]
jedis.scard("s1"); // 4
jedis.sadd("s2", "4","11","13","34","3","20");
jedis.sinter("s1","s2"); // 交集 [3, 4, 20]
jedis.sunion("s1","s2"); // 並集 [1, 3, 4, 11, 13, 20, 34]
jedis.sdiff("s1","s2"); // 差集 [1] (s1 有 s2 無)
// 應用:用戶標籤交集推薦、共同好友
jedis.zadd("rank", 12, "Tom"); // score=12
jedis.zadd("rank", 1, "Jack");
jedis.zadd("rank", 20, "David");
jedis.zadd("rank", 3, "Jim");
jedis.zrange("rank", 0, -1); // [Jack, Jim, Tom, David] 按 score 升序
jedis.zcard("rank"); // 4
jedis.zscore("rank", "Tom"); // 12.0
// 應用:微博熱榜 (score=轉發+評論+點贊)、遊戲排行榜、延遲隊列 (score=執行時間戳)
| 場景 | 核心數據結構 | 關鍵 API | 業務價值 |
|---|---|---|---|
| 消息隊列 | List | LPUSH/RPOP / BRPOP 阻塞 | 異步解耦、削峰填谷、郵件/通知/任務分發 |
| 最新 N 條數據 | List | LRANGE key 0 99 | 微博評論/動態流,避免 DB 全表排序 |
| 高併發計數器 | String / Hash | INCR / HINCRBY (原子) | 點贊/閱讀數,線程安全無鎖 |
| 排行榜 / Top N | ZSet | ZADD / ZRANGE / ZREVRANGE | 遊戲積分榜、熱門商品、熱搜榜 |
| 去重 / 集合運算 | Set | SADD / SINTER / SUNION / SDIFF | 標籤系統、共同好友、用戶畫像交集 |
| 發布訂閱 | Pub/Sub | PUBLISH / SUBSCRIBE / PSUBSCRIBE | 聊天室、實時通知、配置變更推送 |
Redis = 五大結構 + 原子操作 + 高性能 + 持久化 + 高可用。掌握 String 做緩存/計數、Hash 存對象、List 做隊列/最新列表、Set 去重/集合運算、ZSet 排行榜/延遲隊列,覆蓋 90% 互聯網業務場景。菜鳥起步:先跑通 Try Redis,再寫 Jedis Demo,最後結合業務場景選結構。記住:Redis 不是萬能鑰匙,但解決「快」的問題是專業的。