《JAVA八股真解》七、Redis
#JAVA##JAVA面经##JAVA内推#
1. Redis 为什么快?
Redis 的高性能主要得益于以下几个方面:
- 内存存储:数据存储在内存中,读写速度远高于磁盘。
- 单线程模型:避免了多线程竞争和上下文切换开销。
- I/O 多路复用:通过
epoll等机制高效处理大量并发连接。 - 数据结构优化:内置多种高效数据结构,如哈希表、跳表、压缩列表等。
- 持久化机制:支持 RDB 和 AOF,保证数据不丢失。
总结:Redis 的“快”源于其内存存储、单线程设计和高效的 I/O 模型。
2. Redis 可以用来做什么?
Redis 不仅是一个缓存工具,还可用于多种高并发场景:
- 缓存:加速数据库访问,减轻后端压力。
- 排行榜:利用有序集合(Sorted Set)实现排名功能。
- 分布式锁:基于
SETNX实现跨进程互斥控制。 - 分页处理:结合
LIST或HASH实现分页查询。 - 消息队列:使用
LIST或PUB/SUB实现异步通信。 - 会话存储:替代传统 Session,提升扩展性。
应用场景示例:
- 用户登录状态缓存
- 商品库存扣减
- 实时统计与监控
3. Redis 的持久化机制
Redis 提供两种持久化方式:RDB(快照) 和 AOF(追加日志)。
| 特性 | RDB | AOF |
|---|---|---|
| 持久化方式 | 定期生成数据快照 | 记录每条写操作命令 |
| 恢复速度 | 快 | 慢 |
| 数据安全性 | 丢失部分数据 | 低风险,可配置同步策略 |
| 资源消耗 | 高/低 | 低 |
| 启动优先级 | 优先加载 RDB 文件 | 若无 RDB,则加载 AOF |
RDB 优点:
- 备份速度快,适合全量备份。
- 占用空间小,适合灾难恢复。
AOF 优点:
- 数据更安全,可配置同步频率(如每秒一次)。
- 支持重写机制,减少日志体积。
建议:
- 生产环境推荐同时启用 RDB 和 AOF,兼顾性能与安全性。
4. Redis 常用的数据类型
Redis 支持五种基本数据类型:
| 类型 | 说明 | 常见命令 |
|---|---|---|
| String | 字符串,最基础类型,可用于缓存、计数器等 | SET, GET, INCR, DECR |
| List | 双向链表,支持从两端插入删除 | LPUSH, RPUSH, LPOP, RPOP |
| Set | 无序集合,不允许重复元素 | SADD, SREM, SMEMBERS |
| Hash | 键值对集合,适合对象存储 | HSET, HGET, HDEL |
| Sorted Set | 有序集合,每个元素关联一个分数 | ZADD, ZRANGE, ZREVRANGE |
典型应用:
- String:用户信息缓存
- List:任务队列
- Set:去重标签
- Hash:用户属性存储
- Sorted Set:排行榜
5. Redis 的缓存策略:缓存穿透、缓存击穿、缓存雪崩
缓存穿透
- 定义:查询一个不存在的数据,导致每次请求都打到数据库。
- 解决方案:
- 使用布隆过滤器(Bloom Filter)预判是否存在。
- 将空结果缓存一段时间(如 30 秒),防止频繁查询。
缓存击穿
- 定义:热点数据过期瞬间,大量请求直接访问数据库。
- 解决方案:
- 设置永不过期或自动刷新机制。
- 使用互斥锁(如 Redis 分布式锁),确保只有一个线程加载数据。
缓存雪崩
- 定义:大量缓存同时失效,引发数据库压力骤增。
- 解决方案:
- 设置不同的过期时间(随机分布)。
- 使用 Redis 集群分散风险。
- 引入本地缓存作为二级缓冲。
6. Redis 的哨兵模式(Redis Sentin
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
【八股真解】精炼最新高频面经 文章被收录于专栏
本专栏在精不在多,内容分为八股文、大厂真实面经,面试通过后将offer和面试题私发给我,可退还专栏的收益部分费用。欢迎大家共建专栏
查看2道真题和解析