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();
   }
}

四、结尾

好了,本章就讲到这里,下一章我们用乐观锁实现秒杀系统。

另外大家帮忙关注一下我的微信公众号,关注后有大量课程相赠
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序编织梦想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值