• redis事务


    1.redis的事务是基于队列实现的

    mysql的事务是基于事务日志和锁机制实现的
    redis是乐观锁机制
    redis与mysql事务的区别:
      mysql事务是一开始就在内存里面执行了,只是还没有提交。
      而redis是把任务放在队列里,还没有执行。只有exec的时候,才是真正的执行了。

    开启事务
    multi #进入事务
    command1 #要执行的命令
    command2 #要执行的命令
    command3 #要执行的命令
    command4 #要执行的命令
    exec #执行
    discard #取消执行

    4条语句作为一个组,并没有真正执行,而是被放入同一队列中。
    如果,这时执行discard,会直接丢弃队列中所有的命令,而不是做回滚。
    当执行exec时,队列中所有操作,要么全成功要么全失败

    redis事务还有监听命令
    watch key

    乐观锁悲观锁
    乐观锁:顾名思义很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量
    悲观锁:顾名思义很悲观,每次去拿数据的时候都认为别人修改,所以每次在拿数据的时候都会上锁,这样如果中间有人想拿数据就会一直阻塞除非锁被释放获取到锁。传统的关系型数据库里,用到了很多种这种锁机制,比如行锁,表锁,写锁等

    2.在mutil后面的语句,语句出错可能有两种情况

    2.1 语法就有问题,此时exec报错,所有语句得不到执行
    2.2 语法本身没错,但适用对象有问题,exec之后会执行正确的语句,并跳过有问题的语句

    3.redis事务3特性

    3.1 单独的隔离操作:事务中所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
    3.2 没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被执行,
    也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题
    3.3 不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚

  • 相关阅读:
    C#中使用My实现单例应用程序
    喝着啤酒学Python(2):第一个HelloWorld
    再读《精通css》04:盒模型和空白边叠加
    再读《精通css》07:圆角
    再读《精通css》08:阴影
    @ResponseBody 乱码
    再读《精通css》05:定位、浮动与清理
    关于javascript面向对象的一点思考
    再读《精通css》06:背景图片
    【求解释】关于第三方接口调用中安全的疑问
  • 原文地址:https://www.cnblogs.com/xufengnian/p/11917693.html
Copyright © 2020-2023  润新知