在数据处理的世界里,事务(Transaction)是一个不可或缺的概念。它们确保了在一系列操作中,要么所有的操作都胜利执行,要么都不执行。这就像是一个“全有或全无”的规定,保障了数据的一致性和完整性。

明天,咱们就来聊聊Redis事务的应用,看看如何通过它来晋升咱们的数据操作效率和安全性。

一、Redis事务的概念

Redis 事务的实质是一组命令的汇合。事务反对一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会依照程序串行化执行队列中的命令,其余客户端提交的命令申请不会插入到事务执行命令序列中。

总结来说: redis事务就是一次性、程序性、排他性的执行一个队列中的一系列命令。

Redis事务没有隔离级别的概念

批量操作在发送 EXEC 命令前被放入队列缓存,并不会被理论执行,也就不存在事务内的查问要看到事务里的更新,事务外查问不能看到。

Redis不保障原子性

Redis中,单条命令是原子性执行的,但事务不保障原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。redis事务的执行阶段开始事务(multi)。命令入队。执行事务(exec)

二、Redis事务优缺点

对于Redis事务的概念咱们曾经有了根本的理解,上面咱们再来看看它都有哪些优缺点。

长处:

  • 一次性按程序执行多个Redis命令,不受其余客户端命令申请影响;
  • 事务中的命令要么都执行(命令间执行失败相互不影响),要么都不执行(比方两头有命令语法错误);

毛病:

  • 事务执行时,不能保障原子性;
  • 命令入队每次都须要和服务器进行交互,减少带宽;

留神:

  • 当事务中命令语法应用谬误时,最终会导致事务执行不胜利,即事务内所有命令都不执行;
  • 当事务中命令常识逻辑谬误,就比方给字符串做加减乘除操作时,只能在执行过程中发现错误,这种事务执行中失败的命令不影响其余命令的执行。

三、Redis事务相干命令

Redis事务能够通过一系列命令来执行多个操作,并确保这些操作能够原子性地执行。以下是Redis事务的相干命令及其作用:

MULTI: 开启一个事务。在调用此命令后,Redis 会将后续的命令一一放入队列中,直到接管到 EXEC 命令为止。

EXEC: 执行事务中的所有操作命令。一旦调用 EXEC 命令,Redis 会原子性地执行队列中的所有命令。

DISCARD: 勾销事务,放弃执行事务块中的所有命令。如果不想继续执行事务中的操作,能够应用 DISCARD 命令来革除以后事务队列。

WATCH: 监督一个或多个键,如果在事务执行之前这些键被其余命令所改变,那么事务将会被打断。

UNWATCH: 勾销所有由 WATCH 命令监督的键。如果不想持续监督某些键,能够应用 UNWATCH 命令来勾销监督。

须要留神的是,在事务执行过程中,其余客户端提交的命令申请不会插入到事务执行命令序列中,这保障了事务的隔离性。同时,Redis 事务提供了批量操作缓存的性能,即在发送 EXEC 命令前,所有操作都会被放入队列缓存。

你还在苦恼找不到真正收费的编程学习平台吗?能够试试【云端源想】!课程视频、知识库、微实战、云实验室、一对一征询……你想要的全副学习资源这里都有,重点是当初还是收费的!点这里即可查看!

四、Redis事务的应用

应用Redis事务的步骤如下:

  • 应用MULTI命令开启一个事务。
  • 在事务中执行须要的命令,如SET、GET等。
  • 应用EXEC命令提交事务,将事务中的命令一次性发送给Redis服务器执行。
  • 如果须要勾销事务,能够应用DISCARD命令。

上面通过一些示例来解说一下这些命令的应用办法:

1、失常执行

192.168.xxx.21:6379> multiOK192.168.xxx.21:6379> set aa AAQUEUED192.168.xxx.21:6379> set bb BBQUEUED192.168.xxx.21:6379> set cc CCQUEUED192.168.xxx.21:6379> set dd DDQUEUED192.168.xxx.21:6379> exec1) OK2) OK3) OK4) OK192.168.xxx.21:6379> get aa"AA"

首先,通过执行multi命令开始一个事务块。而后,顺次执行了四个set命令,将键"aa"、“bb”、“cc"和"dd"别离设置为对应的值"AA”、“BB”、“CC"和"DD”。

每个set命令执行后返回的后果为"QUEUED",示意该命令已被退出到事务队列中期待执行。

接下来,通过执行exec命令来提交事务,一次性执行事务队列中的所有命令。执行后果为每个命令的返回值,即"OK"。最初,通过执行get aa命令获取键"aa"的值,返回后果为"AA"。

2、勾销事务

192.168.xxx.21:6379> multiOK192.168.xxx.21:6379> set aa 11QUEUED192.168.xxx.21:6379> set ee EEQUEUED192.168.xxx.21:6379> discardOK192.168.xxx.21:6379> get aa"AA"192.168.xxx.21:6379> get ee(nil)192.168.xxx.21:6379>

示例代码中,首先,通过执行multi命令开始一个事务块。而后,顺次执行了两个set命令,将键"aa"设置为值"11",将键"ee"设置为值"EE"。每个set命令执行后返回的后果为"QUEUED",示意该命令已被退出到事务队列中期待执行。

接下来,通过执行discard命令来勾销事务,放弃执行事务块内的所有命令。执行后果为"OK"。

最初,通过执行get aa命令获取键"aa"的值,返回后果为"AA"。而执行get ee命令获取键"ee"的值时,因为之前曾经勾销了事务,所以返回后果为"(nil)",示意该键不存在。

3、事务队列中存在命令谬误

如果在事务队列中存在命令性谬误(相似于java编译性谬误),则执行EXEC命令时,所有命令都不会执行

192.168.xxx.21:6379> multiOK192.168.xxx.21:6379> set aa 22QUEUED192.168.xxx.21:6379> set bb 33QUEUED192.168.xxx.21:6379> setq cc 44(error) ERR unknown command 'setq'192.168.xxx.21:6379> set ff FFQUEUED192.168.xxx.21:6379> exec(error) EXECABORT Transaction discarded because of previous errors.192.168.xxx.21:6379> get ff(nil)192.168.xxx.21:6379> get bb"BB"192.168.xxx.21:6379>

首先,通过执行multi命令开始一个事务块。而后,顺次执行了三个set命令,将键"aa"设置为值"22",将键"bb"设置为值"33",将键"cc"设置为值"44"。每个set命令执行后返回的后果为"QUEUED",示意该命令已被退出到事务队列中期待执行。

然而,在执行第三个set命令时,呈现了谬误。因为Redis中并没有名为"setq"的命令,所以返回后果为"(error) ERR unknown command ‘setq’"。

接下来,通过执行exec命令来提交事务,一次性执行事务队列中的所有命令。因为之前曾经呈现了谬误,导致事务被中断,所以执行后果为"(error) EXECABORT Transaction discarded because of previous errors."。

最初,通过执行get ff命令获取键"ff"的值时,因为事务被中断,所以返回后果为"(nil)“,示意该键不存在。而执行get bb命令获取键"bb"的值时,因为事务被中断,所以返回后果为"BB”。

4、事务队列中存在语法错误

如果在事务队列中存在语法性谬误(相似于java的1/0的运行时异样),则执行EXEC命令时,其余正确命令会被执行,谬误命令抛出异样。

192.168.xxx.21:6379> multiOK192.168.xxx.21:6379> incr aaQUEUED192.168.xxx.21:6379> set ff FFQUEUED192.168.xxx.21:6379> set bb 22QUEUED192.168.xxx.21:6379> exec1) (error) ERR value is not an integer or out of range2) OK3) OK192.168.xxx.21:6379> get bb"22"192.168.xxx.21:6379> get ff"FF"192.168.xxx.21:6379>

谬误起因:字符串不能累加1

5、watch监控

watch 命令能够监控一个或多个键,一旦有其中一个键被批改(被删除),前面的事务就不会执行了。监控始终继续到 EXEC 命令(事务中的命令是在exec之后才执行的,所以在multi命令后能够批改watch监控的键值)

假如咱们通过watch命令在事务执行之前监控了多个Keys,假使在watch之后有任何Key的值产生了变动,exec命令执行的事务都将被放弃,同时返回Null multi-bulk应答以告诉调用者事务执行失败。

(1)、执行watch,不执行multi、exec

192.168.xxx.21:6379> get aa"AA"192.168.xxx.21:6379> watch aaOK192.168.xxx.21:6379> set aa 11OK192.168.xxx.21:6379> get aa"11"192.168.xxx.21:6379>

(2)、执行 watch 命令,告诉执行 MULTI、exec

192.168.xxx.21:6379> set aa AaOK192.168.xxx.21:6379> get aa"Aa"192.168.xxx.21:6379> multiOK192.168.xxx.21:6379> set aa 11QUEUED192.168.xxx.21:6379> exec(nil)192.168.xxx.21:6379> get aa"Aa"192.168.xxx.21:6379>

(3)、exec 执行之后,会主动执行 UNWatch 命令,撤销监听操作

192.168.xxx.21:6379> set aa AaOK192.168.xxx.21:6379> get aa"Aa"192.168.xxx.21:6379> multiOK192.168.xxx.21:6379> set aa 11QUEUED192.168.xxx.21:6379> exec(nil)192.168.xxx.21:6379> get aa"Aa"192.168.xxx.21:6379> set aa 11OK192.168.xxx.21:6379> get aa"11"192.168.xxx.21:6379>

(4) 、unwatch撤销监听

192.168.xxx.21:6379> get bb"BBB"192.168.xxx.21:6379> watch bbOK192.168.xxx.21:6379> multiOK192.168.xxx.21:6379> unwatchQUEUED192.168.xxx.21:6379> set bb 222QUEUED192.168.xxx.21:6379> exec1) OK2) OK192.168.xxx.21:6379> get bb"222"192.168.xxx.21:6379>

以上就是Redis事务的概念及相干命令的应用,Redis事务是一个十分弱小的工具,它能够帮忙咱们在解决数据的时候保持数据的一致性和完整性。通过应用Redis事务,能够让咱们的数据操作更高效、更平安。

心愿这篇文章可能帮忙你更好地了解和应用Redis事务!