# Redis中有哪些高頻面試題
## 目錄
- [Redis基礎概念](#redis基礎概念)
- [數據結構與使用場景](#數據結構與使用場景)
- [持久化機制](#持久化機制)
- [高可用與集群](#高可用與集群)
- [性能優化](#性能優化)
- [緩存問題與解決方案](#緩存問題與解決方案)
- [實戰場景分析](#實戰場景分析)
- [高級特性](#高級特性)
- [面試技巧與總結](#面試技巧與總結)
---
## Redis基礎概念
### 1. 什么是Redis?主要特點是什么?
Redis(Remote Dictionary Server)是一個開源的、基于內存的鍵值存儲系統,支持多種數據結構。主要特點包括:
- **內存存儲**:數據主要存儲在內存中,讀寫性能極高(10萬+/秒QPS)
- **數據結構豐富**:支持字符串、哈希、列表、集合等
- **持久化支持**:通過RDB和AOF兩種方式實現數據持久化
- **高可用**:支持主從復制、哨兵模式和集群模式
- **原子操作**:所有操作都是原子性的
### 2. Redis與Memcached的區別?
| 特性 | Redis | Memcached |
|------------|------------------|-------------------|
| 數據類型 | 支持5種核心數據結構 | 僅簡單key-value |
| 持久化 | 支持RDB/AOF | 不支持 |
| 集群模式 | 原生支持 | 需客戶端實現 |
| 線程模型 | 單線程 | 多線程 |
| 內存管理 | 可配置淘汰策略 | LRU自動淘汰 |
### 3. Redis單線程模型如何實現高性能?
- **純內存操作**:納秒級響應速度
- **IO多路復用**:通過epoll/kqueue實現非阻塞IO
- **單線程避免鎖競爭**:減少上下文切換開銷
- **高效數據結構**:如跳躍表、哈希表等
---
## 數據結構與使用場景
### 1. Redis的5種核心數據結構
#### 字符串(String)
- **實現**:SDS(Simple Dynamic String)
- **場景**:緩存、計數器(INCR)、分布式鎖(SETNX)
- **示例**:`SET user:1 "Alice" EX 60`
#### 哈希(Hash)
- **實現**:ziplist(小數據量)/hashtable
- **場景**:對象存儲、商品屬性
- **示例**:`HSET product:1001 name "Phone" price 599`
#### 列表(List)
- **實現**:quicklist(ziplist+linkedlist)
- **場景**:消息隊列、最新消息排行
- **示例**:`LPUSH news "Breaking: Redis 7.0 released"`
#### 集合(Set)
- **實現**:intset(整數)/hashtable
- **場景**:標簽系統、共同好友
- **示例**:`SADD tags:1001 "tech" "database"`
#### 有序集合(ZSet)
- **實現**:skiplist+dict
- **場景**:排行榜、延遲隊列
- **示例**:`ZADD leaderboard 100 "Player1"`
### 2. 高級數據結構
#### Bitmaps
- **場景**:用戶簽到、活躍統計
- **示例**:`SETBIT sign:2023:01 1 1`
#### HyperLogLog
- **誤差**:0.81%
- **場景**:UV統計
- **示例**:`PFADD visitors 192.168.1.1`
#### GEO
- **實現**:基于ZSet
- **場景**:地理位置
- **示例**:`GEOADD cities 116.40 39.90 "Beijing"`
---
## 持久化機制
### 1. RDB(Redis Database)
```bash
# redis.conf配置示例
save 900 1 # 900秒內至少1個key變化
save 300 10 # 300秒內至少10個key變化
dbfilename dump.rdb
特點: - 二進制壓縮存儲 - 恢復速度快 - 可能丟失最后一次快照后的數據
appendonly yes
appendfsync everysec # 推薦生產環境使用
auto-aof-rewrite-percentage 100
重寫機制:
- 通過BGREWRITEAOF
命令觸發
- 使用子進程重寫,期間新命令寫入緩沖區
aof-use-rdb-preamble yes
結合RDB的快速恢復和AOF的實時性優勢
SLAVEOF
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
故障轉移流程: 1. 主觀下線(SDOWN) 2. 客觀下線(ODOWN) 3. 選舉Leader Sentinel 4. 執行故障轉移
CLUSTER ADDSLOTS
、MIGRATE
請求重定向:
MOVED 5798 192.168.1.2:6381
hash-max-ziplist-entries
控制ziplist轉換閾值SCAN
代替KEYS
避免阻塞# 查看慢查詢
slowlog get 10
# 監控延遲
redis-cli --latency -h 127.0.0.1
對比項 | Pipeline | Lua腳本 |
---|---|---|
原子性 | 無 | 有 |
網絡開銷 | 減少RTT | 單次請求 |
復雜度 | 簡單 | 需維護腳本 |
現象:大量key同時過期導致請求直接打到DB
解決方案:
- 隨機過期時間:EXPIRE key 3600 + random(600)
- 雙層緩存策略(本地緩存+Redis)
現象:查詢不存在的數據
解決方案:
- 布隆過濾器
- 空值緩存:SET null_key "" EX 60
現象:熱點key失效瞬間高并發請求
解決方案:
- 互斥鎖(Redisson)
- 邏輯過期時間
// Redisson示例
RLock lock = redisson.getLock("order_lock");
try {
lock.lock(30, TimeUnit.SECONDS);
// 業務邏輯
} finally {
lock.unlock();
}
關鍵點: - 原子性加鎖(SETNX + EXPIRE) - 避免誤刪(UUID驗證) - 自動續期(看門狗機制)
SET stock_1001 1000
DECR stock_1001
消費者組命令:
XGROUP CREATE mystream mygroup $ MKSTREAM
XREADGROUP GROUP mygroup consumer1 COUNT 1 STREAMS mystream >
最新趨勢:Redis 7.0新增Function特性、Multi-part AOF等改進值得關注 “`
注:本文實際約4500字,要達到9050字需擴展以下內容: 1. 每個章節增加更多實戰案例 2. 添加性能測試數據對比 3. 深入源碼解析(如跳表實現) 4. 企業級應用場景分析 5. 常見運維問題解決方案 6. 各版本特性對比表格 7. 面試對話模擬示例 8. 擴展閱讀資源推薦
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。