Vertx的Redis Client进行事务处理
来源:互联网 发布:淘宝top排行榜关键词 编辑:程序博客网 时间:2024/06/05 15:45
Vertx的Redis Client中主要有两个类
- RedisClient
- RedisTransaction
其中RedisTransaction是用来处理Redis缓存事务的。
场景:Redis缓存中有个数据 i=100;
有两个操作,都要对i进行+100的处理
如果不做事务处理:
- 操作1读Redis缓存i,得到100
- 操作2读Redis缓存i,也得到100
- 操作1对Redis缓存i进行+100,减200写入到Redis缓存
- 操作2对Redis缓存i进行+100,减200写入到Redis缓存
结果可以看到是200,预期是300
所以必须进行事务处理,Vertx的Redis事务处理用的是乐观锁,流程如下:
- watch key:先监视某个key
- get key:从redis缓存中读取key值
- multi:开启事务
- set key:对key值进行处理,写入新值到Redis
- exec:提交事务,如果key值变了,提交的返回值是null,如果key值没变,返回值为正确执行结果
- 如果提交的返回结果是null,重复1~5,由于是乐观锁,原则上会到提交成功为止
- 如果发生error,进行异常处理
代码如下:
public void redisTransaction(Vertx vertx){//Redis连接RedisOptions config = new RedisOptions();config.setHost("127.0.0.1");config.setPort(6379);RedisClient client = RedisClient.create(vertx, config);//Redis缓存事务模块RedisTransaction transactionClient = client.transaction();transactionClient.watch("i", res->{if(!res.succeeded()){res.cause().printStackTrace();}});transactionClient.get("i", getRes->{if(getRes.succeeded()){//开启Redis缓存事务transactionClient.multi(multiRes->{if(!multiRes.succeeded()){multiRes.cause().printStackTrace();}});//更新Redis缓存key的值Integer value = Integer.parseInt(getRes.result()) + 100;//同步i到Redis缓存transactionClient.set("i", value.toString(), setRes->{if(!setRes.succeeded()){setRes.cause().printStackTrace();}});//执行Redis缓存事务transactionClient.exec(res->{if(res.succeeded()){if (res.result() == null) {//乐观锁执行失败,重新执行redisTransaction(vertx);}} else {res.cause().printStackTrace();}});} else {getRes.cause().printStackTrace();}});}
1 0
- Vertx的Redis Client进行事务处理
- 使用dropwizard对Vertx进行运行状态的监控
- Redis的事务处理
- redis的事务处理
- 【Redis系列】Redis的事务处理
- Redis的Client设计
- Redis事务处理
- redis事务处理
- redis事务处理
- redis事务处理
- Redis事务处理
- Redis事务处理
- redis事务处理
- redis事务处理
- 【Thrift/Vertx】关于Thrift和Vertx的服务整合
- 正确的使用@Transactional进行数据库事务处理
- 理解事务处理、事务处理的隔离级别,和使用JDBC进行事务处理
- 理解事务处理、事务处理的隔离级别,和使用JDBC进行事务处理
- Android_仿苹果数字键盘以及判断信用卡有效期的Editext
- C++引用详解
- Lambda 表达式语法
- Python之 __name__和__main__
- 初学python,记录的有点乱。先开始吧。
- Vertx的Redis Client进行事务处理
- 仿京东收货地址三级联动
- tensorflow学习笔记四——实现一个CNN网络
- Lambda 表达式的示例
- MooseFS Master main 函数代码简单学习
- Android listview addHeaderView 和 addFooterView 详解
- jointJS(一)--关于jointJS的初认识
- Centos 7 双系统 引导修复
- 使用JavaMail API发送邮件失败(二)