关于redis:不可不知的Redis秘籍事务命令全攻略

62次阅读

共计 4861 个字符,预计需要花费 13 分钟才能阅读完成。

在数据处理的世界里,事务(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> multi
OK
192.168.xxx.21:6379> set aa AA
QUEUED
192.168.xxx.21:6379> set bb BB
QUEUED
192.168.xxx.21:6379> set cc CC
QUEUED
192.168.xxx.21:6379> set dd DD
QUEUED
192.168.xxx.21:6379> exec
1) OK
2) OK
3) OK
4) OK
192.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> multi
OK
192.168.xxx.21:6379> set aa 11
QUEUED
192.168.xxx.21:6379> set ee EE
QUEUED
192.168.xxx.21:6379> discard
OK
192.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> multi
OK
192.168.xxx.21:6379> set aa 22
QUEUED
192.168.xxx.21:6379> set bb 33
QUEUED
192.168.xxx.21:6379> setq cc 44
(error) ERR unknown command 'setq'
192.168.xxx.21:6379> set ff FF
QUEUED
192.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> multi
OK
192.168.xxx.21:6379> incr aa
QUEUED
192.168.xxx.21:6379> set ff FF
QUEUED
192.168.xxx.21:6379> set bb 22
QUEUED
192.168.xxx.21:6379> exec
1) (error) ERR value is not an integer or out of range
2) OK
3) OK
192.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 aa
OK
192.168.xxx.21:6379> set aa 11
OK
192.168.xxx.21:6379> get aa
"11"
192.168.xxx.21:6379>

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

192.168.xxx.21:6379> set aa Aa
OK
192.168.xxx.21:6379> get aa
"Aa"
192.168.xxx.21:6379> multi
OK
192.168.xxx.21:6379> set aa 11
QUEUED
192.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 Aa
OK
192.168.xxx.21:6379> get aa
"Aa"
192.168.xxx.21:6379> multi
OK
192.168.xxx.21:6379> set aa 11
QUEUED
192.168.xxx.21:6379> exec
(nil)
192.168.xxx.21:6379> get aa
"Aa"
192.168.xxx.21:6379> set aa 11
OK
192.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 bb
OK
192.168.xxx.21:6379> multi
OK
192.168.xxx.21:6379> unwatch
QUEUED
192.168.xxx.21:6379> set bb 222
QUEUED
192.168.xxx.21:6379> exec
1) OK
2) OK
192.168.xxx.21:6379> get bb
"222"
192.168.xxx.21:6379>

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

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

正文完
 0