简单的 Redis 学习笔记·其他特性 | 青训营

65 阅读7分钟

Redis 是一个开源的内存数据结构存储系统,可用作数据库、缓存、消息代理和队列。Redis 以其出色的性能和可靠性闻名,因此被广泛应用于许多领域,如游戏、金融科技、广告科技、社交媒体、医疗保健和互联网等等。本文试图对 Redis 作简单的介绍,以便初学者快速上手 Redis。本文作为我的一篇学习笔记。

事务

Redis 支持事务,也就是可以在一次请求中执行多个命令。Redis 中的事务主要是通过 MULTI 和 EXEC 这两个命令来实现的。MULTI 命令用于开启一个事务,事务开启之后,所有的命令都会被放入到一个队列中,最后通过一个 EXEC 命令来执行事务中的所有命令。

Redis 中的事务和传统的关系型数据库比如 MySQL 中的事务是不太一样的。在关系型数据库中,事务一般是一个原子操作(atom),要么全部执行成功,要么全部执行失败。而在 Redis 中,事务并不能保证所有的命令都会执行成功,他的执行结果取决于事务中的命令。但是 Redis 可以为我们保证以下三点:

  1. 在发送 EXEC 命令之前所有的命令都会被放入到一个队列中缓存起来,不会立即执行;
  2. 在收到 EXEC 命令之后,事务开始执行,事务中的任何一个命令执行失败,其他命令依然会被执行(就是说,不会因为某个命令执行失败而导致其他命令不会执行的情况发生);
  3. 在事务执行的过程中,其他客户端提交的命令请求并不会被插入到事务的执行命令序列中。

持久化

持久化是 Redis 中一个非常重要的功能。因为 Redis 是一个基于内存的数据库,如果没有持久化的话,那么一旦服务器重启或者断电,之前所有的数据都会丢失,这对于一个数据库来说是非常致命的。持久化就是为了解决这个问题而出现的。

Redis 中的持久化主要有两种方式:

一种是 RDB 方式(Redis Database),是在指定时间间隔内将内存中的数据快照写入磁盘,它是某一个时间点上数据的完整副本。

快照规则可以通过配置文件 ~/.config/redis/redis.conf 中 save 参数来配置。save 后跟随两个参数:第一个参数表示秒数,第二个参数表示修改次数,表示在指定时间内的修改次数达到指定次数就进行一个保存,一般需要根据服务器的负载情况来进行配置。

除了依据配置文件来自动触发快照之外,还可以手动使用 SAVE 命令来进行保存。

快照机制的缺点在于,如果服务器在快照之后宕机,那么最后一次快照之后的所有修改内容都会丢失掉。因此 RDB 更适合用来做备份。比如可以在每天 00:00 的时候通过 crontab 来执行一次 save 命令,然后将快照文件备份到其他地方,这样就可以保证数据的安全。

快照机制的另一个问题在于:由于生产环境中我们为 Redis 开辟的内存空间较大,使得内存中的数据同步到硬盘的过程所花时间会比较长。这段时间内 Redis 都是处于一个阻塞的状态,不能接受任何请求。为了解决这个问题,Redis 提供一个叫做 BGSAVE 的命令,这个命令会创建单独的子进程来负责将内存中的数据写入硬盘,使主进程可以继续处理请求。

BGSAVE 解决了 SAVE 的进程占用的问题,但是这个过程中仍然会存在性能损耗。因为 fork 一个子进程依然需要时间,这段时间内 Redis 依然无法处理任何请求,无法真正做到秒级快照。因此除了 RDB 方式,Redis 还提供了另一种持久化方式。

另一种是 AOF 方式(Append Only File),它利用一个追加文件,在执行写命令的时候,不仅会将命令写入到内存中,还会将命令写入一个追加的文件中,这个文件就是 AOF 文件。

AOF 文件会以日志的形式记录每一个写操作,当 Redis 重启时就会重新执行 AOF 文件中的命令来在内存中重建整个数据库的内容。若要开启 AOF,需要在配置文件 ~/.config/redis/redis.conf 中将 appendonly 这个参数的值修改为 yes。

主从复制

主从复制,是指将一台 Redis 服务器的数据复制到其他 Redis 服务器。

其中,保存原始数据的 Redis 服务器叫做主节点 master,保存副本数据的 Redis 服务器叫做从节点 slave。主节点和从节点之间具有如下关系:

  1. 一个主节点可以有多个从节点,而每个从节点只能有一个主节点。
  2. 在主从复制当中,数据的复制是单向的,只能由主节点复制到从节点。
  3. 一般来说,主节点负责写操作,从节点负责读操作。
  4. 主节点会将自身的数据变化通过异步的方式发送给从节点致。
  5. 从节点接收到主节点的数据之后,更新自己的数据,保证数据一致。

配置主从节点命令:

通过命令行操作方式修改:

  • 查看当前节点角色:role
  • 配置所属主节点:replicaof host port 或者 slaveof host port (旧版)

通过修改配置文件方式修改:

  1. 将 Redis 安装目录(/opt/homebrew/etc 或者 /etc/redis)下的 redis.conf 分别复制到家目录下的 .config/redis 文件夹下的 redis.conf 和 redis-6380.conf,它们将分别用于 Redis 的主节点配置和从节点配置,6380 是从节点的端口号。
  2. redis.conf 无需修改,因为 Redis 默认是主节点的配置。
  3. 对于 redis-6380.conf 来说,需要修改如下内容:
    • port 改为 6380
    • pidfile 改为 /var/run/redis_6380.pid
    • dbfilename 改为 dump-6380.rdb
    • replicaof 取消注释,并为其添加适当的主节点 ip 和 port

配置文件可以使用 redis-server xxx.conf 的方式进行调用。

哨兵模式

相比单节点的 Redis 来说,主从模式已经有了很大提升。但是这个集群依然存在部分问题,当主节点宕机时,需要手动把另一台从节点提升为主节点,需要人工干预,这样就不能实现真正的高可用。而 Redis 提供的哨兵模式就实现了自动的故障转移,解决了这个问题。

哨兵模式会创建一个哨兵 sentinel。哨兵会以一个独立的进程运行在 Redis 集群中,用来监控 Redis 集群中的各个节点是否运行正常。它主要用来执行以下几个方面的功能:

  1. 监控:通过不断地发送命令来检查 Redis 节点是否正常。
  2. 通知:如果发现某个节点出了问题,那么哨兵就会通过发布订阅模式来通知其他节点。
  3. 自动故障转移:当主节点不能正常工作的时候,哨兵会开始一个自动故障转移的操作,它会将一个从节点升级为新的主节点,然后再将其他从节点指向新的主节点。

如何配置哨兵模式:

  1. 首先需要在 Redis 集群中添加一个哨兵节点。可以使用 redis-sentinel 命令来启动哨兵节点。建议添加一个哨兵文件 ~/.config/redis/sentinel.conf 文件。
sentinel monitor master 127.0.0.1 6379 1

后面的 ip 和端口号表示需要监控的主节点的 ip 和端口号。最后的数字表示用几个哨兵来监控这个节点。

  1. 启动哨兵节点。通过 redis-sentinel ~/.config/redis/sentinel.conf 即调用配置,启动哨兵节点。

需要注意的是:由于哨兵本身也是一个进程,自身同样会具有单节点故障的问题。所以一般在实际的生产环境中,通常会使用三个哨兵来保证高可用。这三个哨兵会通过选举的方式来选出领导者(upgrade,升变),然后由领导者来监控其他节点。如果领导者也故障,则其他哨兵节点会重新选举一个领导者,以此保证哨兵节点的高可用性。