1. 事务

事物本质: 一组命令的集合! 一个事务中的所有命令都会被序列化 在事务执行的过程中, 会按照顺序执行

一次性, 顺序性,排他性

-------- 队列 set  set set 执行 -------
Redis 事务没有隔离级别的概念

所有命令在事务中,并没有直接被执行 只有发起执行命令的时候才会执行

  • Redis 单条命令是保存原子性的,但是事务不保证原子性

    reddis的事务:

    • 开启事务 ()

    • 命令入队 ()

    • 执行事务 ()

    正常执行事务

    • multi 开起事务

    • set k1 v1

    • set k2 v2

    • exec // (执行)

    事物的放弃

    • multi

    • set k1 v1

    • set k2 v2

    • set k3 v2

    • discard (取消事务)

    编译时异常

    • multi

    • set k1 v1

    • adfba fab (错误的命令)

    • set k3 v3

    • exec

      事务中有报错的 所有值都不会执行

    运行时异常

    • multi

    • set k1 'fasdfa'

    • incr k1

    • set k2 v2

    • get k3

    • exec

      incr k1 这个不能对字符串加减报错 这样其他的依就可以正常执行 所以Redis中的事务不保证原子性

 

监控

悲观锁:

  • 很悲观, 认为什么时候都会出问题,无论做什么都会加锁

乐观锁

  • 很乐观,认为什么时候都不会出问题,所以不会上锁! 更新数据的时候去判断

  • 获取version

  • 提交的时候比较version

redis 实现乐观锁(原理 先获取 他的值 在提交的时候在对比下开妈获取的值如果没有发生变化就会执行成功)

127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money # 监视money 对象
OK
127.0.0.1:6379> multi 事务正常结束, 数据期间没有发生变动
OK
127.0.0.1:6379> decrby money 20
QUEUED
127.0.0.1:6379> incrby out 20
QUEUED
127.0.0.1:6379> exec  
1) (integer) 80
2) (integer) 20 执行成功返回
127.0.0.1:6379>
127.0.0.1:6379> watch money  # 
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 10
QUEUED
127.0.0.1:6379> incrby out 10
QUEUED
127.0.0.1:6379> exec 执行exec 前 开启个别一个连接 执行 set money 1000 然后在来执行exec
(nil) 执行失败 (如果执行失败放弃监视)
127.0.0.1:6379> unwatch
OK
127.0.0.1:6379> watch money # 重新监视
OK
127.0.0.1:6379> multi 开起事务
OK
127.0.0.1:6379> decrby money 10
QUEUED
127.0.0.1:6379> incrby out 10
QUEUED
127.0.0.1:6379> exec
1) (integer) 990
2) (integer) 30
127.0.0.1:6379>