本文目录如下:
精通 Redis — 基础 Redis知识
一、基础理论【重要】
简单介绍下 Redis?
Redis
是一种基于 键值对 (key-value) 的 NoSQL 数据库,支持丰富的 数据类型。- Redis 将数据存放在 内存 中,读写性能 非常出色,可以满足对 海量数据 的 快速读写。
- 官方数据 可达 100000 QPS。
Redis 有哪些特性 (为什么使用 Redis)?
高性能
:Redis 将数据存放在 内存 中,读写性能 非常出色,可以满足对 海量数据 的 快速读写。丰富的数据类型
: 支持 string,list,set,zset,hash 等。丰富的功能
:提供了数据缓存
、数据持久化
、消息队列
、分布式锁
等功能。
Redis 有哪些功能?
数据缓存
数据持久化
消息队列
分布式锁
Redis 数据类型有哪些?
string
(字符串)list
(列表): string 类型的 列表hash
(哈希)set
(集合): string 类型的 无序集合,集合中不能出现重复的数据。zset
(有序集合): string 类型的 有序集合,每个元素都会关联一个 分数。
Redis 各种 数据类型 的 应用场景 有哪些?
主要应用在 高并发 和 实时请求 的场景:
string
:缓存功能 (如 粉丝数 等)、计数hash
:缓存对象list
:缓存列表、消息队列- set:标签、共同关注
- zset:用户点赞统计、用户排序
Redis 常用操作 (常用指令)?
- keys: 查找所有符合给定模式
pattern
的key
。- set: 添加 string类型数据。
- get: 获取
key
对应的 Value- expire: 为给定
key
设置 生存时间。- exists: 检查给定
key
是否存在。string命令: set、get List命令: lpush、lpop Hash命令: hset、hget
Redis 为什么比 MySQL 速度快?
基于内存
采用单线程
: 单线程 采用 IO道路复用技术 (epoll) 处理多个请求。高性能数据结构
:如 Hash、跳表 (可以实现二分查找的有序链表)。
Redis 采用单线程的优缺点?
Redis 早期的瓶颈可能是 内存大小 或 网络带宽,而不是 CPU。单线程的优点:
- 没有
线程竞争
的 CPU消耗。- 没有
线程切换
的 资源消耗。
单线程的缺点:
- 无法发挥 多核CPU性能。
- 随着 并发量 越来越大,单线程 已经无法满足需求。
简单说⼀下 Redis中的 I/O多路复用技术?
IO多路复用技术
是用 一个线程 来管理 多个连接 的技术,从而提高 并发处理能力。- 只有一个 主线程 负责监听 连接请求,并把 新连接 加入到 事件列表 中。
Memcached 和 Redis 有哪些区别?
- 数据结构:
Memcached
仅支持存储简单的 键值对,不支持 列表、哈希表 等复杂的 数据结构。- 持久化机制:
Memcached
不支持 数据持久化,一旦服务器崩溃,数据就会丢失。
(了解) 简单说一下Redis 中的跳表?
跳表
是 zset 底层使用的一种数据结构。- 跳表 通过在 单链表 上添加多个 索引,实现了 跳跃查询。
二、持久化【重要】
Redis 持久化有几种方式?
RDB
:用 数据快照 的方式 半持久化存储。
RDB
可以 更快地恢复数据,但是会 损失一些数据。可用性差
:RDB持久化 时如果 文件过大 可能会造成 服务器的阻塞。
AOF
: 以 记录命令 的方式 完全持久化存储。
AOF
虽然 速度稍慢,但是 数据完整性 高。可用性好
:增量操作,不会 阻塞服务器。
RDB 和 AOF 如何选择?
- 如果对数据 完整性 要求较高,可以选择
AOF
。- 如果可以接受 数分钟以内的数据丢失,那么可以只使用 RDB 持久化。
三、缓存设计【重要】
什么是缓存穿透?怎么解决?[恶意]
缓存穿透
:查询 缓存 和 数据库 中都没有的数据,缓存 无法命中,导致每次请求都要到 数据库 去查询。
解决方案:
缓存空值/默认值
:数据库中查询不到数据时,把⼀个 空对象 保存到 缓存,之后再访问这个数据,就会从 缓存 中获取。布隆过滤器
:布隆过滤器 会记录 数据是否存在,可过滤 无效的 查询请求。
什么是缓存雪崩?怎么解决?[故障]
缓存雪崩
:缓存服务器 发生故障,或大量 key 同时过期,导致每次请求都要到数据库去查询。
解决方案:
- 尽量分散 key 的 过期时间
- 保证 Redis服务高可用
什么是缓存击穿?怎么解决?[故障]
缓存击穿
:⼀个并发访问量比较大的 key 在某个时间 过期,导致每次请求都要到数据库去查询。
解决方案:
- 设置热点数据永远不过期
- 加锁更新:对该 key 加锁,查询数据库 并 更新缓存。
生产上 Redis内存 设置为多少比较合适?
由于 Redis 底层借鉴了 Hash算法,因此推荐将 Redis内存 设置为 物理内存 的 四分之三。(类似于 HashMap 的 加载因子=0.75?)
Redis 与 数据库 如何保持一致?
MySQL 数据更改时,Redis 需要下面的措施保持 数据一致性:
先更新数据库,再删除缓存
:即 删除缓存 取代 更新缓存。
【缺点: 如果 缓存删除失败,数据就会不一致,可以通过 消息队列 的 确认机制 来保证被删除】
使用过 Redis 做消息队列么,你是怎么用的?
使用 Redis 的 List 数据结构 可以实现 消息队列:
- 在 生产者端,可以通过向 队列尾部 添加消息的方式发布消息 (
rpush
)。- 在 消费者端,可以通过从 队列头部 取出消息的方式消费消息 (
lpop
);
四、Redis运维
Redis报内存不足怎么处理?
Redis 内存不⾜ 有如下几种处理方式:
- 修改
maxmemory
参数,增加 Redis 可用内存。- 修改过期键的 删除策略,及时 释放内存空间。
Redis 过期键的删除策略?
定期删除
: 每 隔一段时间 程序就对 数据库 进行一次检查,删除里面的 过期键。惰性删除
: 放任键过期不管,获取键时 检查取得的键 是否过期,过期则 删除该键。
Redis 数据 淘汰策略 有哪几种?
如果数据存满了,新数据存不进去, 则
redis
会执行 淘汰策略。(主要是LRU算法
)
拒绝写请求
(默认策略):对于 写请求 不再提供服务,直接 返回错误。淘汰最近过期 key
:在设置了 过期时间 的 key 中,淘汰 过期时间剩余最短 的。LRU 淘汰 key
:从所有 key 中使用 LRU算法 进行淘汰(LRU算法:即 最近最少使用算法)。LRU 淘汰 过期key
:从设置了 过期时间 的 key 中使用 LRU算法 进行淘汰。
五、高可用【重要】
1、主从
Redis 中的 主从复制 了解吗?
主从复制
:是指将 主节点 (master) 中的数据,复制到其他的 从节点 (slave) 的过程。数据的复制是 单向的,只能由 主节点 到 从节点。
主从复制 的 作用:
故障恢复
:当 主节点 发生故障时,可以由 从节点 提供服务。读写分离
:通过 主从复制 技术可实现 读写分离,大大提高了 Redis 服务器 的 并发量。⾼可用基石
:主从复制 是 哨兵 和 集群 功能的 基础。
Redis主从有几种常见的拓扑结构?
根据 拓扑复杂性 可以分为以下三种:
⼀主⼀从
:可提供故障转移
服务。⼀主多从
:可提供 读写分离、故障转移
服务。树状主从结构
:通过引入 复制中间层,可以降低 主节点 维护 从节点 的 负担。
主从复制 存在哪些问题?
主从复制 虽好,但也存在 ⼀些问题:
- 主从复制 无法完成
自动故障转移
。Redis Sentinel
(哨兵) 可以解决这个问题。- 主节点 的
写能力
和存储能力
受到 单机的限制。
2、Sentinel (哨兵)
Redis Sentinel (哨兵) 了解吗?
Redis Sentinel
由两部分组成,哨兵节点 和 数据节点:
哨兵节点
: 哨兵节点 是特殊的 Redis 节点,不存储数据。- 哨兵节点 对 数据节点 进行
监控
,当 主节点 发生故障 时,提供自动故障转移
功能 。
数据节点
: 主节点 和 从节点 都是 数据节点;
领导者 Sentinel节点选举 了解吗?
Redis 使⽤了 Raft算法 实现 领导者选举,⼤致流程如下:
- 1.Sentinel节点 确认 主节点 下线的时候,会向其他 Sentinel节点 发送命令, 要求将自己设置为 领导者。
- 2.每个 Sentinel节点 都只能 投出一票。
- 3.如果该 Sentinel节点 发现自己的 票数 已经 >= max(quorum, num(sentinels)/2+1),那么它将成为 领导者。
- 4.如果此过程没有选举出领导者,将进⼊ 下一轮选举。
注:正常情况下,最先确认 master 客观下线的 Sentinel节点,就会成为 执行故障转移 的 leader。
3、(了解) 集群
(了解) Redis 集群了解吗?
Redis集群 由多个 节点(Node) 组成,集群中的节点分为 主节点 和 从节点。
- 主节点:负责 读写请求 和 集群信息的维护。
- 从节点:只进行主节点数据和状态信息的复制。
Redis 集群
有两大特性:
数据分区
: 数据分区 是集群 最核心 的功能。集群 将数据分散到 多个节点。⾼可用
: 集群支持 主从复制 和主节点的 自动故障转移 (与哨兵类似),当任⼀节点发⽣故障时,集群仍然可以对外提供服务。
(了解) Redis 集群 数据分区 的好处?
- Redis 存储能力 突破了 单机 的限制,存储容量 ⼤⼤增加;
- 每个 主节点 都可以对外提供 读服务 和 写服务,⼤⼤提⾼了 Redis 服务器 的 并发量。(Redis集群 中只有主节点,没有从节点)。
(了解) 集群(Cluster)如何进行节点通信?
- Redis集群 采用 P2P 的
Gossip (流言)协议
。Gossip协议
:节点之间彼此不断 交换信息, 一段时间后所有的节点都会知道 完整的集群信息。