redis 面试题
技巧:
1、redis + lua 解决高并发场景下的写操作
2、redis 分布式锁,防止并发写
3、redis 队列、排序集合实现一些特殊场景下的需求
4、缓存预热
一、基础面试题
0、你们是怎么使用 redis的 ?
使用场景:
1、使用 string、hash、set 等结构来缓存,降低 DB 压力,非常常用的场景
2、使用 list 做队列、sort set 实现排名、延迟队列、抽奖,一些特殊场景处理方案
3、使用 redis + lua + mq 解决高并发下的写操作(比如扣减库存等),通用高并发处理方案
1、为什么不适应 java 来进行缓存,而使用 redis ?
思考:
1、如何分配内存,怎么设计数据结构,设计哪些数据结构
2、如何回收过期的 key
3、如何保证宕机后缓存数据丢失
4、如何做集群、高可用、单节点内存限制
5、事务如何做、有什么缺点,采用什么方式去弥补这个缺点
2、redis 为什么占用内存少、持久化方式?
思考:1、对于不同场景,设计不同数据结构,比如list,小数据量可用压缩列表的,大数据量可以基于 linkedlist
2、rdb(默认) + aof,其中rdb是内存快照,断电时有少量数据丢失,如果同时开启默认使用 aof 恢复数据,速度慢。
3、redis是单线程吗?
思考:1、redis 命令执行是一个线程顺序执行的,一编程简单,二无需线程切换加锁,redis命令都是顺序执行(非常好的特性)
4、redis 的事务使用过,有什么缺点吗?
思考:1、事务要么全部执行,而 redis 事务仅是顺序执行,如何弥补这个缺点就是采用 redis + lua
5、redis 的数据清楚策略是什么,怎么权衡的?
1、定期 + 惰性
2、基于内存大小做些回收(随机抽检一批进行回收)
6、使用了哪些redis场景?
1、缓存
2、redis消息队列 + sort set (实现类似延迟队列、抽奖)
3、事务消息
4、redis + lua (解决高并发下的写操作)
7、集群
1、master - slave集群
1、为什么出现这种集群机制,目的就是保证数据存储多份,防止单节点故障
2、全量复制 + 增量复制(复制积压缓冲区)
2、为什么提出高可用集群,具体是什么背景
1、slave 宕机时,实现自动提升 slave 为 master,实现故障自动转移,否则需要人工切换,其实自动处理是一个非常危险的过程
3、为什么会提出 redis 分布式集群,解决了什么问题,有什么缺点、客户端怎么查询
1、解决单节点内存大小瓶颈,数据分散到多节点
2、缺点就是一些批量的命令 mget 等可能受限
3、客户端记录一张类似路由表的东西,实现数据访问,如果服务端无数据进行重定向到客户端,客户端重新获取
8、如何解决缓存一致性
1、通常都是数据更新后,删除缓存,重建缓存代价比较高(业务逻辑复杂)
9、缓存穿透、击穿、雪崩
1、穿透可以通过防重或布隆过滤器实现、其次可以设置一个特殊值,较短的过期时间
2、击穿可以采用加锁更新缓存的方式处理,防止请求数据库更新缓存
3、雪崩通过将过期时间设置不一样,通过是 expire = 固定过期时间 + 随机数,保证key 不集体失效
二、高级面试题
1、使用 redis 遇到了什么问题
1、redis 集群隔离使用,防止某一业务场景操作 redis 异常影响其他业务,大量 key导致redis 报警
2、redis操作时注意 try-catch,防止 redis 异常影响核心业务
3、注意一些非常危险的 redis 命令,比如keys * 等耗时长的命令,(redis是单线程的,一旦出现就会影响线上)
2、redis 分布式锁和 zookeeper 分布式锁如何选择
1、redis 基于 sexnx 实现,性能较高,缺点是集群复制可能有延迟可导致加锁异常。
1、redisson通过在多个节点加锁来处理这种问题
2、分布式锁的续约,防止业务未执行完释放锁
2、zookeeper高可用集群
1、羊群效应
2、zookeeper 适合读多写少的场景,写代价过高(写时要求一般以上的节点写入成功,导致集群的规模不能无限增多)
3、相对 redis 是一个高可用锁,但是性能比较差
所以一般采用 redis 实现分布式锁。
4、大 key、value 问题
1、分桶,可以采用 hash分桶实现