目录

​​一、Redis基本的事务操作​​

​​1、原子性:​​

​​2、Redis事务​​

​​Redis事务执行顺序:​​

​​Redis事务演示:​​

​​3、异常​​

​​二、Redis实现乐观锁(面试常问)​​

​​1、悲观锁​​

​​2、乐观锁(常用)​​

​​3、Redis监视测试​​

​​无变化,正常执行:​​

​​有变化,停止执行:​​


一、Redis基本的事务操作

1、原子性:

要么同是成功吗,要么同时失败;

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

2、Redis事务

事务指的是一组命令的集合;

一个事物的所有命令都会被序列化,在事务执行的过程中,会按照顺序执行;

一次性、顺序性、排他性;

--- 队列 set set set 执行 ---

Redis事务没有隔离级别的概念;

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

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

Redis事务执行顺序:

开启事务(multi)——命令入队——(取消执行事务discard)——执行事务(Exec);

取消执行事务:discard;

Redis事务演示:

代码:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> get k2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) "v2"
4) OK

图解:

【Redis】006-Redis基本的事务操作、Redis实现乐观锁_乐观锁

3、异常

编译型异常:代码有问题、命令有问题,所有的命令都不会执行;

【Redis】006-Redis基本的事务操作、Redis实现乐观锁_redis_02

运行时异常(如1/0):如果事务队列中存在语法性错误,那么执行命令的时候,其他正确的命令可以正常执行,所以说Redis的事务是没有原子性的;

【Redis】006-Redis基本的事务操作、Redis实现乐观锁_执行顺序_03

二、Redis实现乐观锁(面试常问)

1、悲观锁

很悲观,认为什么时候都会出问题,无论做什么都加锁(影响性能);

2、乐观锁(常用)

很乐观,认为什么时候都不会出现问题,所以不会上锁,更新数据的时候去判断一下,在此期间是否有人修改过这个数据,MySQL的version,在Redis中使用Watch;

获取version——更新的时候比较version;

unwatch取消监控(解锁)!

3、Redis监视测试

无变化,正常执行:

【Redis】006-Redis基本的事务操作、Redis实现乐观锁_Redis_04

有变化,停止执行:

【Redis】006-Redis基本的事务操作、Redis实现乐观锁_执行顺序_05

【Redis】006-Redis基本的事务操作、Redis实现乐观锁_redis_06

所以多线程修改值,使用watch可以当做乐观锁操作!

如果事务执行失败,就先解锁(unwatch),再加锁(watch,获取最新值再次进行监控);