一、Redis常见面试题总结
1. Redis 的简单介绍
Redis 是一个使用 C 语言开发的数据库,与传统数据库不同的是 Redis 的数据是存在内存中的 ,它是内存数据库,所以读写速度非常快,因此 Redis 被广泛应用于缓存方向。
Redis 除了做缓存之外,也经常用来做分布式锁,消息队列。
Redis 提供了五种数据类型和三大特殊数据类型来支持不同的业务场景。Redis 还支持事务 、持久化、Lua 脚本、多种集群方案。
2. Redis 的优缺点
- 优点:
- 性能极高
- 支持数据的持久化,对数据的更新采用Copy-on-write技术(写拷贝),可以异步的保存在磁盘上
- 具有丰富的数据类型
- 原子性:多个操作通过MULTI和EXEC指令支持事务
- 具有丰富的特性:key过期
- 支持数据的备份,快速的主从复制
- 可用于节点集群
- 缺点:
- 数据库容量受到物理内存的限制,不能用作海量数据的高性能读写
- 适合的场景主要局限在较小数据量的高性能操作和运算上
3. Redis使用单线程模型为什么性能依然很好?
- 避免了线程切换的资源消耗,并且单线程不存在资源共享与竞争,不用考虑锁的问题。
- Redis 是基于内存的,内存的读写速度非常快,使用非阻塞的IO多路复用机制,数据存储进行了压缩优化。
- 使用了高性能数据结构,如hash、跳表等。
4. Redis除了做缓存,还能做什么?
- 分布式锁 :基于 Redisson 来实现分布式锁。
- 限流 :一般是通过 Redis + Lua 脚本的方式来实现限流。
- 消息队列 :Redis 自带的 list 数据结构可以作为一个简单的队列使用。Redis5.0 中增加的 Stream 类型的数据结构更加适合用来做消息队列。它比较类似于 Kafka,有主题和消费组的概念,支持消息持久化以及 ACK 机制。
- 复杂业务场景 :通过 Redis 以及 Redis 扩展(比如 Redisson)提供的数据结构,可以很方便地完成很多复杂的业务场景比如通过 bitmap 统计活跃用户、通过 sorted set 维护排行榜。
5. Redis常见数据结构的使用场景
- string类型:一般常用在需要计数的场景,比如用户的访问次数、热点文章的点赞转发数量等等。
- list类型:发布与订阅或者说消息队列、慢查询。
- hash类型:系统中对象数据的存储。
- set类型:需要存放的数据不能重复以及需要获取多个数据源交集和并集等场景
- zSet类型:需要对数据根据某个权重进行排序的场景。比如在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息等信息。
6. Redis在6.0之前为什么没有多线程
- 单线程编程容易并且更容易维护;
- Redis 的性能瓶颈不在 CPU ,主要在内存和网络;
- 多线程会存在死锁、线程上下文切换等问题,甚至会影响性能。
7. Redis如何判断数据是否过期?
Redis 通过一个叫做过期字典(可以看作是 hash 表)来保存数据过期的时间。过期字典的键指向 Redis 数据库中的某个 key(键),过期字典的值是一个 long long 类型的整数,这个整数保存了 key 所指向的数据库键的过期时间(毫秒精度的 UNIX 时间戳)。
8. Redis中数据的六大淘汰策略?
Redis 在内存不足时,默认不会删除任何数据,但是可以指定当内存不足时使用如下方法执行某些操作:
noeviction:当内存达到阈值的时候,所有引起申请内存的命令都会报错。allkeys-lru:在主键空间中,优先删除最近未使用的key(推荐)。volatile-lru:在设置过期时间的键空间中,优先删除最近未使用的key。allkeys-random:在主键空间中,随机删除key。volatile-random:在设置了过期时间的键空间中,随机删除某个key。volatile-ttl:在设置了过期时间的键空间中,优先删除更早过期时间的key。
9. Redis的事务机制及CAS
watch 指令在 redis 事务中提供了CAS的行为。
为了检测被 watch 的 keys 在多个clients同时改变引起冲突,这些 keys 将会被监控。如果至少有一个被监控的 key 在执行 exec 命令前被修改,整个事物将会回滚,不执行任何动作,从而保证原子性操作,并且执行 exec 会得到 null 的回复。
10. Redis持久化机制有哪些?各有什么优缺点?
- RDB:数据集快照的方式半持久化模式,记录数据库的所有键值对,在某个时间点将数据写入临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,可恢复数据。
- 优点:恢复操作简单,容灾性好,性能高,fork子进程进行写操作,主进程继续处理命令,大数据集比AOF的恢复率高
- 缺点:数据安全性低,RDB是间隔一段时间进行持久化,若期间redis发生故障,可能发生数据丢失。
- AOF:指所有的命令记录以redis命令请求协议的格式完全持久化存储,保存为aof文件
- 优点:数据安全
- 缺点:AOF的持久化文件比RDB大,恢复速度慢
11. 什么是主从复制?
将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave以读为主。
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
12. 使用Redis常遇到的问题?
- 缓存和数据库双写一致性问题
- 缓存雪崩问题
- 缓存击穿问题
- 缓存的并发竞争问题
13. 什么是缓存雪崩?
指在某一个时间段,缓存集中过期失效。Redis宕机!
14. 什么是缓存穿透?
用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。
15. 什么是缓存击穿?
缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库。
当某个key在过期的瞬间,有大量的请求并发访问,这类数据一般是热点数据,由于缓存过期,会同时访问数据库来查询最新数据,并且回写缓存,会导使数据库瞬间压力过大。
二、Redis路线展望
