Redis——事务实现以及应用场景

本文介绍Redis事务相关的原理以及知识点,从redis的常用命令出发,深入理解redis在日常工作中的实际场景使用用法。

本文目录

一、Redis事务简介

Redis 事务本质上是一个命令队列。用户可以使用MULTI命令开启一个事务块,在这个块内,后续输入的命令不会立即执行,而是被缓存到一个队列中。当调用EXEC命令时,Redis 会按顺序依次执行队列中的所有命令。如果在事务执行过程中发生错误,Redis 默认不会回滚已经执行的命令。不过,从 Redis 2.6.5 版本开始,如果在EXEC执行前发现命令入队错误(命令语法错误),整个事务将不会执行。

二、事务相关命令

1.MULTI :用于开启一个事务块,标志着事务的开始。在执行MULTI之后,Redis 进入事务状态,后续输入的命令将被存入事务队列。

bash 复制代码
MULTI

2.EXEC:用于触发事务的执行。Redis 会按顺序执行事务队列中的所有命令,并返回每个命令的执行结果。如果在事务执行过程中某个命令失败,会继续执行后续命令,而不会回滚之前已执行的命令。

bash 复制代码
SET name "redis"
SET age  10
EXEC

如上,SET name "redis"SET age 10两条命令会被依次执行。

  1. DISCARD :用于取消事务。在调用MULTI开启事务后,执行DISCARD会清空事务队列,取消事务的执行,Redis 会退出事务状态。
bash 复制代码
MULTI
SET name "redis"
DISCARD

原本入队的SET name "redis"命令不会被执行,事务被取消。

  1. WATCHWATCH命令用于为事务提供乐观锁机制。可以监控一个或多个键,在执行EXEC命令时,如果被监控的键在事务开启后被其他客户端修改,那么整个事务将不会执行,并返回(nil)
bash 复制代码
WATCH name
MULTI
GET name
SET name "redis1"
EXEC

如上,如果在WATCH name之后,EXEC执行之前,name被其他客户端修改,那么GET nameSET name "redis1"这两个命令都不会执行。

三、事务应用场景

要注意,redis中的事务并不能保证强一致性,因为Redis事务在命令执行失败时默认不回滚已执行命令,如果需要实现强一致性需要结合业务逻辑以及WATCH进行实现,所以它只适用于弱一致性场景。

常使用的弱一致性场景:

点赞计数场景:在社交平台中,用户对一篇帖子进行点赞操作。可以使用Redis事务来增加帖子的点赞数,并记录点赞用户的信息,然后通过消息队列进行数据同步持久化。

bash 复制代码
MULTI​
# 增加帖子点赞数​
INCR post:1:like_count​
# 记录点赞用户​
SADD post:1:likers user:5​
EXEC

|-----------------------------------------------------------------------------------------------------|--------------------|--------------------------------------------------------------------------------------------------|
| ← 上一篇 Java进阶------常用类及常用方法详解 | 记得点赞、关注、收藏哦! | 下一篇 Java进阶------数组超详细整理 → |

相关推荐
IvorySQL28 分钟前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·37 分钟前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德40 分钟前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫1 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i1 小时前
完全卸载MariaDB
数据库·mariadb
期待のcode1 小时前
Redis的主从复制与集群
运维·服务器·redis
纤纡.1 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn2 小时前
【Redis】渐进式遍历
数据库·redis·缓存
橙露2 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot
冰暮流星2 小时前
sql语言之分组语句group by
java·数据库·sql