广州建站网站,黑龙江建设网官方网站,石青网站推广软件,怎么用电脑自带软件做网站页面什么是Redis事务
学习mysql数据库的时候#xff0c;我们知道了事务的ACID特性#xff0c;Redis也是支持事务的#xff0c;不过和数据库的事务又有什么区别#xff1f;在mysql数据库中#xff0c;我们使用begin开启事务#xff0c;提交是commit#xff0c;回滚是rollbac…什么是Redis事务
学习mysql数据库的时候我们知道了事务的ACID特性Redis也是支持事务的不过和数据库的事务又有什么区别在mysql数据库中我们使用begin开启事务提交是commit回滚是rollback然后Redis中的事务是怎么一回事redis的事务其实可以看做是一组命令按照顺序串行执行队列中的命令其它客户端的命令不会写入到这个队列中。总的来说redis事务就是一次性、顺序性、排他性的执行一个队列中的一组命令
redis事务相关命令和使用
MULTI 、 EXEC 、 DISCARD 和 WATCH、UNWATCH命令是redis实现事务需要的命令
multi开启事务事务开启后事务中的多条命令会排队等事务提交discard取消事务放弃执行队列里的所有命令exec执行事务里的所有命令watch监控一个或者多个key如果事务提交之前这个key被其它客户端修改了这个事务就不会提交unwatch 取消watch对所有key的监视
redis事务例子
正常的事务执行过程
127.0.0.1:0multi
OK127.0.0.1:0incr testid
QUEUED127.0.0.1:0exec1) 1语法错误导致的事务回滚
127.0.0.1:0multi
OK127.0.0.1:0incr testid
QUEUED127.0.0.1:0seta a
ERR unknown command seta, with args beginning with: a, 127.0.0.1:0exec
EXECABORT Transaction discarded because of previous errors.对string类型进行incr 对一个key先设置为string类型的然后使用incr命令进行递增再提交事务出现错误
127.0.0.1:0set testid aa
OK127.0.0.1:0multi
OK127.0.0.1:0incr testid
QUEUED127.0.0.1:0exec1) ERR value is not an integer or out of range手动回滚
127.0.0.1:0multi
OK127.0.0.1:0incr id
QUEUED
127.0.0.1:0discard
OKwatch命令使用 watch命令有点像cas锁check-and-set事务开启后其它客户端更改了值事务不执行
127.0.0.1:0watch id
OK
127.0.0.1:0multi
OK
127.0.0.1:0set id 1
QUEUED
127.0.0.1:0get id
QUEUED另外一个客户端设置key的值
127.0.0.1:0set id 2
QUEUED客户端1再提交事务
127.0.0.1:0exec(nil)redis事务特点
命令是原子性的在执行事务中的指令时不能执行其它指令但是redis是保证分布式的ap模式的不能保证cp特性所以一般对业务要求严格的也不采用redis事务redis事务可以在一定程度保证原子性但是不能获取事务中间指令的结果然后再决定后面的执行逻辑所以这种业务场景也不适用这时候可以使用lua脚本来实现