这篇文章讲的是Redis交易处理的操作方法,边肖觉得挺实用的,所以想分享给大家学习。希望大家看完这篇文章能有所收获。我不多说,让我们和边肖一起看看。
一、简介
Redis采用了乐观锁方式进行事务控制,它使用watch命令来监视给定的键。当exec(提交事务)时,如果被监控的键在调用watch后发生了变化,整个事务将失败。您也可以调用watch多次监控多个按键。请注意,手表的钥匙对整个连接都有效。如果连接断开,监控和事务将自动清除。当然,exec、discard和unwatch命令将清除连接中的所有监控。
Redis保证事务中的所有命令要么被执行,要么不被执行(原子性)。如果客户端在发送EXEC命令之前断开连接,Redis将清空事务队列,事务中的所有命令都不会执行。一旦客户端发送了EXEC命令,所有的命令都会被执行,即使客户端后来断开了连接,因为所有要执行的命令都已经记录在Redis中了。
常用指令:
多重未结交易。
Exec提交事务。
放弃取消交易。
观察监控,如果监控值发生变化,提交时交易会失败。
取消监视。
二、模拟使用
模拟转账操作
打开事务后,所有操作将进入一个队列,并在提交时一起执行。
模拟取消事务
redis交易太简单,没有回滚,只有注销。
当队列中的语句出现错误时,事务会自动取消。
10-1010乐观锁,顾名思义就是非常乐观。每次得到数据,我都认为别人不会修改,所以不会锁定。在此期间,数据可以被其他人随意读取,但在更新时,我会判断在此期间是否有其他人更新过数据,我可以使用版本号等机制。
版本号机制是乐观锁定中最常用的方法,即在表中增加一个版本号字段,在更新前检查以获取版本号,然后将其更新为update语句的where条件。如果数据在获取版本号后更新前发生了变化,那么更新会失败,因为最后更新了0条数据,如果java后台获取的更新号为0,则意味着更新失败并出现并发问题,然后再做具体处理。
乐观锁使用演示
开始监控,开始交易,执行语句。
1.添加测试数据语句
00-1010在这里我们可以看到事务的执行失败了。a变成了666。
00-1010/*实现一个简单的基于reids的多线程抢票操作。
*密钥延迟乐观锁定的应用*/
publicclassSecondsKillDemo02{
//定义票务逻辑。
n
bsp; public static void KillTicket() {
//1.连接
Jedis jedis = JedisDataSource.getConnection();
//2.监控reids中指定的key
String a = jedis.get("a");
if (a == null || Integer.valueOf(a) == 0)
throw new RuntimeException("没票了");
jedis.watch("a", "b");
//3.开启事务执行业务
Transaction multi = jedis.multi();
try {
multi.decr("a");
multi.incrBy("b", 100);
//4.提交事务
multi.discard();
System.out.println("ok");
} catch (Exception e) {
multi.exec();
} finally {
//5.取消监控
jedis.unwatch();
//6.释放
jedis.close();
}
}
public static void main(String[] args) {
//1.定义初始数据
Jedis jedis = JedisDataSource.getConnection();
jedis.set("a", "1");
jedis.set("b", "0");
//2.创建多个线程,在线程中执行抢票
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
KillTicket();
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
KillTicket();
}
});
t1.start();
t2.start();
}
}
以上就是Redis事务处理的操作方法是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/37089.html