美文网首页
Redis学习笔记之Redis事务

Redis学习笔记之Redis事务

作者: Moine0828 | 来源:发表于2019-08-12 09:52 被阅读0次

    Redis事务四大命令:EXEC,MULTI,WATCH,DISCARD

    • MULTI:开启事务状态
    • EXEC:事务提交
    • WATCH:为任意数量的数据库键添加监控,若事务期间监控的key被修改则拒绝事务提交
    • DISCARD:取消事务

    当redis处于事务开启的状态时,获取的客户端命令时会先判断是否是上面四大命令中的一个,如果不是,redis会将命令放置到一个事务队列中,而不是立即执行,然后返回给客户端QUEUED。如果是,那么命令会被立即执行。如果接收的是EXEC命令,redis会将事务队列中的所有命令提交。事务队列是一个FIFO的队列,是一个multiCmd结构组成的数组。

    WATCH命令是一个乐观锁,被监控的key保存在一个watched_keys字典中。字典的键是被监控的键值,而字典的值是一个链表,记录着监控这个key的所有客户端。对于所有数据库修改命令,例如SET,LPUSH,DEL,SADD等等,redis执行之后都会对watched_keys字典进行检查,如果刚刚修改的键是被监控的,那么redis会将客户端的REDIS_DIRTY_CAS标志打开,表示事务安全性已经被破坏。当客户端发来EXEC命令时,服务端会先检查REDIS_DIRTY_CAS这个标志,如果不安全,则服务端拒绝执行这个事务的提交命令。

    事务的ACID
    • 原子性:redis事务支持原子性。但是redis事务不支持回滚,一个事务中一堆命令如果有一个执行失败,并不会导致整批的命令执行中断。
    • 一致性:命令入队过程中如果出现错误,命令执行过程中如果出现错误,或者服务器停机。redis都不会执行这个事务。以此来保证一致性。
    • 隔离性:由于redis是单线程的,那么事务的执行总是串行的而不是并行的。所以可以保证隔离性
    • 持久性:redis事务的持久性由redis的持久化配置决定。如果配置了总是持久化,那么每执行完一个命令就会写入持久化文件。若配置的是1s持久化一次,那么将不具备持久性。如果没开启持久化那就更不用说。但是不论在什么模式下,加上一个SAVE命令然后再EXEC,事务总是具有持久性。

    相关文章

      网友评论

          本文标题:Redis学习笔记之Redis事务

          本文链接:https://www.haomeiwen.com/subject/ofdyjctx.html