Redis事务

一.Redis事务

可以一次执行多个命令,本质是一组指令的集合,一个事务中的所有命令都会被序列化,按顺序地串行执行而不会被其他命令插入,不许加塞。

MULTI, EXEC, DISCARD 和 WATCH是Redis事务的基础。它们允许在一步内执行一组命令。

二.用法

1.使用MULTI来开启Redis事务,该命令总是以OK来进行响应。此时用户可以发出多条命令,Redis将不再执行这些命令,而是将这些命令放入队列之中。所有命令都是在调用EXEC之后执行。相反,调用DISCARD 将会清空队列并退出事务。

2.当时用MUTLI开启事务之后,一般会返回一个OK,之后redis会记录你的全部操作,直到你执行了EXEC命令或者DISCARD命令,这些命令将不会直接执行,而是会被放入队列中,如果出现了以下的情况是会报错的:

  1.如果命令出现了错误,那么这条事务将全部失败,直接报错(类似于Java程序中编译都没有通过,语法错误)

  2.如果出现了给字符串加1这种情况,那么这条事务中只有这条操作会报错,其余操作正常执行(有点类似于运行时异常,比如5/0,编译没问题,运行时才报错)

  所以Redis事务是部分一致性,不像关系型数据库比如Oracle那样强一致性。

3.watch监控:

  3.1表锁是将整张表都锁住,当其他访问到达时就只能等待,直到当前访问释放这张表的锁,但是如果这张表中的数据量很大的话,那么就会导致并发性差,一致性强。

  行锁就是将当前想要访问的那条记录锁住,当有别的访问想要操作同一行时就等待,直到当前访问释放锁,但是不影响访问其他数据。

  悲观锁就认为一定会有人修改数据,就给数据上锁,即数据库中的表锁,行锁,所以为了保证数据的一致性,就将数据锁住。

  乐观锁就认为不会有人修改数据,就不会给数据上锁。乐观锁为了保证高并发和数据的一致性,就在每条记录的后面加了一个版本号。比如A想要修改某条数据的年龄,所以A先获取到这条数据,此时这条数据的版本号是1,当A修改完数据,并将版本号修改为2,准备提交,在提交之需要检查一下有没有人修改了数据,发现B修改了地址,并已提交,此时版本号为2,于是A就只能放弃本次操作,重新获取数据,再进行操作并检查提交,直到他的版本号>=检查获取的数据的版本号,才能提交成功。(类似于多线程中volite和CAS)

  3.2watch命令的描述:

  watch可以监控一个或者多个key,一旦其中有一个或者多个键被修改或者删除,那么之后的事务就不会执行。监控一直持续到EXEC命令(事务中的命令是在EXEC之后才执行的,所以在MULTI命令后可以修改WATCH监控的键值)

  注意点:

  由于WATCH命令的作用只是当被监控的键值被修改后阻止之后一个事务的执行,而不能保证其他客户端不修改这一键值,所以在一般的情况下我们需要在EXEC执行失败后重新执行整个函数。

  执行EXEC命令后会取消对所有键的监控,如果不想执行事务中的命令也可以使用UNWATCH命令来取消监控。

 

三.总结

watch指令类似于乐观锁,事务提交时,如果key的值被别的客户端修改了,那么整个事务队列都不会被执行。

一旦执行了unwatch或者exec命令之后,之前加的所有监控锁都会被取消。

posted @ 2019-10-16 10:25  NewBBBB  阅读(94)  评论(0编辑  收藏  举报