• Redis学习(三)——事务、乐观锁、持久化、发布订阅


    1. Redis事务

    1.1 Redis中事务简述

    • Redis 事务的本质是一组命令的集合
    • Redis 事务不保证原子性。Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。
    • Redis事务分三个阶段。开始事务、命令入队、执行事务

    1.2 Redis事务操作

    • multi
      multi 命令可以开始一个事务。
    • exec
      exec 命令可以执行先前的事务,执行后,先前加的事务会销毁。

    具体进行事务如下:
    在这里插入图片描述

    1.3 Redis事务的回滚

    队列中有编译时异常

    简单来说就是Redis入队时有命令不存在的时候,这个时候整个事务都不会执行。

    示例如下:
    在这里插入图片描述
    因为 getset 必须接受两个参数,不存在只接受一个参数的选项,所以上述有编译时错误,导致整个事务都无法执行。

    队列中有运行时异常

    简单来说就是Redis入队时有命令编译通过,参数传入等都OK,但是运行时出现异常的情况,这种情况下Redis事务执行错误的命令会报错,其余命令正常执行。

    示例如下:

    在这里插入图片描述

    上述命令中 incr 命令接受的参数是正确的,但是k1对应的值是字符串,不可能执行自增操作,所以会报错。

    2. Redis实现乐观锁

    • 悲观锁:悲观锁(Pessimistic Lock),顾名思义,就是很悲观。每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。传统的关系型数据库里面就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在操作之前先上锁。但是悲观锁的效率不高。

    • 乐观锁:乐观锁(Optimistic Lock),顾名思义,就是很乐观。每次去拿数据的时候都认为别人不会修改,所以不会上锁。但是在更新的时候会判断一下再此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁效率更高。

    Redis实现乐观锁主要靠 watch 命令。

    示例如下:
    在这里插入图片描述
    如果在 watch 了变量 a 的值后,另一个窗口修改了变量的 a,那么该事务就会执行失败。

    3. Redis持久化

    持久化,即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。

    Redis 是内存数据库,即数据存储在内存。如果不将内存中的数据保存到磁盘,一旦服务器进程退出,服务器中的数据也会消失。这样会造成巨大的损失,所以 Redis 提供了持久化功能。

    3.1 RDB

    Redis会单独创建(fork)一个子进程来进行持久化。RDB先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。

    如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那 RDB 方式要比 AOF 方式更加的高效。RDB 的缺点是最后一次持久化后的数据可能丢失。

    RDB 保存的是 dump.rdb 文件,当需要对Redis数据库进行备份的时候,只需要将 dump.rdb 文件拷贝走就行,如果原来的 rdb文件没了,只需要将rdb重新拷贝到当前目录下就行进行数据恢复。

    RDB相关的设置可以在 redis.windows.conf 文件中进行配置,相关配置如下

    save 900 1
    save 300 10
    save 60 10000
    
    • 1
    • 2
    • 3

    表示的意思是

    • 1 分钟内改了 1 万次
    • 5 分钟内改了 10 次
    • 15 分钟内改了 1 次

    就进行一次保存。

    3.2 AOF

    以日志的形式来记录每个写操作,将 Redis 执行过的所有指令记录下来(读操作不记录)。只许追加文件,但不可以改写文件,Redis 启动之初会读取该文件重新构建数据。

    Redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

    AOP对应的配置在相关的配置文件中为

    # 是否以append only模式作为持久化方式,默认使用的是rdb方式持久化,这种方式在许多应用中已经足够用了
    appendonly no 
    # appendfilename AOF 文件名称
    appendfilename "appendonly.aof" 
    # appendfsync aof持久化策略的配置:
    #     no:不执行fsync,由操作系统保证数据同步到磁盘,速度最快。
    #     always:每次写入都执行fsync,以保证数据同步到磁盘。
    #     everysec:每秒执行一次fsync,可能会导致丢失这1s数据。
    appendfsync everysec 
    # 重写时是否可以运用Appendfsync,用默认no即可,保证数据安全性
    No-appendfsync-on-rewrite 
    # 设置重写的基准值
    Auto-aof-rewrite-min-size 
    # 设置重写的基准值
    Auto-aof-rewrite-percentage
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    如果要启动AOF的话,将 appendonly no 改为 appendonly yes 即可,该备份记录会保存为 .aof 文件。

    如果要进行修复,只需要将备份的 AOF 文件复制到当前目录, 执行 redis-check-aof --fix appendonly.aof 进行修复即可。

    4. 发布订阅

    4.1 相关命令

    发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道。当你订阅了一个频道后,该频道发出的消息你可以进行接收。

    相关的命令如下

    命令描述
    psubscribe pattern [pattern ...]订阅一个或多个给定模式的频道
    publish channel message 将信息发送到指定的频道
    punsubscribe pattern [pattern ...]退订一个或多个给定模式的频道
    subscribe channel [channel ...]订阅一个或多个指定的频道
    unsubscribe channel [channel ...]退订一个或多个给定模式的频道

    4.2 相关测试

    现在我们打开两个 redis-cli.exe 窗口,在窗口1 中输入 subscribe galaxy,可以看到以下输出

    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "galaxy"
    3) (integer) 1
    
    • 1
    • 2
    • 3
    • 4

    然后在窗口2中输入 publish galaxy "the Cigar Galaxy",可以看到,执行后,窗口1中的输出发生了改变,变化为了

    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "galaxy"
    3) (integer) 1
    1) "message"
    2) "galaxy"
    3) "the Cigar Galaxy"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    图解来啦!机器学习工业部署最佳实践!10分钟上手机器学习部署与大规模扩展 ⛵
    医院检验科LIS系统源码,oracle数据库、报告管理、质控管理
    c# 字典与内存碎片化
    【Window10 】删除‘设备和驱动器’中的百度网盘、酷狗音乐、迅雷下载等
    “一篇就够“系列:RxJava 核心解密
    实验2 SQL的多表查询
    Reids Cluster集群部署
    K8s进阶之路-Pod的生命周期
    C语言实现的多项式合并运算系统
    OpenCV数字图像处理实战一:去水印(C++)
  • 原文地址:https://blog.csdn.net/ifhuke/article/details/127406054