Redis (四) --------- Redis 高级


一、Redis 事务

1、什么是事务

事务是指一系列操作步骤,这一系列的操作步骤,要么完全地执行,要么完全地不执行。Redis 中的事务 (transaction) 是一组命令的集合,至少是两个或两个以上的命令,redis 事务保证这些命令被执行时中间不会被任何其他操作打断。

2、事务操作的命令

① multi

  • 语法 :multi
  • 作用 :标记一个事务的开始。事务内的多条命令会按照先后顺序被放进一个队列当中
  • 返回值 :总是返回 ok

② exec

  • 语法 :exec
  • 作用 :执行所有事务块内的命令
  • 返回值 :事务内的所有执行语句内容,事务被打断,返回 nil

③ discard

  • 语法 :discard
  • 作用 :取消事务,放弃执行事务块内的所有命令
  • 返回值 :总是返回 ok

④ watch

  • 语法 :watch key [key ...]
  • 作用 :监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
  • 返回值:总是返回 ok

⑤ unwatch

  • 语法 :unwatch
  • 作用 :取消 WATCH 命令对所有 key 的监视。如果在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了
  • 返回值 :总是返回 ok

3、事务的实现

(1) 正常执行事务

事务的执行步骤:首先开启事务,其次向事务队列中加入命令,最后执行事务提交

例 1:事务的执行:

1)multi:用 multi 命令告诉 Redis,接下来要执行的命令你先不要执行,而是把它们暂时存起来(开启事务)

2)saddworks john 第一条命令进入等待队列(命令入队)

3)sadd works rose 第二条命令进入等待队列(命令入队)

4)exce 告知 redis 执行前面发送的两条命令(提交事务)

在这里插入图片描述
查看 works 集合

在这里插入图片描述
(2) 事务执行 exec 之前,入队命令错误( 语法错误 :严重错误导致服务器不能正常工作( 例如内存不足 )),放弃事务

执行事务步骤:

1)MULTI 正常命令

2)SET key value 正常命令

3)INCR 命令语法错误

4)EXEC 无法执行事务,那么第一条正确的命令也不会执行,所以 key 的值不会设置成功

在这里插入图片描述

(3) 事务执行 exec 命令后,命令执行错误,事务提交

执行步骤:

1)MULTI 正常命令

2)SET username zhangsan 正常命令

3)lpop username 正常命令,语法没有错误,执行命令时才会有错误

4)EXEC 正常执行,发现错误可以在事务提交前放弃事务,执行 discard

在这里插入图片描述
结论:

在 exec 执行后的所产生的错误,即使事务中有某个/某些命令在执行时产生了错误,事务中的其他命令仍然会继续执行。Redis 在事务失败时不进行回滚,而是继续执行余下的命令。

Redis 这种设计原则是:

Redis 命令只会因为错误的语法而失败(这些问题不能在入队时发现),或是命令用在了错误类型的键上面,失败的命令并不是 Redis 导致,而是由编程错误造成的,这样错误应该在开发的过程中被发现,生产环境中不应出现语法的错误,就是在程序的运行环境中不应该出现语法的错误。而 Redis 能够保证正确的命令一定会被执行。再者不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。

(4) 放弃事务

执行步骤:

1)MULTI 开启事务

2)SET age 25 命令入队

3)SET age 30 命令入队

4)DISCARD 放弃事务,则命令队列不会被执行

在这里插入图片描述

(5) Redis 的 watch 机制

  • Redis 的 WATCH 机制 :
    ①WATCH 机制:使用 WATCH 监视一个或多个 key , 跟踪 key 的 value 修改情况,如果有key 的 value 值在事务 EXEC 执行之前被修改了,整个事务被取消。EXEC 返回提示信息,表示事务已经失败。
    ②WATCH 机制使的事务 EXEC 变的有条件,事务只有在被 WATCH 的 key 没有修改的前提下才能执行。不满足条件,事务被取消。使用 WATCH 监视了一个带过期时间的键,那么即使这个键过期了,事务仍然可以正常执行。
    ③大多数情况下,不同的客户端会访问不同的键,相互同时竞争同一 key 的情况一般都很少, watch 能很好解决数据冲突的问题。

  • 何时取消 key 的监视 (WATCH) ?
    ①WATCH 命令可以被调用多次。对键的监视从 WATCH 执行之后开始生效,直到调用 EXEC 为 止。不管事务是否成功执行,对所有键的监视都会被取消。
    ②当客户端断开连接时,该客户端对键的监视也会被取消。
    ③UNWATCH 命令可以手动取消对所有键的监视

二、持久化

1、持久化概述

持久化可以理解为存储,就是将数据存储到一个不会丢失的地方,如果把数据放在内存中,电脑关闭或重启数据就会丢失,所以放在内存中的数据不是持久化的,而放在磁盘就算是一种持久化。
Redis 的数据存储在内存中,内存是瞬时的,如果 linux 宕机或重启,又或者 Redis 崩溃或重启,所有的内存数据都会丢失,为解决这个问题,Redis 提供两种机制对数据进行持久化存储,便于发生故障后能迅速恢复数据。

2、持久化方式

RDB 方式

什么是 RDB 方式?

Redis Database(RDB),就是在指定的时间间隔内将内存中的数据集快照写入磁盘,数据恢复时将快照文件直接再读到内存。 RDB 保存了在某个时间点的数据集(全部数据)。存储在一个二进制文件中,只有一个文件。默认是 dump.rdb。RDB 技术非常适合做备份,可以保存最近一个小时,一天,一个月的全部数据。保存数据是在单独的进程中写文件,不影响 Redis 的正常使用。RDB 恢复数据时比其他 AOF 速度快。

如何实现 ?

RDB 方式的数据持久化,仅需在 redis.conf 文件中配置即可,默认配置是启用的。在配置文件 redis.conf 中搜索 SNAPSHOTTING,查找在注释开始和结束之间的关于 RDB的配置说明。配 SNAPSHOTTING 置地方有三处。

①配置执行 RDB 生成快照文件的时间策略

对 Redis 进行设置,让它在 “N 秒内数据集至少有 M 个 key 改动” 这一条件被满足时,自动保存一次数据集。

配置格式:save <seconds> <changes>

在这里插入图片描述
可以设置 save 20 3

② dbfilename

设置 RDB 的文件名,默认文件名为 dump.rdb
在这里插入图片描述

修改成 mydump.rdb

③ dir

指定 RDB 文件的存储位置,默认是 ./ 当前目录

在这里插入图片描述

总结

优点:

由于存储的是数据快照文件,恢复数据很方便,也比较快

缺点:

1)会丢失最后一次快照以后更改的数据。如果你的应用能容忍一定数据的丢失,那么使用 rdb 是不错的选择;如果你不能容忍一定数据的丢失,使用 rdb 就不是一个很好的选择。

2)由于需要经常操作磁盘,RDB 会分出一个子进程。如果你的 redis 数据库很大的话,子进程占用比较多的时间,并且可能会影响 Redis 暂停服务一段时间(millisecond 级别),如果你的数据库超级大并且你的服务器 CPU 比较弱,有可能是会达到一秒。

AOF 方式

什么是 AOF 方式 ?

Append-only File (AOF),Redis 每次接收到一条改变数据的命令时,它将把该命令写到一个 AOF文件中(只记录写操作,读操作不记录),当 Redis 重启时,它通过执行 AOF 文件中所有的命令来恢复数据。

如何实现 ?

AOF 方式的数据持久化,仅需在 redis.conf 文件中配置即可

配置项:

① appendonly :默认是 no,改成 yes 即开启了 aof 持久化
在这里插入图片描述
② appendfilename :指定 AOF 文件名,默认文件名为 appendonly.aof
在这里插入图片描述

③ dir :指定 RDB 和 AOF 文件存放的目录,默认是 ./
④ appendfsync :配置向 aof 文件写命令数据的策略

  • no :不主动进行同步操作,而是完全交由操作系统来做(即每 30 秒一次),比较快但不是很安全。
  • always :每次执行写入都会执行同步,慢一些但是比较安全。
  • everysec :每秒执行一次同步操作,比较平衡,介于速度和安全之间。这是默认项。

在这里插入图片描述

⑤ auto-aof-rewrite-min-size :允许重写的最小 AOF 文件大小,默认是 64M 。当 aof 文件大于 64M 时,开始整理 aof 文件,去掉无用的操作命令,缩小 aop 文件

在这里插入图片描述

总结

append-only 文件是另一个可以提供完全数据保障的方案

AOF 文件会在操作过程中变得越来越大。比如,如果你做一百次加法计算,最后你只会在数据库里面得到最终的数值,但是在你的 AOF 里面会存在 100 次记录,其中 99 条记录对最终的结果是无用的.但 Redis 支持在不影响服务的前提下在后台重构 AOF 文件,让文件得以整理变小

可以同时使用这两种方式,redis 默认优先加载 AOF 文件(AOF 数据最完整)

三、主从复制

1、主从复制 – 读写分离

通过持久化功能,Redis 保证了即使在服务器重启的情况下也不会丢失(或少量丢失) 数据,但是由于数据是存储在一台服务器上的,如果这台服务器出现故障,比如硬盘坏了,也会导致数据丢失。
为了避免单点故障,我们需要将数据复制多份部署在多台不同的服务器上,即使有一台服务器出现故障其他服务器依然可以继续提供服务。这就要求当一台服务器上的数据更新后,自动将更新的数据同步到其他服务器上,那该怎么实现呢 ?

Redis 的主从复制

在这里插入图片描述
Redis 提供了复制 (replication) 功能来自动实现多台 redis 服务器的数据同步,我们可以通过部署多台 redis,并在配置文件中指定这几台 redis 之间的主从关系,主负责写入数据,同时把写入的数据实时同步到从机器,这种模式叫做主从复制,即master/slave,并且 redis 默认 master 用于写,slave 用于读,向 slave 写数据会导致错误。

读写分离 :

参考这篇文章

https://blog.csdn.net/qq_39669058/article/details/87720731

容灾处理 :当 Master 服务出现故障,需手动将 slave 中的一个提升为 master,剩下的 slave 挂至新的
master 上( 冷处理:机器挂掉了,再处理)

命令:
① slaveof no one,将一台 slave 服务器提升为 Master (提升某 slave 为 master)
② slaveof 127.0.0.1 6382 (将 slave 挂至新的 master 上)

操作指令

进入客户端需指定端口:./redis-cli -p 6380
不配置启动默认都是主 master
info replication 查看 redis 服务器所处角色

总结

▶ 一个 master 可以有多个 slave

▶ slave 下线,读请求的处理性能下降

▶ master 下线,写请求无法执行

▶ 当 master 发生故障,需手动将其中一台 slave 使用 slaveof no one 命令提升为master,其它 slave 执行 slaveof 命令指向这个新的 master,从新的 master 处同步数据

▶ 主从复制模式的故障转移需要手动操作,要实现自动化处理,这就需要 Sentinel 哨兵,实现故障自动转移

2、高可用 Sentinel 哨兵

Sentinel 哨兵是 redis 官方提供的高可用方案,可以用它来监控多个 Redis 服务实例的运行情况。Redis Sentinel 是一个运行在特殊模式下的 Redis 服务器。Redis Sentinel 是在多个 Sentinel 进程环境下互相协作工作的。

Sentinel 系统有三个主要任务:

▶监控:Sentinel 不断的检查主服务和从服务器是否按照预期正常工作。

▶提醒:被监控的 Redis 出现问题时,Sentinel 会通知管理员或其他应用程序。

▶自动故障转移:监控的主 Redis 不能正常工作,Sentinel 会开始进行故障迁移操作。将一个从服务器升级新的主服务器。让其他从服务器挂到新的主服务器。同时向客户端提供新的主服务器地址。

在这里插入图片描述

Sentinel 配置

可以参考这篇文章 :https://blog.csdn.net/L835311324/article/details/83870657

监控

▶ Sentinel 会不断检查 Master 和 Slave 是否正常

▶ 如果 Sentinel 挂了,就无法监控,所以需要多个哨兵,组成 Sentinel 网络,一个健康的 Sentinel 至少有 3 个 Sentinel 应用。彼此在独立的物理机器或虚拟机。

▶监控同一个 Master 的 Sentinel 会自动连接,组成一个分布式的 Sentinel 网络,互相通信 并交换彼此关于被监控服务器的信息

▶当一个 Sentinel 认为被监控的服务器已经下线时,它会向网络中的其它 Sentinel 进行确认,判断该服务器是否真的已经下线

▶如果下线的服务器为主服务器,那么 Sentinel 网络将对下线主服务器进行自动故障转移,通过将下线主服务器的某个从服务器提升为新的主服务器,并让其从服务器转移到新的主服务器下,以此来让系统重新回到正常状态

▶下线的旧主服务器重新上线,Sentinel 会让它成为从,挂到新的主服务器下

总结

主从复制,解决了读请求的分担,从节点下线,会使得读请求能力有所下降,Master 下线,写请求无法执行 Sentinel 会在 Master 下线后自动执行故障转移操作,提升一台 Slave 为 Master,并让其它 Slave 成为新 Master 的 Slave

四、安全设置

1、设置密码

访问 Redis 默认是没有密码的,这样不安全,任意用户都可以访问。可以启用使用密码才能访问 Redis。设置 Redis 的访问密码,修改 redis.conf 中这行 requirepass 密码。密码要比较复杂,不容易破解,而且需要定期修改。因为 redis 速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行 150K 次的密码尝试,需要指定非常非常强大的密码来防止暴力破解。

开启访问密码设置:

找到 requirepass 行去掉注释,requirepass 空格后就是密码
在这里插入图片描述

2、修改默认端口

修改 redis 的端口,这一点很重要,使用默认的端口很危险,redis.conf 中修改 port 6379 将其修改为自己指定的端口(可随意),端口 1024 是保留给操作系统使用的。用户可以使用的范围是 1024 - 65535
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在森林中麋了鹿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值