首页 > 数据库 >如何使用Redis实现分布式锁

如何使用Redis实现分布式锁

时间:2024-07-17 13:54:00浏览次数:8  
标签:currentValue String Redis value 如何 key 分布式

在分布式系统中,保证多个进程或线程对共享资源的同步访问是一个常见问题。锁是一种常用的同步机制,但在单机环境中常用的锁机制在分布式系统中往往不再适用。Redis,作为一种高性能的键值存储系统,提供了实现分布式锁的可能。本文将介绍如何使用Redis实现分布式锁,并通过Java代码示例展示其实现过程。

分布式锁的挑战
在单机系统中,锁的实现相对简单,可以使用语言内置的同步机制。但在分布式系统中,不同的服务实例可能运行在不同的服务器上,传统的锁机制无法跨服务实例同步。因此,需要一种跨服务实例的锁机制,这就是分布式锁。

Redis分布式锁的优势
高性能:Redis单线程的特性使其在处理锁请求时具有高性能。
简单易用:通过简单的命令即可实现锁的获取和释放。
可重入:支持同一线程多次获取同一把锁。
实现Redis分布式锁
以下是一个使用Java和Spring框架实现Redis分布式锁的示例:

  1. 引入依赖
    首先,确保你的项目中已经添加了Spring Data Redis和Apache Commons Lang的依赖。以下是Maven依赖配置示例:

xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>
  1. Redis分布式锁工具类
    java
package com.csot.kms.common.util;

import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.StringRedisTemplate;

public class RedisLockUtil {

    private static StringRedisTemplate redisTemplate = (StringRedisTemplate) SpringUtils.getBean("stringRedisTemplate");

    /**
     * 加锁
     *
     * @param key   锁的标识
     * @param value 当前时间+超时时间
     * @return      是否成功获取锁
     */
    public boolean lock(String key, String value) {
        if (redisTemplate.opsForValue().setIfAbsent(key, value)) {
            return true;
        }
        String currentValue = String.valueOf(redisTemplate.opsForValue().get(key));
        // 如果锁过期  解决死锁
        if (StringUtils.isNotEmpty(currentValue) && Long.parseLong(currentValue) < System.currentTimeMillis()) {
            String oldValue = String.valueOf(redisTemplate.opsForValue().getAndSet(key, value));
            if (!StringUtils.isEmpty(oldValue) && oldValue.equals(currentValue)) {
                return true;
            }
        }

        return false;
    }

    /**
     * 解锁
     *
     * @param key   锁的标识
     * @param value 锁的值
     */
    public void unlock(String key, String value) {
        try {
            String currentValue = String.valueOf(redisTemplate.opsForValue().get(key));
            if (!StringUtils.isEmpty(currentValue) && currentValue.equals(value)) {
                redisTemplate.opsForValue().getOperations().delete(key);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  1. 使用Redis分布式锁
    在需要同步的代码块中,使用 RedisLockUtil 类来获取和释放锁:

java

public class SomeService {

    private RedisLockUtil redisLockUtil = new RedisLockUtil();

    public void someMethod() {
        String lockKey = "someLock";
        long expireTime = 30000; // 锁的超时时间,30秒
        long currentTime = System.currentTimeMillis();
        String value = currentTime + "," + expireTime;

        boolean isLock = redisLockUtil.lock(lockKey, value);
        if (isLock) {
            try {
                // 执行业务逻辑
            } finally {
                redisLockUtil.unlock(lockKey, value);
            }
        } else {
            // 处理未能获取锁的情况
        }
    }
}

总结
Redis分布式锁是一种简单而有效的在分布式系统中同步访问共享资源的方法。通过本文的示例代码,你可以在自己的项目中实现Redis分布式锁,从而确保分布式系统中的线程安全。

标签:currentValue,String,Redis,value,如何,key,分布式
From: https://www.cnblogs.com/dj699/p/18307143

相关文章

  • 使用Spring Cloud Sleuth实现分布式系统的链路追踪
    使用SpringCloudSleuth实现分布式系统的链路追踪大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!一、引言在微服务架构中,应用程序被分解成多个服务,每个服务都可以独立部署和扩展。这种架构虽然带来了很多好处,但也增加了调试和监控的复杂性。链路追踪(Tr......
  • 如何在Java中实现事件驱动的微服务架构
    如何在Java中实现事件驱动的微服务架构大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!一、引言事件驱动架构(EDA)是一种基于事件进行通信和操作的架构模式,适用于高度分布式和松耦合的系统。微服务架构结合事件驱动可以提升系统的可扩展性和响应性。本文将......
  • 如何在Oracle数据库中查询表和字段说明
    在Oracle数据库中,了解表和字段的说明对于数据库管理员和开发人员来说非常重要。这些信息有助于理解数据结构和设计意图。本文将介绍如何使用SQL查询语句获取Oracle数据库中所有表的名称及其说明,以及每个表中字段的名称、类型和说明。查询表说明在Oracle中,表的说明存储在ALL_TAB......
  • 利用Redis Stream实现一个可靠的消息队列
    RedisStreams简介RedisStreams是Redis5.0引入的一种新数据结构,专门用于处理日志和消息流数据。它结合了多种数据结构的优点,提供了高效的消息存储和消费机制。RedisStreams可以用于实时数据处理、事件驱动的系统、日志聚合和消息队列等场景。主要特点持久化:redis的p......
  • SAP中MIR4使用的BAPI是什么,如何使用?
    在SAP系统中,MIR4是一个用于采购发票校验的事务代码,它允许用户处理与采购订单相关的发票。关于MIR4使用的BAPI(BusinessApplicationProgrammingInterface,业务应用程序编程接口),并没有一个特定的、直接对应MIR4的BAPI名称,因为BAPI通常是针对SAP系统中特定的业务对象或功能而......
  • SAP中MR8M调用的BAPI是什么,如何使用?
    在SAP系统中,针对MR8M(通常与采购发票冲销相关)的操作,并没有直接命名为BAPI_MR8M的标准BAPI。然而,对于发票冲销这一功能,SAP提供了BAPI_INCOMINGINVOICE_CANCEL这一BAPI,它可以用于冲销传入的发票。BAPI_INCOMINGINVOICE_CANCEL的使用BAPI_INCOMINGINVOICE_CANCELBAPI是用于......
  • 服务注册/发现-Eureka-微服务核心组件【分布式微服务笔记02】
    服务注册/发现-Eureka-微服务核心组件【分布式微服务笔记02】服务注册/发现-Eureka目前主流的服务注册&发现的组件是Nacos,但是Eureka作为一个老牌经典的服务注册&发现技术还是有必要学习一下,原因:一些早期的分布式微服务项目使用的是Eureka,在工作中,完全有可能遇到.后......
  • 硬盘如何维修数据恢复
    一、硬盘维修方法检查硬件连接:确保硬盘与计算机的连接线(如SATA线、电源线)插紧且没有损坏。尝试更换连接线或使用主板上的其他接口,以排除连接线或接口故障的可能性。使用系统自带工具:在Windows系统中,可以使用“磁盘检查”工具(chkdsk)来检测和修复硬盘上的文件系统错误。打开命......
  • Office文件打不开如何处理
        在快节奏的现代办公环境中,MicrosoftOffice无疑是我们的得力助手,无论是起草报告、整理数据还是制作演示文稿,它都在背后默默支撑着我们的工作与学习。然而,当有一天,你突然发现重要的Office文档无法打开,屏幕上的错误信息仿佛一道无形的墙,阻隔了你与辛勤工作成果之间的......
  • Windows 10如何使用文件检查器工具修复受损文件
        在Windows10的日常使用中,系统文件的意外损坏或丢失可能会导致一系列问题,从程序崩溃到系统不稳定,严重时甚至影响计算机的正常启动。幸运的是,Windows10内置了一个强大的工具——系统文件检查器(SFC),专门用于扫描和修复系统文件的完整性。本篇文章将带领你深入了解如......