Redis 大厂常见面试题
Redis 的应用场景
- 缓冲
- 排行榜
- 计数器
- 分布式会话
- 分布式锁
- 社交网络
- 最新列表
- 消息系统
详细看 Redis的8大应用场景
Redis 缓冲与数据库的一致性问题
某个时刻,多个系统实例都去更新某个 key。可以基于 Zookeeper 实现分布式锁。每个系统通过 Zookeeper 获取分布式锁,确保同一时间,只能有一个系统实例在操作某个 Key,别人都不允许读和写。
你要写入缓存的数据,都是从 MySQL 里查出来的,都得写入 MySQL 中,写入 MySQL 中的时候必须保存一个时间戳,从 MySQL 查出来的时候,时间戳也查出来。
每次要写之前,先判断一下当前这个 Value 的时间戳是否比缓存里的 Value 的时间戳要新。如果是的话,那么可以写,否则,就不能用旧的数据覆盖新的数据。
详细看 Redis,双写一致性、并发竞争、线程模型
Redis 分布式锁以及其原理
通过以下四个命令实现:
- setnx
- getset
- expire
- del
详细看 redis分布式锁原理与实现
Redis解决客户端session共享信息?
考虑到session中数据类似map的结构,采用redis中hash存储session数据比较合适,如果使用单个value存储session数据,不加锁的情况下,就会存在session覆盖的问题,因此使用hash存储session,每次只保存本次变更session属性的数据,避免了锁处理,性能更好。
如果每改一个session的属性就触发存储,在变更较多session属性时会触发多次redis写操作,对性能也会有影响,我们是在每次请求处理完后,做一次session的写入,并且之写入变更过的属性。
如果本次没有做session的更改, 是不会做redis写入的,仅当没有变更的session超过一个时间阀值(不变更session刷新过期时间的阀值),就会触发session保存,以便session能够延长有效期。
详细看 几分钟搞定redis存储session共享——设计实现
Redis分布式锁解决了什么问题?
1.1 锁需要具备唯一性
1.2 锁需要有超时时间,防止死锁
1.3 锁的创建和设置锁超时时间需要具备原子性
1.4 锁的超时问题
1.5 锁的可重入问题
1.6 集群下分布式锁的问题
Redis为什么能支持分布式锁?使用方式有哪些?
Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系。
详细看 为什么redis可以做分布式锁
Redis的 缓冲雪崩,缓冲穿透,缓冲击穿,以及解决方案
详细看 缓存雪崩、击穿、穿透(带答案)
Redis的持久化机制,淘汰策略
Redis 主从复制
Redis哨兵机制
以上三个问题,详细看 Redis,哨兵、持久化、主从、手撕LRU,我都整理好了
Zset底层数据结构,以及ziplist和skiplist
zset底层的存储结构包括ziplist或skiplist,在同时满足以下两个条件的时候使用ziplist,其他时候使用skiplist,两个条件如下:
- 有序集合保存的元素数量小于128个
- 有序集合保存的所有元素的长度小于64字节
当ziplist作为zset的底层存储结构时候,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个元素保存元素的分值。
当skiplist作为zset的底层存储结构的时候,使用skiplist按序保存元素及分值,使用dict来保存元素和分值的映射关系。
详细看 redis zset底层数据结构