Redis 的三个核心问题 —— 线程模型、数据持久化、高可用

首先要明白redis是一个数据库 Redis 是一个内存数据库, 所有数据基本上都存在于内存当中, 会定时以追加(AOF)或者快照(RDB) 的方式刷新到硬盘中. 由于Redis 是一个内存数据库, 所以读取写入的速度是非常快的, 所以经常被用来做数据, 页面等的缓存。
在这里插入图片描述

线程模型:

Redis 只有单线程吗?

Redis 是单线程的,主要是指 Redis 的网络 I/O 线程,键值对的 set() get() 等读写操作,Redis 的持久化、集群同步等操作,则是由另外的线程来执行。

Redis 采用单线程为什么还这么快?

  • Redis 的大部分操作都在内存在完成。
  • 用了高效的数据结构,比如哈希表,跳表
  • 单线程模型避免了多线程之间的竞争,省去了多线程切换的时间和性能上的开销,并且不会导致死锁问题。
  • Redis 采用 I/O 多路复用机制处理大量的客户端 Socket 请求,高效的进行网络通信,读写流程非阻塞。

Redis 线程模型分版本

  • Redis 4.0之前,使用单线程速度快的原因就是上述几个原因。
  • Redis 4.0之后,Redis 添加了多线程的支持,但这时的多线程主要体现在大数据的一步删除功能上。
  • Redis 6.0之后,新增了多线程 I/O 的读写并发能力,为了提高网络处理 I/O 的并行度,多线程处理网络请求,但是对于读写命令依旧是单线程。

Redis 是如何实现数据不丢失的(考察持久化)?

为了保证数据不丢失,要把内存中的数据存储到磁盘,以便缓存服务器重启之后,还能从磁盘中恢复原有的数据,这个过程就是 Redis 的数据持久化。

AOF日志

记录所有的操作命令,并以文本的形式追加到文件中。

通常情况下,关系型数据库的日志都是“写前日志”,而 AOF 是**“写后日志”**,是指 Redis 要先执行命令,把数据写入内存,然后再记录日志到文件。
在这里插入图片描述

原因

  • Redis 在写入日志之前,不对命令进行语法检查,所以只记录执行成功的命令,避免了出现记录命令的情况,并且,在命令执行完之后再记录,不会阻塞当前的写操作。

缺点

  • 执行了命令之后,Redis 宕机了,没有写入日志,数据可能丢失
  • AOF在主线程执行,还是会对之后的命令操作阻塞。

RDB快照

将某一个时刻的内存和数据,以二进制的方法写入磁盘。
  • 为了解决 AOF 方法做故障恢复时操作缓慢这个问题,Redis 增加了RDB 内存快照的操作,它即可以保证可靠性,又能在宕机时实现快速恢复。
  • 和 AOF 不同的是,RDB 记录 Redis 某一时刻的数据,而不是操作,所以在做数据恢复的时候,只需要直接把 RDB 文件读入内存,完成快速恢复。
RDB 做快照会阻塞线程吗?
  • 为了解决阻塞线程问题,Redis 提供了两个命令来生成 RDB 快照文件,分别是 save 和 bgsave 。save 命令在主线程中执行,对导致阻塞。而 bgsave 命令则会创建一个字线程,用于写入 RDB 文件的操作,避免了对主线程的阻塞。
RDB 做快照的时候数据能修改吗?
  • 如果此时可以执行写操作:意味着 Redis 还能正常处理写操作,就可能出现正在执行快照的数据是已经被修改了的情况。
  • 如果此时不可以执行写操作:意味着 Redis 的所有写操作都得等到快照执行完成之后才能执行,那么又出现了阻塞主线程的问题。

那如何解决呢?
在这里插入图片描述

  • 如果主线程执行读操作,则主线程和 bgsave 子线程互不影响
  • 如果主线程执行写操作,则被修改的数据会复制一份副本,然后 bgsave 子线程会把该副本数据写入 RDB 文件,在这个过程中,主线程仍然可以直接修改原来的数据。

混合持久化

Redis 4.0 新增混合持久化的方式,集成了 RDB 和 AOF 的优点。

Redis 对 RDB 的执行频率非常重要,因为这会影响快照数据的完整性以及 Redis 的稳定性,所以在 Redis 4.0 之后,增加了 AOF 和 RDB 混合的数据持久化机制:把数据以 RDB 的方式写入文件,再将后续的操作命令以 AOF 的格式存入文件,既保证了 Redis 重启速度,又降低数据丢失风险。

Redis 是如何实现服务高可用的(考察数据复制)?

主从同步(主从复制)

这是 Redis 高可用服务的最基础的保证,实现方案就是将从前的一台 Redis 服务器,同步数据到多台从 Redis 的服务器上,即一主多从的模式,这样我们就可以对 Redis 做读写分离了,来承载更多的并发模式,这里和 MySQL 的主从复制原理上是一样的。
详见Redis主从复制原理

哨兵模式

当 Redis 的主从服务器出现故障宕机时,需要手动进行恢复,Redis 增加了哨兵模式(做到了可以监控主从服务器,并且提供自动容灾恢复的功能)
在这里插入图片描述

Redis Cluster 集群

Redis Cluster 是一种分布式中心化的运行模式,它将数据分布在不同服务器上,以此来降低系统对单主节点的依赖,从而提高 Redis 服务的读写性能
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值