事务
3.1基本概念
事务的本质:一组命令的集合,一个事务中的所有命令都会被序列化,在事务的执行过程中,会按照顺序执行。
一次性,顺序性,排他性 执行一些命令
---队列 set set set 执行---
redis事务没有隔离级别的概念。所有的命令在事务中,并没有直接被执行,只有发起执行命令的时候才会执行!EXCUTE
redis单条命令是保证原子性,但是redis事务是不保证原子性的
redis的事务:
开启事务(multi)
命令入队(其他命令。。。。)
执行事务(exec)
取消事务(discard)
eg:
127.0.0.1:6379> multi 开启事务
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> get k1
QUEUED
127.0.0.1:6379(TX)> get k2
QUEUED
127.0.0.1:6379(TX)> setbit mybit 1 0
QUEUED
127.0.0.1:6379(TX)> setbit mybit 0 1
QUEUED
127.0.0.1:6379(TX)> setbit mybit 2 1
QUEUED
127.0.0.1:6379(TX)> getbit mybit 1
QUEUED
127.0.0.1:6379(TX)> BITCOUNT mybit 0 -1
QUEUED
127.0.0.1:6379(TX)> exec 执行事务
1)OK
2)OK
3)OK
4)"v1"
5)"v2"
6)(integer) 0
7)(integer) 0
8)(integer) 1
9)(integer) 0
10) (integer) 2
取消事务
eg:
127.0.0.1:6379> multi 开始事务
OK
127.0.0.1:6379(TX)> set k2 1
QUEUED
127.0.0.1:6379(TX)> set k3 3
QUEUED
127.0.0.1:6379(TX)> DISCARD 取消事务
OK
事务队列中命令都不会被执行
编译型异常(代码有问题,命令有错),事务中所有的命令都不会执行
eg:
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> get k3
QUEUED
127.0.0.1:6379(TX)> setbit mybit 1 0
QUEUED
127.0.0.1:6379(TX)> setbit mybit 0 0
QUEUED
127.0.0.1:6379(TX)> getbit 1 //执行事务报错
(error) ERR wrong number of arguments for'getbit' command
127.0.0.1:6379(TX)> getbit mybit 1
QUEUED
127.0.0.1:6379(TX)> BITCOUNT mybit 0 -1
QUEUED
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discardedbecause of previous errors. //所有的命令都不会被执行
运行时异常,如果事务队列中存在语法性错误,那么执行命令的时候,其他命令是可以正常执行的,错误命令抛出异常
eg:
127.0.0.1:6379> set k1"dfa" //将k1设置为一个字符串,
OK
127.0.0.1:6379> multi //开始事务
OK
127.0.0.1:6379(TX)> set k2 2
QUEUED
127.0.0.1:6379(TX)> set k3 3
QUEUED
127.0.0.1:6379(TX)> incr k1 //将k1 加1,执行的时候失败
QUEUED
127.0.0.1:6379(TX)> get k1
QUEUED
127.0.0.1:6379(TX)> get k2
QUEUED
127.0.0.1:6379(TX)> exec //执行
1) OK
2) OK
3) (error) ERR value is not an integer or
out of range //其他命令正常执行,只有这个命令报错
4) "dfa"
5) "2"
3.2 监视watch / 实现乐观锁
乐观锁:认为什么时候都不会出问题,所以会上锁。更新数据的时候去判断一下,在此期间是否有人修改过这个数据
获取version,更改的时候比较version
悲观锁:执行什么都加锁
监视:watch
watch [key...] 可以同时监视多个变量,加锁
unwatch 解锁,如果修改值失败,就先解锁,然后重新获取最近的值,再进行操作
四 .Jedis
Jedis:是redis官方推荐的java连接开发工具,使用Java操作redis中间件,应十分熟悉
我们使用java来操作redis
SpringBoot整合
之后再来补充这块内容