iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >详解如何在springcloud分布式系统中实现分布式锁
  • 929
分享到

详解如何在springcloud分布式系统中实现分布式锁

2024-04-02 19:04:59 929人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录一、简介 二、Redis命令介绍 三、实现思路 四、编码实现 五、注意点 六、参考资料 最近在看分布式锁的资料,看了 Josial L的《Redis in Action》的分布式

最近在看分布式的资料,看了 Josial L的《Redis in Action》的分布式锁的章节。实现思路是利用SpringCloud结合redis实现分布式锁。

注意:这篇文章有问题,请看这一篇https://www.jb51.net/article/228819.htm

一、简介

一般来说,对数据进行加锁时,程序先通过acquire获取锁来对数据进行排他访问,然后对数据进行一些列的操作,最后需要释放锁。Redis 本身用 watch命令进行了加锁,这个锁是乐观锁。使用 watch命令对于频繁访问的键会引起性能的问题。

二、redis命令介绍

SETNX命令(SET if Not eXists)
当且仅当 key 不存在,将 key 的值设为 value ,并返回1;若给定的 key 已经存在,则 SETNX 不做任何动作,并返回0。

SETEX命令
设置超时时间

GET命令
返回 key 所关联的字符串值,如果 key 不存在那么返回特殊值 nil 。

DEL命令
删除给定的一个或多个 key ,不存在的 key 会被忽略。

三、实现思路

由于redis的setnx命令天生就适合用来实现锁的功能,这个命令只有在键不存在的情况下为键设置值。获取锁之后,其他程序再设置值就会失败,即获取不到锁。获取锁失败。只需不断的尝试获取锁,直到成功获取锁,或者到设置的超时时间为止。

另外为了防治死锁,即某个程序获取锁之后,程序出错,没有释放,其他程序无法获取锁,从而导致整个分布式系统无法获取锁而导致一系列问题,甚至导致系统无法正常运行。这时需要给锁设置一个超时时间,即setex命令,锁超时后,从而其它程序就可以获取锁了。

四、编码实现

本文采用SpringBoot结合redis 取实现的,所以你需要装一个redis。

首先引入创建springboot工程,引入redis 。


<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
   <scope>test</scope>
  </dependency>

  <!-- 开启WEB-->
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  
  <!-- redis-->
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
  </dependency>

2.创建一个锁类



public class Lock {
    private String name;
    private String value;

    public Lock(String name, String value) {
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public String getValue() {
        return value;
    }
}

3.创建分布式锁的具体方法,思路已经说清楚了,代码注释也写好了,就不讲解了。


import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;


@Component
public class DistributedLockHandler {

    private static final Logger logger = LoggerFactory.getLogger(DistributedLockHandler.class);
    private final static long LOCK_EXPIRE = 30 * 1000L;//单个业务持有锁的时间30s,防止死锁
    private final static long LOCK_TRY_INTERVAL = 30L;//默认30ms尝试一次
    private final static long LOCK_TRY_TIMEOUT = 20 * 1000L;//默认尝试20s

    @Autowired
    private StringRedisTemplate template;

    
    public boolean tryLock(Lock lock) {
        return getLock(lock, LOCK_TRY_TIMEOUT, LOCK_TRY_INTERVAL, LOCK_EXPIRE);
    }

    
    public boolean tryLock(Lock lock, long timeout) {
        return getLock(lock, timeout, LOCK_TRY_INTERVAL, LOCK_EXPIRE);
    }

    
    public boolean tryLock(Lock lock, long timeout, long tryInterval) {
        return getLock(lock, timeout, tryInterval, LOCK_EXPIRE);
    }

    
    public boolean tryLock(Lock lock, long timeout, long tryInterval, long lockExpireTime) {
        return getLock(lock, timeout, tryInterval, lockExpireTime);
    }


    
    public boolean getLock(Lock lock, long timeout, long tryInterval, long lockExpireTime) {
        try {
            if (StringUtils.isEmpty(lock.getName()) || StringUtils.isEmpty(lock.getValue())) {
                return false;
            }
            long startTime = System.currentTimeMillis();
            do{
                if (!template.hasKey(lock.getName())) {
                    ValueOperations<String, String> ops = template.opsForValue();
                    ops.set(lock.getName(), lock.getValue(), lockExpireTime, TimeUnit.MILLISECONDS);
                    return true;
                } else {//存在锁
                    logger.debug("lock is exist!!!");
                }
                if (System.currentTimeMillis() - startTime > timeout) {//尝试超过了设定值之后直接跳出循环
                    return false;
                }
                Thread.sleep(tryInterval);
            }
            while (template.hasKey(lock.getName())) ;
        } catch (InterruptedException e) {
            logger.error(e.getMessage());
            return false;
        }
        return false;
    }

    
    public void releaseLock(Lock lock) {
        if (!StringUtils.isEmpty(lock.getName())) {
            template.delete(lock.getName());
        }
    }
}

4.用法:


@Autowired
DistributedLockHandler distributedLockHandler;
Lock lock=new Lock("lockk","sssssssss);
if(distributedLockHandler.tryLock(lock){
 doSomething();
 distributedLockHandler.releaseLock();
}

五、注意点

在使用全局锁时为了防止死锁采用 setex命令,这种命令需要根据具体的业务具体设置锁的超时时间。另外一个就是锁的粒度性。比如在redis实战中有个案列,为了实现买卖市场交易的功能,把整个交易市场都锁住了,导致了性能不足的情况,改进方案只对买卖的商品进行加锁而不是整个市场。

六、参考资料

Josiah.L 《reids in action》

基于Redis实现分布式锁

到此这篇关于详解如何在sprinGCloud分布式系统中实现分布式锁的文章就介绍到这了,更多相关springcloud 分布式锁内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解如何在springcloud分布式系统中实现分布式锁

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

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

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

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

下载Word文档
猜你喜欢
  • 详解如何在springcloud分布式系统中实现分布式锁
    目录一、简介 二、redis命令介绍 三、实现思路 四、编码实现 五、注意点 六、参考资料 最近在看分布式锁的资料,看了 Josial L的《Redis in Action》的分布式...
    99+
    2024-04-02
  • 怎么在springcloud分布式系统中实现分布式锁
    本篇内容介绍了“怎么在springcloud分布式系统中实现分布式锁”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、简介一般来说,对数据进...
    99+
    2023-06-25
  • springcloud如何用Redlock实现分布式锁
    目录一、redlock简介 二、怎么用java使用 redlock 三、参考资料 之前写过一篇文章《如何在springcloud分布式系统中实现分布式锁? 》,由于自己仅仅是阅读了相...
    99+
    2024-04-02
  • Java分布式系统中的对象数组:如何实现分布式锁?
    随着互联网技术的快速发展,分布式系统已经成为了一个越来越受欢迎的选择。在分布式系统中,多个服务器之间需要协同工作,同时涉及到数据的读写操作,这就需要对分布式锁的实现进行深入的研究。 在Java分布式系统中,对象数组是一种常用的数据结构。那...
    99+
    2023-09-08
    分布式 对象 数组
  • 分布式系统中使用 Golang 函数实现分布式锁
    golang 函数可用于实现分布式锁,协调多个进程对共享资源的访问。这些函数通过利用共享存储(如 redis)来实现锁机制,确保在任何时刻只有一个进程能访问资源。 基于 Golang ...
    99+
    2024-04-20
    golang 分布式系统 redis git
  • Redis如何实现分布式锁详解
    目录一、前言二、实现原理2.1 加锁2.2 解锁三、通过RedisTemplate实现分布式锁四、通过Redisson实现一、前言 在Java的并发编程中,我们通过锁,来避免由于竞争...
    99+
    2024-04-02
  • SpringCloud 分布式锁的多种实现
    目录前言1. 分布式锁概述2. 基于数据库的分布式锁2.1 数据库悲观锁实现的分布式锁2.2 数据库乐观锁实现的分布式锁3.基于Redis实现的分布式锁3.1 setnx + exp...
    99+
    2024-04-02
  • Redis实现分布式锁详解
    目录一、前言为什么需要分布式锁?二、基于Redis实现分布式锁为什么redis可以实现分布式锁?如何实现?锁的获取锁的释放三、如何避免死锁?锁的过期时间如何设置?避免死锁锁过期处理释放其他服务的锁如何处理呢?那么redi...
    99+
    2023-04-09
    Redis实现分布式锁 Redis分布式锁
  • 如何在Redis中实现分布式锁
    在Redis中实现分布式锁可以通过以下方式: 使用SETNX命令:在Redis中可以使用SETNX命令(SET if Not e...
    99+
    2024-04-09
    Redis
  • 如何在 Python 中实现分布式系统?
    Python 是一种功能强大的编程语言,它可以用于构建各种类型的应用程序。其中,分布式系统是 Python 中非常重要的一个应用场景。本文将介绍如何在 Python 中实现分布式系统,并演示一些代码。 什么是分布式系统? 分布式系统是指由多...
    99+
    2023-10-24
    分布式 面试 path
  • 如何理解分布式系统下基于Redis的分布式锁
    这篇文章主要介绍“如何理解分布式系统下基于Redis的分布式锁”,在日常操作中,相信很多人在如何理解分布式系统下基于Redis的分布式锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • springcloud怎么用Redlock实现分布式锁
    这篇文章主要讲解了“springcloud怎么用Redlock实现分布式锁”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springcloud怎么用Redlock实现分布式锁”吧!一、red...
    99+
    2023-06-25
  • Redis中如何实现分布式锁
    这篇文章给大家介绍Redis中如何实现分布式锁,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Redis要实现分布式锁,以下条件应该得到满足互斥性 在任意时刻,只有一个客户端能持有锁。不能死锁 客户端...
    99+
    2023-06-16
  • redis实现分布式锁实例详解
    目录1、业务场景引入2、基础环境准备2.1.准备库存数据库2.2.创建SpringBoot工程,pom.xml中导入依赖,请注意版本。2.3.application.properti...
    99+
    2024-04-02
  • Zookeeper如何实现分布式锁
    这篇“Zookeeper如何实现分布式锁”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Zookeeper如何实现分布式锁”文...
    99+
    2023-06-27
  • Java分布式锁如何实现
    这篇“Java分布式锁如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java分布式锁如何实现”文章吧。一、分布式锁介...
    99+
    2023-07-05
  • Redis分布式锁如何实现
    这篇文章将为大家详细讲解有关Redis分布式锁如何实现,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是分布式锁?要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、...
    99+
    2024-04-02
  • Redis如何实现分布式锁
    目录一、前言二、正文今天我们来聊一聊分布式锁的那些事。 相信大家对锁已经不陌生了,我们在多线程环境中,如果需要对同一个资源进行操作,为了避免数据不一致,我们需要在操作共享资源之前进行...
    99+
    2024-04-02
  • zookeeper分布式锁如何实现
    这篇文章主要介绍“zookeeper分布式锁如何实现”,在日常操作中,相信很多人在zookeeper分布式锁如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”zookeeper分布式锁如何实现”的疑惑有所...
    99+
    2023-06-27
  • PHP分布式异步编程:如何在Linux系统中实现分布式计算?
    PHP是一种流行的服务器端编程语言,广泛应用于Web开发。但是,PHP也可以用于分布式计算,通过将计算任务分配给多台计算机来加速计算。本文将介绍如何在Linux系统中使用PHP进行分布式异步编程。 一、什么是分布式计算? 分布式计算是一种...
    99+
    2023-11-07
    分布式 异步编程 linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作