首页 > 数据库 >基于Redis实现分布式锁

基于Redis实现分布式锁

时间:2023-06-19 12:22:38浏览次数:43  
标签:设置 基于 加锁 name Redis key 分布式 客户端

问题描述
服务A和服务B都需要访问共享资源C。这时就会发生共服务A和服务B都去抢占享资源C,为了避免这种抢占,就需要引入分布式锁。

分布式锁介绍
分布式锁:控制分布式系统有序的去对共享资源进行操作,通过互斥来保证数据的一致性。

解决方案

基于redis实现分布式锁
可以使用reids中的setnx(SET if NOT exixts)命令实现。命令会在指定key不存在时去给key设置指定的值,将该值保存在redis中,当有其他服务来访问时由于没有该值就会导致访问失败。

这种加锁的思路是,如果 key 不存在则为 key 设置 value,如果 key 已存在则 SETNX 命令不做任何操作

  • 客户端A请求服务器设置key的值,如果设置成功就表示加锁成功
  • 客户端B也去请求服务器设置key的值,如果返回失败,那么就代表加锁失败
  • 客户端A执行代码完成,删除锁
  • 客户端B在等待一段时间后再去请求设置key的值,设置成功
  • 客户端B执行代码完成,删除锁

代码演示

点击查看代码
/**
 * 加锁
 *
 * @param name,锁名
 * @param expire,过期时间的值
 * @return
 */
public String tryLock(String name, long expire) {
    name = name + "_lock";
    String token = UUID.randomUUID().toString();
    RedisConnectionFactory factory = stringRedisTemplate.getConnectionFactory();
    RedisConnection conn = factory.getConnection();
    try {

        //参考redis命令:
        //set key value [EX seconds] [PX milliseconds] [NX|XX]
        Boolean result = conn.set(
                name.getBytes(),
                token.getBytes(),
                Expiration.from(expire, TimeUnit.MILLISECONDS),
                RedisStringCommands.SetOption.SET_IF_ABSENT //NX
        );
        if (result != null && result)
            return token;
    } finally {
        RedisConnectionUtils.releaseConnection(conn, factory,false);
    }
    return null;
}

标签:设置,基于,加锁,name,Redis,key,分布式,客户端
From: https://www.cnblogs.com/wzh-Official/p/17490847.html

相关文章

  • Redis和Sentinel的安装部署和配置
    为了提升数据检索的效率,有时候我们会在数据库前加一层缓存,Redis就是常见的一种缓存组件,他的全称是REmoteDIctionaryServer,是一个由SalvatoreSanfilippo写的key-value存储系统,而且是可以跨平台的非关系型数据库。Redis是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可......
  • 分布式与集群的概念以及Linux操作系统的概述
    分布式--多台机器,且每台机器上部署不同组件集群--多台机器,且每台机器上部署相同组件而对于大数据的存储而言,单机存储有瓶颈,多台机器进行分布式存储;对于大数据的计算,单机计算能力有限,多台机器进行分布式计算;Linux操作系统确实是没想到想要使用Hadoop还需要重新将Linux的相关知......
  • 基于JAVA丝绸之路文化遗产信息发布和展示系统
    丝绸之路文化遗产是我们传统文化的精髓,是一代又一代传承人努力传承的成果,也是我们年轻人应该继承下去的文化瑰宝。而利用传承网站这样的与时代俱进的高新技术来表现和传承丝绸之路文化遗产这样的传统文化,无疑会让人们更加乐于接受和了解,间接的传播和保护了丝绸之路文化遗产。根据本......
  • 基于JAVA客户关系管理系统
    客户关系管理系统的设计与实现开发对提高期工作的效率和质量具有重要意义。本文从客户关系管理系统的作用出发,详细阐述了客户关系管理系统的开发、操作流程和涉及的一些关键技术。本文首先进行了项目概述,简单介绍了项目开发的背景、目的及意义,明确了客户关系管理系统存在的局限。在......
  • 基于LSTM深度学习网络的疾病发作检测算法matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要长短期记忆网络(LSTM,LongShort-TermMemory)是一种时间循环神经网络,是为了解决一般的RNN(循环神经网络)存在的长期依赖问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。在标准RNN中,这个重复的结......
  • 基于LSTM深度学习网络的疾病发作检测算法matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下: 2.算法涉及理论知识概要      长短期记忆网络(LSTM,LongShort-TermMemory)是一种时间循环神经网络,是为了解决一般的RNN(循环神经网络)存在的长期依赖问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。在标准R......
  • redis基础笔记
    redis1、redis的基本使用学习网址http://redisdoc.com/说明:redis安装好后,有16个数据库,初始默认使用0号库,编号是0...151、添加key-val[set]2、查看当i去哪redis的所有key[keys*]获取key对应的值[getkey]切换redis数据库[seletionindex]如何查看当前数据库的key-va......
  • 安装redis
    Redis是一个开源的高性能键值对存储系统,它支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合。Redis的出色性能和灵活性使其成为许多应用程序的首选数据存储解决方案。在本篇博客中,我们将介绍如何在Linux系统上安装Redis。1.安装依赖项在安装Redis之前,我们需要安装一......
  • GreenPlum分布式集群部署实战
    文章目录前言......
  • 基于SSM的电影院购票系统开源啦
    大家好,今天给大家带来一款SSM的电影院售票系统,非常不错的一个项目,学习javaweb编程必备。下载地址在文末1.SpringMVCSpringMVC属于SpringFrameWork的后续产品,已经融合在SpringWebFlow里面。Spring框架提供了构建Web应用程序的全功能MVC模块。使用Spring可插入的MVC架构......