Redis事务系列之二Redis实现乐观锁
Posted 程序编织梦想
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis事务系列之二Redis实现乐观锁相关的知识,希望对你有一定的参考价值。
一、前言
上一章我们讲解了Redis事务系列之一Redis事务详解,你可以点击连接查看,这一章我们在Redis事务的基础上实现乐观锁。
注意,本章知识以上一章知识为基础,如果redis事务不了解,请看完Redis事务再来看本章的知识。
二、什么是乐观锁,什么是悲观锁
这里我简单介绍一下乐观锁和悲观锁,让大家有所了解。
2.1 乐观锁
乐观锁,简单来说就是所有人都可以干这件事,但是能够成功的却是少数。我打个比方:
假设你们村里有一个漂亮姑娘叫小芳。是不是你们村里的所有男人都可以追求她?至于成功的人却是只有一个(不要抬杠:小芳只允许有一个男人)。如下图:
乐观锁典型的应用场景就是:商品秒杀。所有人都可以抢购商品,但是,最终能抢到的就那么几个人。
2.2 悲观锁
悲观锁,简单来说就是互斥使用资源,只要一个人在用,别人就不能用。举个例子,假设你们村里只有一个厕所,所有人都共用这一个厕所,是不是只要一个人在厕所中,其他人只能排队等候。(不要抬杠:厕所一次只能容纳一个人)
悲观锁典型应用场景就是:修改数据库中的一条数据,需要对该行进行加悲观锁,防止别的进程修改。
好,简单介绍了一下乐观锁和悲观锁,让大家心里有个大体的了解。下面我们开始讲Redis实现乐观锁。
三、Redis实现乐观锁
我们正是用的Redis的Watch命令实现回滚。具体思路如下:
1、利用redis的watch功能,监控这个redisKey的状态值
2、获取redisKey的值
3、创建redis事务
4、给这个key的值+1
5、然后去执行这个事务,如果key的值被修改过则回滚,key不加1。
为了方便大家理解,我画一个图来表示,如下图:
3.1 乐观锁代码
public void watch()
try
String watchKeys = "watchKeys";
//初始值 value=1
jedis.set(watchKeys, 1);
//监听key为watchKeys的值
jedis.watch(watchkeys);
//开启事务
Transaction tx = jedis.multi();
//watchKeys自增加一
tx.incr(watchKeys);
//执行事务,如果其他线程对watchKeys中的value进行修改,则该事务将不会执行
//通过redis事务以及watch命令实现乐观锁
List<Object> exec = tx.exec();
if (exec == null)
System.out.println("事务未执行");
else
System.out.println("事务成功执行,watchKeys的value成功修改");
catch (Exception e)
e.printStackTrace();
Redis乐观锁实现秒杀
finally
jedis.close();
四、结尾
好了,本章就讲到这里,下一章我们用乐观锁实现秒杀系统。
另外大家帮忙关注一下我的微信公众号,关注后有大量课程相赠
以上是关于Redis事务系列之二Redis实现乐观锁的主要内容,如果未能解决你的问题,请参考以下文章