2.精通Redis—基础 Redis知识、进阶 Redis知识

本文目录如下:

  • 精通 Redis — 基础 Redis知识
    • 一、基础理论
      • 简单介绍下 Redis?
      • Redis 有哪些特性 (为什么使用 Redis)?
      • Redis 有哪些功能?
      • Redis 数据类型有哪些?
      • Redis 的应用场景有哪些?
      • Redis 常用操作 (常用指令)?
      • Redis 为什么比 MySQL 速度快?
      • 简单说⼀下 Redis中的 I/O多路复用技术?
      • Redis为什么早期选择 单线程?
    • 二、持久化
      • Redis 持久化有几种方式?
      • RDB 和 AOF 如何选择?
      • Redis的数据恢复?
    • 三、缓存设计
      • 什么是缓存击穿?怎么解决?
      • 什么是缓存穿透?怎么解决?
      • 什么是缓存雪崩?怎么解决?
      • 生产上 Redis内存 设置为多少比较合适?
      • 怎么保证 缓存 和 数据库数据 的一致性?
      • 怎么处理热key (访问频率高的key)?
      • 缓存预热怎么做呢?
      • 使用过 Redis 做消息队列么,你是怎么用的?
    • 四、Redis运维
      • Redis报内存不足怎么处理?
      • Redis 过期键的删除策略?
      • Redis 数据 淘汰策略 有哪几种?
    • 五、高可用
      • Redis 中的 主从复制 了解吗?
      • Redis主从有几种常见的拓扑结构?
      • 主从复制存在哪些问题?
      • Redis Sentinel (哨兵) 了解吗?
      • Redis Sentinel 自动故障转移 的流程?
      • 领导者Sentinel节点选举了解吗?
      • Redis 集群了解吗?
      • Redis 集群 数据分区 的好处?

精通 Redis — 基础 Redis知识

Redis从入门到精通

一、基础理论

简单介绍下 Redis?

  • Redis 是一种基于 键值对 (key-value)NoSQL 数据库,支持丰富的数据类型。
  • Redis 将所有数据都存放在 内存 中,因此 Redis读写性能 ⾮常出⾊,可以满足对 海量数据快速读写 需求。

Redis 有哪些特性 (为什么使用 Redis)?

  • 高性能Redis 将所有数据都存放在 内存 中,因此 Redis读写性能 ⾮常出⾊。
  • 丰富的数据类型: 支持 stringlistsetZsethash 等。
  • 丰富的功能:提供了 数据缓存数据持久化消息队列 等功能。

Redis 有哪些功能?

  • 数据缓存
  • 数据持久化
  • 消息队列
  • 分布式锁

Redis 数据类型有哪些?

点击查看

  • string(字符串)
  • hash(哈希): string 类型的 字段(key)值(value) 的映射表,通常用来存储对象使用。
  • list(列表): string 类型的 列表; 一般用于 消息队列缓存列表 等场景下。
  • set(集合): string 类型的 无序集合,集合中不能出现重复的数据。
  • zset(sorted set:有序集合): string 类型的 有序集合

Redis 的应用场景有哪些?

主要应用在 高并发实时请求 的场景,例如:新浪微博

  • string缓存功能 (如粉丝数等)、计数
  • hash缓存用户信息缓存对象
  • list消息队列文章列表
  • set标签共同关注
  • zset用户点赞统计用户排序

Redis 常用操作 (常用指令)?

Redis基础知识—基础知识、五大数据类型常用方法

Redis从入门到精通

Redis Key 常用命令查询

  • keys: 查找所有符合给定模式 patternkey (开发模式不推荐使用这个命令)
  • set: 添加 string类型数据
  • del: 删除给定的一个或多个 key
  • expire: 为给定 key 设置 生存时间
  • exists: 检查给定 key 是否存在。
  • move: 将当前数据库的 key 移动到给定的数据库 db 当中。
string命令: set、setx、get
List命令: lpush、lpop
Set命令: sadd、smembers
Hash命令: hset、hget

Redis 为什么比 MySQL 速度快?

  • 基于内存
  • 采用单线程: 避免了 线程切换和竞争 产生的消耗。
  • 基于⾮阻塞的IO多路复⽤机制
  • 高性能数据结构:如 Hash跳表 (可以实现二分查找的有序链表)

简单说⼀下 Redis中的 I/O多路复用技术?

Redis 单线程如何处理那么多的并发客户端连接]

  • IO多路复用技术 是用 一个线程 来管理 多个连接 的技术,从而提高 并发处理能力
  • 只有一个 主线程 负责监听 连接请求,并把 新连接 加入到 事件列表 中。

Redis为什么早期选择 单线程?

Redis 是基于 内存 的,CPU 一般不会成为 Redis 的瓶颈,Redis 的瓶颈最有可能是 内存的大小网络限制


二、持久化

Redis 持久化有几种方式?

RDB:用 数据快照 的方式 半持久化存储

  • 数据安全性低RDB 是间隔一段时间进行 持久化,如果持久化之间 Redis 发生故障,会发生 数据丢失

AOF: 是指所有的命令行记录以 Redis命令 的格式 完全持久化存储

  • AOF 文件比 RDB 文件大,且 恢复速度慢
  • 数据集大 的时候,比 RDB 启动效率低

RDB 和 AOF 如何选择?

  • 如果想达到足够的 数据安全性,应该同时使用 两种持久化 功能。
  • 如果可以接受 数分钟以内的数据丢失,那么可以只使用 RDB 持久化

Redis的数据恢复?

  1. AOF持久化 开启且存在 AOF文件 时,优先加载 AOF文件
  2. AOF关闭 或 AOF⽂件不存在时,加载 RDB文件
  3. 加载 AOF/RDB文件 成功后,Redis 启动成功
  4. AOF/RDB文件 存在错误时,Redis启动失败打印错误信息

三、缓存设计

什么是缓存击穿?怎么解决?

缓存击穿:⼀个并发访问量⽐较⼤的 key 在某个时间 过期,导致每次请求都要到数据库去查询。


解决方案

  • 加锁更新:对该 key 加锁,查询数据库更新缓存
  • 通过 异步 的⽅式 不断地刷新过期时间

什么是缓存穿透?怎么解决?

缓存穿透:查询 缓存数据库 中都没有的数据,缓存 无法命中,导致每次请求都要到数据库去查询。


解决方案

  • 缓存空值/默认值:在数据库不命中之后,把⼀个空对象或者默认值保存到缓存,之后再访问这个数据,就会从缓存中获取。
  • 布隆过滤器:布隆过滤器⾥会保存 数据是否存在,可过滤掉 无效的 查询请求。

什么是缓存雪崩?怎么解决?

缓存雪崩:缓存中 大量 数据到达 过期时间,或 缓存服务器 发生故障,导致每次请求都要到数据库去查询。


解决方案

  • 尽量让 失效时间点 均匀分布。避免 缓存雪崩 的出现。
  • 使用多个 缓存服务器,并做好 缓存备份

生产上 Redis内存 设置为多少比较合适?

Redis内存设置

  • 由于 Redis 底层借鉴了 Hash算法,因此推荐将 Redis内存 设置为 物理内存四分之三。(类似于 HashMap加载因子=0.75?)
  • 由于 内存碎片率 的存在, 实际消耗的内存 可能会比 maxmemory 设置的更大。

怎么保证 缓存 和 数据库数据 的一致性?

根据 CAP理论,在保证 可⽤性分区容错性 的前提下,⽆法保证 ⼀致性,所以缓存和数据库的绝对⼀致是不可能实现的,只能尽可能保存缓存和数据库的最终⼀致性。

  • 先更新数据库,再删除缓存: 可以保证 数据一致性 的。
  • 删除缓存 取代 更新缓存

怎么处理热key (访问频率高的key)?

  • 热key 打散到 不同的服务器,降低压⼒。
  • 加⼊ ⼆级缓存,提前加载 热key 数据到内存中,如果 redis宕机,⾛ 内存查询

缓存预热怎么做呢?

缓存预热:提前把 数据库 ⾥的数据刷到 缓存 ⾥。通常有这些⽅法:

  • 直接写个 缓存刷新接口,上线时⼿动操作。
  • 数据量不⼤时可以在项⽬启动的时候 ⾃动加载

使用过 Redis 做消息队列么,你是怎么用的?

使用 RedisList 数据结构 可以实现 消息队列

  • 生产者端,可以通过向 队列尾部 添加消息的方式发布消息 (rpush)。
  • 消费者端,可以通过从 队列头部 取出消息的方式消费消息 (lpop);

四、Redis运维

Redis报内存不足怎么处理?

Redis 内存不⾜ 有如下⼏种处理⽅式:

  • 修改 配置⽂件 中的 maxmemory 参数,增加 Redis 可⽤内存
  • 也可以通过命令 set maxmemory,增加 Redis 可⽤内存
  • 修改 内存淘汰策略,及时释放内存空间。

Redis 过期键的删除策略?

  • 定期删除: 每 隔一段时间 程序就对数据库进行一次检查,删除里面的 过期键
  • 惰性删除: 放任键过期不管,获取键时 检查取得的键是否过期,过期则删除该键。

Redis 数据 淘汰策略 有哪几种?

如果数据存满了,新数据存不进去, 则 redis 会执行 淘汰策略。(主要是 LRU算法)

  • noeviction (默认策略):对于 写请求 不再提供服务,直接 返回错误
  • allkeys-lru:从所有 key 中使用 LRU算法 进行淘汰(LRU算法:即 最近最少使用算法)。
  • volatile-lru:从设置了 过期时间key 中使用 LRU算法 进行淘汰。
  • allkeys-random:从所有 key随机淘汰数据
  • volatile-random:从设置了 过期时间key随机淘汰
  • volatile-ttl:在设置了 过期时间key 中,淘汰 过期时间剩余最短 的。

五、高可用

Redis 中的 主从复制 了解吗?

主从复制:是指将 主节点 (master) 中的数据,复制到其他的 从节点 (slave) 的过程。数据的复制是单向的,只能由 主节点从节点


主从复制 的 作用:

  • 故障恢复:当 主节点 发生故障时,可以由 从节点 提供服务,实现 快速的故障恢复
  • 负载均衡:通过 主从复制 技术可实现 读写分离,⼤⼤提⾼了 Redis 服务器并发量
    [主节点 (master) 处理 写操作从节点 (slave) 处理 读操作,从而 分担服务器负载 ]。
  • ⾼可用基石主从复制 还是 哨兵集群 功能的基础,因此说 主从复制Redis ⾼可用 的基础。

Redis主从有几种常见的拓扑结构?

根据 拓扑复杂性 可以分为以下三种:

  • ⼀主⼀从:可提供 故障转移 服务。
  • ⼀主多从:可提供 读写分离故障转移 服务。
  • 树状主从结构:通过引⼊ 复制中间层,可以降低 主节点 维护 从节点 的负担。

主从复制存在哪些问题?

主从复制 虽好,但也存在 ⼀些问题

  • 主从复制 无法完成 自动故障转移Redis Sentinel (哨兵) 可以解决这个问题。
  • 主节点写能⼒ 受到 单机的限制
  • 主节点存储能⼒ 受到 单机的限制

第⼀个问题是 Redis⾼可用问题,第⼆、三个问题属于 Redis分布式问题


Redis Sentinel (哨兵) 了解吗?

Redis Sentinel 由两部分组成,哨兵节点数据节点

  • 哨兵节点哨兵节点 是特殊的 Redis 节点不存储数据
    [ 哨兵节点数据节点 进⾏ 监控,当 主节点 发生故障 时,提供 自动故障转移 功能 。]
  • 数据节点主节点从节点 都是 数据节点
    2.精通Redis—基础 Redis知识、进阶 Redis知识_第1张图片

Redis Sentinel 自动故障转移 的流程?

在这里插入图片描述


领导者Sentinel节点选举了解吗?

点击查看

Redis 使⽤了 Raft算法 实现领导者选举,⼤致流程如下:

  • 1.Sentinel节点 确认 主节点 下线的时候,会向其他 Sentinel节点 发送命令, 要求将⾃⼰设置为 领导者
  • 2.每个 Sentinel节点 都只能 投出一票
  • 3.如果该 Sentinel节点 发现⾃⼰的 票数 已经⼤于等于 max(quorum, num(sentinels)/2+1),那么它将成为 领导者
  • 4.如果此过程没有选举出领导者,将进⼊ 下⼀轮选举

注:正常情况下,最先确认 master 客观下线的 Sentinel节点,就会成为 执行故障转移leader
2.精通Redis—基础 Redis知识、进阶 Redis知识_第2张图片


Redis 集群了解吗?

Redis集群 由多个 节点(Node) 组成,集群中的节点分为 主节点从节点

  • 主节点:负责读写请求和集群信息的维护。
  • 从节点:只进行主节点数据和状态信息的复制。

Redis 集群 有两大特性:

  • 数据分区数据分区 是集群 最核⼼ 的功能。集群 将数据分散到 多个节点
  • ⾼可用: 集群⽀持 主从复制 和主节点的 ⾃动故障转移 (与哨兵类似),当任⼀节点发⽣故障时,集群仍然可以对外提供服务。
    2.精通Redis—基础 Redis知识、进阶 Redis知识_第3张图片

Redis 集群 数据分区 的好处?

  • Redis 存储能力 突破了 单机 的限制,存储容量 ⼤⼤增加;
  • 每个 主节点 都可以对外提供 读服务写服务,⼤⼤提⾼了 Redis 服务器并发量。(Redis集群 中只有主节点,没有从节点)。

你可能感兴趣的:(高级面试题,CABR实习,redis,缓存,数据库)