缓存中间件Redis的事务管理

举报
tea_year 发表于 2025/02/28 22:17:26 2025/02/28
31 0 0
【摘要】 Redis 是一种开源的、高性能的 NoSQL 键值对数据库,广泛应用于缓存、消息队列等场景。它支持多种数据类型,如字符串、哈希、列表、集合、有序集合等,每种数据类型都有其独特的存储结构和操作方法。 在华为云上,可以通过多种方式部署 Redis,例如使用华为云提供的 Redis 服务,或者通过华为云容器集群 CCE 结合 NAS 存储来部署 Redis 服务。

Redis 事务管理

  • redis中的事务跟关系型数据库中的事务是一个相似的概念,但是有不同之处。

  • 关系型数据库事务执行失败后面的sql语句不在执行,而redis中的一条命令执行失败,其余的命令照常执行。

  • redis中开启一个事务是使用multi,相当于begin\start transaction,exec提交事务,discard取消队列命令(非回滚操作)。

1、Redis 于 MySQL 对比

MySQL Redis
开启 start transaction/begin multi
语句 普通SQL 普通命令
失败 rollback 回滚 discard 取消(不叫回滚,是队列里面的命令不执行,队列里面的任务根本就没有执行。而不是执行了也可以撤回来)
成功 commit exec

2、 Redis 事务命令

命令 描述
DISCARD 取消事务,放弃执行事务块内的所有命令。
EXEC 执行所有事务块内的命令。
MULTI 标记一个事务块的开始。
UNWATCH 取消 WATCH 命令对所有 key 的监视。
WATCH key [key ...] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
1、事务执行举例
ZADD salary 2000 user1
ZADD salary 3000 user2
ZRANGE salary 0 -1 WITHSCORES
MULTI
ZINCRBY salary 1000 user1
ZINCRBY salary -1000 user2
EXEC

3、Redis 中事务中的锁机制

举例:我正在买票 Ticket -1 , money -100

而票只有1张, 如果在我 multi 之后,和 exec 之前, 票被别人买了,即 ticket 变成0了。

我该如何观察这种情景,并不再提交:

  • 悲观的想法:

    世界充满危险,肯定有人和我抢, 给 ticket上锁, 只有我能操作. [悲观锁]

  • 乐观的想法:

    没有那么人和我抢,因此,我只需要注意,有没有人更改 ticket 的值就可以了 [乐观锁]

Redis的事务中,启用的是乐观锁,只负责监测 key 没有被改动.

4、Redis服务管理命令

命令 描述
BGREWRITEAOF 异步执行一个 AOF(AppendOnly File) 文件重写操作
BGSAVE 在后台异步保存当前数据库的数据到磁盘
CLIENT KILL [ip:port] [ID client-id] 关闭客户端连接
CLIENT LIST 获取连接到服务器的客户端连接列表
CLIENT GETNAME 获取连接的名称
CLIENT PAUSE timeout 在指定时间内终止运行来自客户端的命令
CLIENT SETNAME connection-name 设置当前连接的名称
CLUSTER SLOTS 获取集群节点的映射数组
COMMAND 获取 Redis 命令详情数组
COMMAND COUNT 获取 Redis 命令总数
COMMAND GETKEYS 获取给定命令的所有键
TIME 返回当前服务器时间
COMMAND INFO command-name [command-name ...] 获取指定 Redis 命令描述的数组
CONFIG GET parameter 获取指定配置参数的值
CONFIG REWRITE 对启动 Redis 服务器时所指定的 redis.conf 配置文件进行改写
CONFIG SET parameter value 修改 redis 配置参数,无需重启
CONFIG RESETSTAT 重置 INFO 命令中的某些统计数据
DBSIZE 返回当前数据库的 key 的数量
DEBUG OBJECT key 获取 key 的调试信息
DEBUG SEGFAULT 让 Redis 服务崩溃
FLUSHALL 删除所有数据库的所有key
FLUSHDB 删除当前数据库的所有key
INFO [section] 获取 Redis 服务器的各种信息和统计数值
LASTSAVE 返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示
MONITOR 实时打印出 Redis 服务器接收到的命令,调试用
ROLE 返回主从实例所属的角色
SAVE 异步保存数据到硬盘
SHUTDOWN [NOSAVE] [SAVE] 异步保存数据到硬盘,并关闭服务器
SLAVEOF host port 将当前服务器转变为指定服务器的从属服务器(slave server)
SLOWLOG subcommand [argument] 管理 redis 的慢日志
SYNC 用于复制功能(replication)的内部命令

5、Redis 慢日志查询

  • Slow log 是 Redis 用来记录查询执行时间的日志系统。

  • slow log 保存在内存里面,读写速度非常快

可以通过改写 redis.conf 文件或者用 CONFIG GET 和 CONFIG SET 命令对它们动态地进行修改

slowlog-log-slower-than 10000 # 超过多少微秒
CONFIG SET slowlog-log-slower-than 100
CONFIG SET slowlog-max-len 1000 # 保存多少条慢日志
CONFIG GET slow*
SLOWLOG GET
SLOWLOG RESET

总结

Redis 事务通过 MULTI、EXEC、DISCARD 等命令实现,支持简单的命令块执行。与关系型数据库不同,Redis 事务中某条命令执行失败,其余命令仍会继续执行,不提供传统意义上的回滚。Redis 事务采用乐观锁机制,确保事务执行前数据未被修改。适用于对原子性要求不高的场景,如批量操作和任务队列处理。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。