一、redis事务
(1) Redis单条命令保证原子性,但事务不保证原子性。
Redis 事务不是严格意义上的事务,只是用于帮助用户在一个步骤中执行多个命令。单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
(2) Redis没有隔离性的概念,只有发起执行命令的时候才会执行。
(3) 一个事务从开始到执行会经历以下三个阶段:
- 开始事务。
- 命令入队。
- 执行事务。
(4) 事务执行命令:
MULTI、EXEC、DISCARD、WATCH 这四个指令构成了 redis 事务处理的基础。
- MULTI 用来组装一个事务;
- EXEC 用来执行一个事务;
- DISCARD 用来取消一个事务;
- WATCH 用来监视一些 key,一旦这些 key 在事务执行之前被改变,则取消事务的执行。
(5) 事务异常:
有关事务,大家经常会遇到的是两类错误:(1)语法错误(2)运行时错误,操作错误 1 / 0
- 调用 EXEC 之前的错误
- 调用 EXEC 之后的错误
单条命令错误,不会影响整体的操作;这就是redis不保证原子性。、
(6):redis==>乐观锁
悲观锁:认为什么时候都会出问题,什么时候都会加锁;
乐观锁:认为什么时候都不会出现问题,所以不会加锁;
watch:加锁;
unwatch:解锁
1) Redis使用watch去监控,一旦有其他的线程修改当前的变量,就会导致,事务操作失败!
2) Java中数据库使用version进行监控! 实现乐观锁!
3) 事务提交失败后,先解锁(unwatch)再获取最新的值,然后进行加锁(watch)。
二、Jredis(在SpringBoot2.0以上的版本弃用了);
(1)依赖:(后补)
Jredis jredis =new Jredis('ip',端口)
(2) 测试
(3) 开启事务