iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Redis分布式锁的原理是什么和怎么实现
  • 809
分享到

Redis分布式锁的原理是什么和怎么实现

2023-07-04 18:07:06 809人浏览 泡泡鱼
摘要

这篇文章主要介绍了Redis分布式锁的原理是什么和怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redis分布式锁的原理是什么和怎么实现文章都会有所收获,下面我们一起来看看吧。1 一人一单并发安全问题之

这篇文章主要介绍了Redis分布式的原理是什么和怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redis分布式锁的原理是什么和怎么实现文章都会有所收获,下面我们一起来看看吧。

1 一人一单并发安全问题

之前一人一单的业务使用的悲观锁,在分布式系统下,是无法生效的。

理想的情况下是这样的:一个线程成功获取互斥锁,并对查询订单并创建订单,其他线程无法干预。它的原理是会有一个锁监视器,来监听是谁获得了锁。

Redis分布式锁的原理是什么和怎么实现

但是问题就出现在:

分布式系统下,有多个不同的JVM,不同的JVM的环境下,锁监听器是有多个的,就会出现有的线程在别的线程已经拿到锁的情况下,仍然可以获取的到锁。

Redis分布式锁的原理是什么和怎么实现

这个时候,普通的JVM中的锁就已经不管用了,就需要我们利用分布式锁 。

2 分布式锁的原理和实现

2.1 什么是分布式锁

就是可以满足分布式系统或集群模式下多进程可见并且互斥的锁。

它的实现原理就是,不同的JVM环境,都来共用一个锁监视器。这样就不会导致出现多个线程用多把锁的情况了。

Redis分布式锁的原理是什么和怎么实现

特点:

Redis分布式锁的原理是什么和怎么实现

2.2 分布式锁的实现

主要有三种实现方法,我们可以都来进行一个对比。

如下图:

Redis分布式锁的原理是什么和怎么实现

这里主要讲基于Redis的分布式锁的实现 。

实现Reids分布式锁的方法主要就下面两个步骤:

获取锁

获取锁的方法已经是老朋友了,就是使用Redis String类型方法中的setnx方法(互斥性)。但是,为了预防redis服务器宕机的问题,我们要给锁设置一个超时时间,避免出现死锁。(非阻塞)

所以,获取锁的方式可以使用如下代码

SET lock thread1 nx ex 10

lock是锁的key,thread1 是value,nx就是setnx方法,ex就是设置超时时间

释放锁

释放锁就简单了,删除即可。

del lock

代码实现:

需求:定义一个接口,利用Redis实现分布式锁的功能。

Redis分布式锁的原理是什么和怎么实现

代码如下:

接口代码:

package com.hmdp.utils;public interface ILock {        boolean tryLock(long timeoutSec);        void unlock();}

接口实现类:

package com.hmdp.utils;import org.springframework.data.redis.core.StringRedisTemplate;import java.util.concurrent.TimeUnit;public class SimpleRedisLock implements ILock {    //Redis    private StringRedisTemplate stringRedisTemplate;    //业务名称,也就是锁的名称    private String name;    public SimpleRedisLock(StringRedisTemplate stringRedisTemplate, String name) {        this.stringRedisTemplate = stringRedisTemplate;        this.name = name;    }    //key的前缀    private static final String KEY_PREFIX = "lock:";    @Override    public boolean tryLock(long timeoutSec) {        //获取线程id,当作set的value        long threadId = Thread.currentThread().getId();        Boolean success = stringRedisTemplate.opsForValue()                .setIfAbsent(KEY_PREFIX + name, threadId+"", timeoutSec, TimeUnit.SECONDS);        return Boolean.TRUE.equals(success);    }    //释放锁    @Override    public void unlock() {        //删除key        stringRedisTemplate.delete(KEY_PREFIX+name);    }}

业务层获取锁和释放锁(优惠券秒杀业务修改)

package com.hmdp.service.impl;import com.hmdp.dto.Result;import com.hmdp.entity.SeckillVoucher;import com.hmdp.entity.VoucherOrder;import com.hmdp.mapper.VoucherOrderMapper;import com.hmdp.service.ISeckillVoucherService;import com.hmdp.service.IVoucherOrderService;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import com.hmdp.utils.RedisIdWorker;import com.hmdp.utils.SimpleRedisLock;import com.hmdp.utils.UserHolder;import org.springframework.aop.framework.AopContext;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;import java.time.LocalDateTime;@Servicepublic class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, VoucherOrder> implements IVoucherOrderService {     @Resource    private ISeckillVoucherService iSeckillVoucherService;    @Resource    private RedisIdWorker redisIdWorker;    @Resource    private StringRedisTemplate stringRedisTemplate;    @Override    public Result seckillVoucher(Long voucherId) {        //1.获取优惠券信息        SeckillVoucher voucher = iSeckillVoucherService.getById(voucherId);        //2.判断是否已经开始        if (voucher.getBeginTime().isAfter(LocalDateTime.now())){            Result.fail("秒杀尚未开始!");        }        //3.判断是否已经结束        if (voucher.getEndTime().isBefore(LocalDateTime.now())){            Result.fail("秒杀已经结束了!");        }        //4.判断库存是否充足        if (voucher.getStock() < 1) {            Result.fail("库存不充足!");        }        //5.扣减库存        boolean success = iSeckillVoucherService.update()                .setsql("stock = stock-1").eq("voucher_id",voucherId).gt("stock",0)                .update();        if (!success){            Result.fail("库存不充足!");        }        Long userId = UserHolder.getUser().getId();        //1.创建锁对象        SimpleRedisLock lock = new SimpleRedisLock(stringRedisTemplate, "order:" + userId);        //2.尝试获取锁        boolean isLock = lock.tryLock(1200);        if (!isLock){            //获取锁失败            return Result.fail("一个用户只能下一单!");        }        try {            IVoucherOrderService proxy = (IVoucherOrderService) AopContext.currentProxy();            return proxy.createVoucherOrder(voucherId);        } finally {            //释放锁            lock.unlock();        }    }    @Transactional    public Result createVoucherOrder(Long voucherId) {        Long userId = UserHolder.getUser().getId();        //6.根据优惠券id和用户id判断订单是否已经存在        //如果存在,则返回错误信息        int count = query().eq("user_id", userId).eq("voucher_id", voucherId).count();        if (count > 0) {            return Result.fail("用户已经购买!");        }        //7. 创建订单        VoucherOrder voucherOrder = new VoucherOrder();        //7.1添加订单id        Long orderId = redisIdWorker.nextId("order");        voucherOrder.setId(orderId);        //7.2添加用户id        voucherOrder.setUserId(userId);        //7.3添加优惠券id        voucherOrder.setVoucherId(voucherId);        save(voucherOrder);        //8.返回订单id        return Result.ok(orderId);    }}

关于“Redis分布式锁的原理是什么和怎么实现”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Redis分布式锁的原理是什么和怎么实现”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: Redis分布式锁的原理是什么和怎么实现

本文链接: https://www.lsjlt.com/news/346727.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis分布式锁的原理是什么和怎么实现
    这篇文章主要介绍了Redis分布式锁的原理是什么和怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redis分布式锁的原理是什么和怎么实现文章都会有所收获,下面我们一起来看看吧。1 一人一单并发安全问题之...
    99+
    2023-07-04
  • redis实现分布式锁的原理是什么
    这期内容当中小编将会给大家带来有关redis实现分布式锁的原理,以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。分布式锁,是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常...
    99+
    2022-10-18
  • redis分布式锁的实现原理是什么
    这篇文章主要讲解了“redis分布式锁的实现原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“redis分布式锁的实现原理是什么”吧!借助于redis...
    99+
    2022-10-18
  • 分布式锁的原理及Redis怎么实现分布式锁
    这篇文章主要介绍“分布式锁的原理及Redis怎么实现分布式锁”,在日常操作中,相信很多人在分布式锁的原理及Redis怎么实现分布式锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2023-02-02
    redis
  • Redis常见分布锁的原理是什么和怎么实现
    今天小编给大家分享一下Redis常见分布锁的原理是什么和怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我...
    99+
    2022-10-19
  • redis分布式锁的实现原理
    小编给大家分享一下redis分布式锁的实现原理,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!分布式锁其实可以理解为:控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性。举个不太恰当...
    99+
    2022-10-18
  • 分布式锁redis实现方式是什么
    分布式锁的Redis实现方式有两种:基于SETNX命令和基于RedLock算法。1. 基于SETNX命令:使用Redis的SETNX...
    99+
    2023-09-12
    redis
  • Spring Boot 实现Redis分布式锁原理
    目录分布式锁实现引入jar包封装工具类模拟秒杀扣减库存测试代码方案优化问题1:扣减库存逻辑无法保证原子性,问题2:如果加锁失败,则会直接访问,无法重入锁总结分布式锁实现 引入jar包...
    99+
    2022-11-13
    Spring Boot 实现Redis分布式锁 Spring Boot  Redis分布式锁
  • Redis分布式锁怎么实现
    这篇文章给大家分享的是有关Redis分布式锁怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。分布式锁一般有三种实现方式:1、数据库乐观锁;2、基于Redis的分布式锁;3、...
    99+
    2022-10-18
  • Redis怎么实现分布式锁
    这篇文章主要介绍“Redis怎么实现分布式锁”,在日常操作中,相信很多人在Redis怎么实现分布式锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis怎么实现分布式锁”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-02
  • redis分布式锁的实现原理详解
    首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件: 1.互斥性。在任意时刻,只有一个客户端能持有锁。 2.不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有...
    99+
    2022-11-13
  • Redis分布式锁的实现原理介绍
    这篇文章主要讲解了“Redis分布式锁的实现原理介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis分布式锁的实现原理介绍”吧!一、写在前面现在面试,一般都会聊聊分布式系统这块的东西...
    99+
    2023-06-02
  • InterProcessMutex实现zookeeper分布式锁原理是什么
    这篇“InterProcessMutex实现zookeeper分布式锁原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2023-06-29
  • redis分布式锁的实现原理实例分析
    这篇文章主要介绍了redis分布式锁的实现原理实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇redis分布式锁的实现原理实例分析文章都会有所收获,下面我们一起来看看吧。首先,为了确保分布式锁可用,我们至...
    99+
    2023-06-29
  • Redis实现分布式锁的方法是什么
    本篇内容介绍了“Redis实现分布式锁的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在一个分布...
    99+
    2022-10-19
  • Redis分布式锁实现的方法是什么
    本篇内容主要讲解“Redis分布式锁实现的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis分布式锁实现的方法是什么”吧!一、分布式锁是什么分布式锁是 满足分布式系统或集群模式下...
    99+
    2023-07-05
  • redis和zookeeper中怎么实现分布式锁
    redis和zookeeper中怎么实现分布式锁,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。   一、基于redis的分布...
    99+
    2022-10-18
  • 详解Redis分布式锁的原理与实现
    目录前言使用场景为什么要使用分布式锁如何使用分布式锁流程图分布式锁的状态分布式锁的特点分布式锁的实现方式(以redis分布式锁实现为例)总结前言 在单体应用中,如果我们对共享数据不进行加锁操作,会出现数据一致性问题,我们...
    99+
    2022-06-23
    Redis分布式锁使用 Redis 分布式锁
  • spring redis分布式锁怎么实现
    在Spring中实现Redis分布式锁可以使用RedisTemplate来操作Redis进行加锁和解锁。 首先,我们需要定义一个分布...
    99+
    2023-10-27
    spring redis
  • Redis怎么样实现分布式锁
    这篇文章主要介绍了Redis怎么样实现分布式锁,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在一个分布式系统中,会遇到一些需要对多个节点共享的资源加锁的情况,这个时候需要用到...
    99+
    2023-06-21
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作