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事务 可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序的串行执行而不会...
    coolxc阅读 708评论 0 0
  • 7. Redis事务 7.1 事务定义 Redis 通过MULTI、 DISCARD、EXEC和 WATCH四个命...
    复旦猿阅读 2,563评论 0 1
  • 【redis是什么】 redis是一个开源的、使用C语言编写的,支持网络交互的、可基于内存也可持久化的key-va...
    编辑小猿阅读 1,027评论 0 0
  • NOsql 泛指非关系型数据库,为了克服超大规模的高并发的问题,NoSQL在当今大数据环境下发展的十分迅速,Red...
    Wirdeo阅读 1,794评论 0 0
  • 之前一直有听说 Redis,但是一直没有使用和学习过,而项目上关于缓存数据库的知识用到的只有一点 Memcache...
    江城子Leon阅读 1,482评论 0 0