缓存中间件Redis的事务管理
【摘要】 Redis 是一种开源的、高性能的 NoSQL 键值对数据库,广泛应用于缓存、消息队列等场景。它支持多种数据类型,如字符串、哈希、列表、集合、有序集合等,每种数据类型都有其独特的存储结构和操作方法。 在华为云上,可以通过多种方式部署 Redis,例如使用华为云提供的 Redis 服务,或者通过华为云容器集群 CCE 结合 NAS 存储来部署 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)