1. 介绍下Redis,Redis有哪些数据类型?
Redis是开源的内存数据结构存储系统,常用作数据库、缓存和消息中间件,支持持久化。
数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Sorted Set(有序集合),以及Bitmaps、HyperLogLog、Geospatial、Stream等扩展类型。
2. Redis提供了哪几种持久化方式?
- RDB :定期生成内存快照,保存到
.rdb文件,适合备份与快速恢复。 - AOF :记录每次写命令到
.aof文件,支持不同同步策略(每秒/每次命令),数据更安全。 - 混合持久化(Redis 4.0+):结合RDB与AOF,AOF重写时以RDB格式开头,兼顾恢复速度与数据完整性。
3. Redis为什么快?
- 基于内存操作,读写速度快。
- 单线程模型,避免上下文切换和锁竞争。
- 高效I/O多路复用(epoll等),处理高并发连接。
- 简洁高效的数据结构和底层编码(如SDS、ziplist、跳表等)。
4. Redis为什么是单线程的?
单线程简化了设计和实现,避免多线程的竞争、死锁等问题;瓶颈不在CPU,而在内存和网络I/O,单线程配合I/O多路复用足以达到高性能。
注:Redis 6.0后引入多线程处理网络I/O,但核心命令执行仍为单线程。
5. Redis服务器的内存是多大?
默认无硬性上限,通过maxmemory配置限制。生产环境根据机器资源和业务需求设定,避免OOM导致系统故障。
6. 为什么Redis的操作是原子性的,怎么保证原子性的?
Redis单线程执行命令,天然保证每个命令的原子性。
对于多个命令的原子性,可通过Lua脚本或MULTI/EXEC事务(部分支持,非严格ACID)实现。
7. Redis有事务吗?
有,通过MULTI、EXEC、WATCH等命令实现。事务中命令依次执行,不被其他命令打断,但不支持回滚;WATCH可实现乐观锁。
8. Redis数据和MySQL数据库的一致性如何实现?
常见方案:
- 先更新数据库,再删除缓存(推荐),配合消息队列或Canal监听binlog异步重试删除。
- 设置合理过期时间,作为兜底。
- 读写锁/双删 等策略降低并发不一致风险。
最终一致性可满足大部分场景,强一致则需分布式事务或避免使用缓存。
9. 缓存击穿,缓存穿透,缓存雪崩的原因和解决方案
- 穿透 :查询不存在数据,绕过缓存直击DB。
→ 布隆过滤器、缓存空对象。 - 击穿 :热点key过期,高并发同时查DB。
→ 互斥锁、逻辑过期、永不过期(异步更新)。 - 雪崩 :大量key同时过期或Redis宕机。
→ 过期时间加随机值、多级缓存、集群高可用、限流降级。
10. 哨兵模式是什么样的?
哨兵(Sentinel)是Redis的高可用方案:
- 监控主从节点健康状态。
- 自动故障转移,当主节点宕机时选举新主。
- 通过投票机制实现,通常部署奇数个(≥3)实例防止脑裂。
11. Redis常见性能问题和解决方案
- 大key:拆分、优化数据结构、使用unlink异步删除。
- 热key:多级缓存、读写分离、本地缓存。
- 慢查询:优化命令(避免keys *)、使用scan替代。
- fork耗时(RDB/AOF重写):控制内存、减少写时复制开销。
- 网络延迟:使用pipeline、长连接、部署同机房。
12. MySQL里有大量数据,如何保证Redis中的数据都是热点数据?
- 设置
maxmemory+volatile-lru或allkeys-lru淘汰策略。 - 只缓存高频访问数据,通过流量统计或业务标记。
- 利用LFU(Redis 4.0+)更精准识别热点。
13. Redis集群方案应该怎么做?都有哪些方案?
- 客户端分片:应用层实现路由,不推荐。
- Twemproxy/Codis:代理中间件,支持分片。
- Redis Cluster(官方):去中心化,使用哈希槽,支持线性扩展和故障转移。
14. 说说Redis哈希槽的概念
Redis Cluster将数据分为16384个哈希槽,每个key通过CRC16(key) % 16384确定所在槽,集群节点分别负责部分槽。
增减节点时只需迁移槽,实现平滑扩展。
15. Redis有哪些适合的场景?
- 缓存(热点数据、Session、页面)
- 计数器、限流
- 排行榜(Sorted Set)
- 消息队列(Stream、List)
- 分布式锁(Redlock、setnx)
- 去重、签到(Set、Bitmaps)
- 地理位置功能(Geospatial)
16. Redis在项目中的应用
(结合项目经历简要说明)
例如:
- 作为首页缓存,降低MySQL压力。
- 利用Sorted Set实现榜单实时更新。
- 用Redisson实现分布式锁,保证定时任务单点执行。
- 通过Stream做异步任务队列,提升系统吞吐。