什么是Redis事务
Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。
总结说:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令
Redis 事务相关命令有哪些
MULTI
、 EXEC
、 DISCARD
和 WATCH
是 Redis 事务相关的命令
- MULTI :开启事务,redis会将后续的命令逐个放入队列中,然后使用
- EXEC命令来原子化执行这个命令系列。 EXEC:执行事务中的所有操作命令。
- DISCARD:取消事务,放弃执行事务块中的所有命令。
- WATCH:监视一个或多个key,如果事务在执行前,这个key(或多个key)被其他命令修改,则事务被中断,不会执行事务中的任何命令
- UNWATCH:取消WATCH对所有key的监视
watch命令
监视一个或多个key,如果事务在执行前,这个key(或多个key)被其他命令修改,则事务被中断,不会执行事务中的任何命令
被 WATCH 的键会被监视,并会发觉这些键是否被改动过了。 如果有至少一个被监视的键在 EXEC 执行之前被修改了, 那么整个事务都会被取消
watch是如何监视实现的呢
Redis
使用WATCH
命令来决定事务是继续执行还是回滚,那就需要在MULTI
之前使用WATCH来监控某些键值对,然后使用MULTI
命令来开启事务,执行对数据结构操作的各种命令,此时这些命令入队列。
当使用EXEC执行事务时,首先会比对WATCH所监控的键值对,如果没发生改变,它会执行事务队列中的命令,提交事务;如果发生变化,将不会执行事务中的任何命令,同时事务回滚。当然无论是否回滚,Redis都会取消执行事务前的WATCH命令
Redis事务执行步骤(开启 入队执行)
为甚么Redis不支持回滚(重要)
Redis 在事务失败时不进行回滚,而是继续执行余下的命令
- Redis命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。回滚并不能解决变成错误带来的问题。
- 因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。
如何理解Redis事务的ACID
持久性指的是一旦事务提交,所做的修改就会永久保存到数据库中
Redis持久化是异步执行的。