Redis学习笔记(三/四)——事务及Jedis

事务

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整合


之后再来补充这块内容

你可能感兴趣的:(Redis学习笔记(三/四)——事务及Jedis)