不支持原子性的不支持原子性的Redis事务也叫事务吗事务也叫事务吗
假设现在有这样一个业务,用户获取的某些数据来自第三方接口信息,为避免频繁请求第三方接口,我们往往会加一层缓存,
缓存肯定要有时效性,假设我们要存储的结构是 hash(没有String的'SET anotherkey "will expire in a minute" EX 60'这种原
子操作),我们既要批量去放入缓存,又要保证每个 key 都加上过期时间(以防 key 永不过期),这时候事务操作是个比较
好的选择
为了确保连续多个操作的原子性,我们常用的数据库都会有事务的支持,Redis 也不例外。但它又和关系型数据库不太一样。
每个事务的操作都有 begin、commit 和 rollback,begin 指示事务的开始,commit 指示事务的提交,rollback 指示事务的回
滚。它大致的形式如下
Redis 在形式上看起来也差不多,分为三个阶段
1.开启事务(multi)
2.命令入队(业务操作)
3.执行事务(exec)或取消事务(discard)
上面的指令演示了一个完整的事务过程,所有的指令在 exec 之前不执行,而是缓存在服务器的一个事务队列中,服务器一旦
收到 exec 指令,才开执行整个事务队列,执行完毕后一次性返回所有指令的运行结果。
Redis 事务可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会
被其它命令插入,不许加塞。
可以保证一个队列中,一次性、顺序性、排他性的执行一系列命令(Redis 事务的主要作用其实就是串联多个命令防止别的命
令插队)
官方文档是这么说的
事务可以一次执行多个命令, 并且带有以下两个重要的保证:
事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来
的命令请求所打断。
事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行
这个原子操作,和关系型 DB 的原子性不太一样,它不能完全保证原子性,后边会介绍。
Redis 事务的几个命令
MULTI 命令用于开启一个事务,它总是返回 OK 。
MULTI 执行之后, 客户端可以继续向服务器发送任意多条命令, 这些命令不会立即被执行, 而是被放到一个队列中, 当
EXEC 命令被调用时, 所有队列中的命令才会被执行。
另一方面, 通过调用 DISCARD , 客户端可以清空事务队列, 并放弃执行事务。
废话不多说,直接操作起来看结果更好理解~
一帆风顺