您好,登录后才能下订单哦!
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。