马士兵-Redis面试题
1.Redis为什么这么快
纯内存访问,单线程避免上下文切换,渐进式ReHash,缓存时间戳
其中,渐进式Rehash用到了两张全局哈希表,缓存时间戳就是,不用System.currentTimeInMillis(因为要调用系统级别的IO,很耗时,单线程的Redis承受不起),而是对时间进行缓存,由一个定时任务,每毫秒更新一次时间缓存,获取时间都是从缓存中直接拿。
2.Redis合适的应用场景
缓存,分布式锁,消息队列,排行榜等
String:缓存,计数,共享Session,
Hash:存对象
List: 消息队列,文章列表的展示
Set: 标签(tag)–>用户喜好
Zset: 排行榜
BitMaps: 布隆过滤器
HyperLogLog: 统计UV:同一个用户一天之内的访问请求只能算作一次。用HyperLogLog存的话比用集合存要更省存储(set存要28G的内容,HyperLogLog存的话要5M即可)
可以结合工作中的具体场景。
3.Redis6.0之前为什么一直是单线程
使用Redis,CPU不是瓶颈,IO是瓶颈。
可以使用pipeline(批量处理),每秒100万个请求。
单线程的话维护成本低,线程安全。而且多线程的线程切换,锁的开销也很大。
4.Redis6.0之后为什么要引入多线程
8W-10W的QPS就是单线程的极限值了。大的公司需要更大的QPS,IO的多线程(内部执行命令还是多线程)
多线程,主线程去做CPU的任务,一些从线程去做IO的任务。
5.Redis有哪些高级功能
慢查询、Pipeline(发送,批处理一堆命令,返回结果)、
事务的功能比较低级,弱事务。
持久化,分布式锁。主从,集群。集群的扩容,缩容,迁移
故障转移:故障发现(主观下线,客观下线。)故障恢复(选举)
6.为什么要用Redis
高性能,高并发。
mysql的并发是1000/s, redis的并发是10W/s
7.Redis与memcache相对比有哪些优势
支持的数据类型比较多,支持单个/批量/弱事务操作。
redis支持发布/订阅。主从多可用,序列化支持,支持lua脚本。执行命令-单线程,网络操作-多线程。
memcache支持多线程
8.怎么理解Redis中事务
redis的事务很简单。将一组需要一起执行的命令放到multi和exec两个命令之间。前面表示事务开始,后面代表事务结束。
redis的事务很弱,只对基本的语法错误进行判断,比如写的sett这种。运行时的错误管不了。
事务还是要用lua.
9.Redis的过期策略以及内存淘汰机制
定期删除–定时扫描,从过期字典里抽20个key,删除其中已经过期的,如果比例超过1/4,则重复。
惰性删除–访问这个Key的时候检查是否过期,如果过期则立刻删除,不返回任何东西。
淘汰算法:
1.不淘汰
2.只淘汰有过期时间的,分为ttl,LRU
3.不管有没有过期时间,LRU,随机
10.什么是缓存穿透
访问一些缓存不存在的数据,就是缓存穿透。
解决放案是让redis直接返回Null,或者用布隆过滤器。
布隆过滤器优化方案:增大数组(预估合适值),或者增加hash函数。
增加了hash函数以后,只有hash1和hash2全是1才继续往下走,有一个是0则说明数据一定不存在。
11.什么是缓存雪崩
Redis宕机或大量key同时失效。
解决方案:集群/主从。 TTL 岔开。
12.使用Redis如何设计分布式锁
使用setnx命令。为了避免死锁,给这个锁一个过期时间。又因为过期时间不好评估,加入watchDog
13.怎么使用Redis实现消息队列
14.什么是Bigkey,会有什么影响
15.Redis如何解决key冲突
key的设计,业务模块+系统名称+关键词
biz-pay-orderId-userId
分布式锁,多个客户端对同一个key的竞争。拿到锁才能进行操作
16.怎么提高缓存命中率
1.提前加载 2.给缓存扩容 3.调整缓存的存储类型(String–>Hash) 4.提升缓存的更新频次(比如canal监听mysql的binlog)
17. Redis持久化方式有哪些,有什么区别
RDB,快照,大,阻塞
AOF,追加,
混合的方式
18.为什么Redis需要把所有数据放到内存中
磁盘读取时间太慢了,太耗时了。
19.如何保证缓存与数据库双写时的数据一致性
1.先删除缓存,后更新数据库,休眠1秒然后再删缓存。(延时双删)
2.先更新数据库,后删除缓存
20.Redis集群方案怎么做
16384个槽。
21.Redis集群方案什么情况下会导致整个集群不可用
为了保证集群完整性,默认情况下,16384个槽任意一个不能用,则集群不可用。
将参数cluster-require-full-coverage配置为no,则主节点只负责它负责的槽,不影响其他槽的可用性。
集群半数以上宕机
选举机制异常的时候
22.Redis的哈希槽的概念
0-16383,三个节点,则每个节点负责大约5460个槽
23.Redis集群会有写操作丢失吗,为什么
一主多从,异步同步,主节点宕机来不及同步。
24.Redis常见性能问题和解决方案
持久化。主从,主不要做持久化,从做持久化
数据比较重要,AOF持久化,slave开启持久化,策略每秒同步一次。
主从复制不要一主99从的网状,可以用多级的树来搞从节点,分担主节点的压力。
25.热点数据和冷数据
数据更新前至少读取2次–才能放缓存。
26.什么情况下会导致Redis阻塞
客户端的主线程执行大命令,比如 keys*
bigkey的删除,释放大量的占用空间。
清空库,flushdb
AOF日志同步写,记录AOF日志,同步写。
从库加载RDB文件