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实现乐观锁的主要内容,如果未能解决你的问题,请参考以下文章

Redis事务系列之三Redis乐观锁实现秒杀

Redis事务系列之三Redis乐观锁实现秒杀

Redis数据库系列Redis事务乐观锁和分布式锁

Redis事务系列之一Redis事务详解

Redis事务系列之一Redis事务详解

学习笔记——redis事务乐观锁悲观锁