- 什么是 Redis
Redis ,全称 Remote Dictionary Server ,是一个基于内存的高性能 Key-Value 数据库。
另外,Redis 已经成为互联网公司在缓存组件选择的唯一,更多的关注点是,如何使用好 Redis
- Redis 有什么优点
1. 速度快
因为数据存在内存中,类似于 HashMap ,HashMap 的优势就是查找和操作的时间复杂度都是O (1) 。
Redis 本质上是一个 Key-Value 类型的内存数据库,很像Memcached ,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据 flush 到硬盘上进行保存。
因为是纯内存操作,Redis 的性能非常出色,每秒可以处理超过 10 万次读写操作,是已知性能最快的 Key-Value 数据库。
如果我们查看在阿里云销售的 Redis 规格,最低的也是 8W QPS 。
2. 支持丰富数据类型
支持 String ,List,Set,Sorted Set,Hash 。
Redis 的出色之处不仅仅是性能,Redis 最大的魅力是支持保存多种数据结构,此外单个 Value 的最大限制是1GB,不像 Memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能。比方说:
用他的 List 来做 FIFO 双向链表,实现一个轻量级的高性能消息队列服务。
用他的 Set 可以做高性能的 tag 系统等等。
3. 丰富的特性
订阅发布 Pub / Sub 功能
Key 过期策略
事务
支持多个 DB
计数
…
并且在 Redis 5.0 增加了 Stream 功能,一个新的强大的支持多播的可持久化的消息队列,提供类似 Kafka 的功能。
4. 持久化存储
Redis 提供 RDB 和 AOF 两种数据的持久化存储方案,解决内存数据库最担心的万一Redis 挂掉,数据会消失掉。
- Redis 有什么缺点
1、由于 Redis 是内存数据库,所以,单台机器,存储的数据量,跟机器本身的内存大小。虽然 Redis 本身有 Key 过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定期删除数据。
另外,可使用 Redis Cluster、Codis 等方案,对 Redis 进行分区,从单机 Redis 变成集群 Redis 。
2、如果进行完整重同步,由于需要生成 RDB 文件,并进行传输,会占用主机的 CPU ,并会消耗现网的带宽。不过 Redis2.8 版本,已经有部分重同步的功能,但是还是有可能有完整重同步的。比如,新上线的备机。
3、修改配置文件,进行重启,将硬盘中的数据加载进内存,时间比较久。在这个过程中,Redis 不能提供服务。
- 为什么 Redis 单线程模型也能效率这么高?
1、纯内存操作。
Redis 为了达到最快的读写速度,将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以 Redis 具有快速和数据持久化的特征。
如果不将数据放在内存中,磁盘 I/O 速度会严重影响 Redis 的性能。
2、核心是基于非阻塞的 IO 多路复用机制。
3、单线程反而避免了多线程的频繁上下文切换问题。
Redis 利用队列技术,将并发访问变为串行访问,消除了传统数据库串行控制的开销
- Redis 全程使用 hash 结构,读取速度快,还有一些特殊的数据结构,对数据存储进行了优化,如压缩表,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度。
- Redis 是单线程的,如何提高多核 CPU 的利用率
可以在同一个服务器部署多个 Redis 的实例,并把他们当作不同的服务器来使用,在某些时候,无论如何一个服务器是不够的, 所以,如果你想使用多个 CPU ,你可以考虑一下分区。
- Redis 有几种持久化方式
1、【全量】RDB 持久化,是指在指定的时间间隔内将内存中的数据集快照写入磁盘。实际操作过程是,fork 一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
2、【增量】AOF持久化,以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
- Redis 有几种数据“过期”策略
Redis 的过期策略,就是指当 Redis 中缓存的 key 过期了,Redis 如何处理。
Redis 提供了 3 种数据过期策略:
被动删除:当读/写一个已经过期的 key 时,会触发惰性删除策略,直接删除掉这个过期 key 。
主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以 Redis 会定期主动淘汰一批已过期的 key 。
主动删除:当前已用内存超过 maxmemory 限定时,触发主动清理策略,即 「数据“淘汰”策略」 。
在 Redis 中,同时使用了上述 3 种策略,即它们非互斥的。
- 聊聊 Redis 使用场景
数据缓存
会话缓存
时效性数据
访问频率
计数器
社交列表
记录用户判定信息
交集、并集和差集
热门列表与排行榜
最新动态
消息队列
分布式锁
- Redis缓存穿透
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。
解决
我们的解决方案:如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
- 阐述你对于Redis穿透和雪崩的一个理解
- 雪崩:
雪崩是指缓存在同一时间内大量键过期(失效),接着来的一大波请求瞬间都落在了数据库中导致连接异常。
- 穿透:
穿透是指短时间内大量的请求缓存中不存在的数据,导致这些请求全都落在了数据库中,使数据库瘫痪或者宕机。
解决:缓存和穿透都可以使用加锁,或者使用MQ解决,避免短时间大量请求同时进入数据库。
- 请简单描述一下Redis的发布订阅
Redis的发布订阅功能用于消息的传输,Redis的发布订阅包括三个部分,发布者,订阅者和Channel。 发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个频道的订阅者就能接收到这条消息。Redis的这种发布订阅机制与基于主题的发布订阅类似,Channel相当于主题。
- Redis有哪些操作是原子性的?
Redis所有的操作都是原子性的。常见的使用比如数值的自增等操作