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

分布式锁实现——Redis

时间:2024-03-10 21:12:27浏览次数:27  
标签:加锁 实现 Redis 阻塞 公平 分布式

分布式锁

image-20240309185439940

分布式锁的视线方式

  • Redis实现分布式锁
  • Zookeeper实现分布式锁
  • MySQL实现分布式锁
  • Etcd实现分布式锁

实现分布式锁注意的点

  • 互斥性
  • 可重入性
  • 锁超时,防死锁
  • 锁释放正确,防误删
  • 阻塞和非阻塞
  • 公平和非公平

Redis 实现分布式锁的特点

  • Redis是高性能的内存数据库,满足高并发的需求
  • Redis支持原子性操作,保证操作的原子性和一致性

使用setnx实现

定义锁的抽象类

image-20240309232705100

定义RedisLock

image-20240309232737319

Service适配代码改造。

image-20240309232756081

# init redis stock
set stock1 6000

存在的问题

  • 互斥性(加锁后,限制保证共享资源正确性)

  • 可重入性(未实现,加锁后再有一个加锁动作的话,会一直等待)

  • 锁超时(未实现)

  • 锁释放正确,防止误删(未实现,不确定持有锁的线程)

  • 阻塞和非阻塞(阻塞)

  • 公平和非公平(实现不了公平)

借助Redisson实现

<!-- 引入 redisson-->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.22.0</version>
</dependency>

改造StockService

image-20240310203502768

标签:加锁,实现,Redis,阻塞,公平,分布式
From: https://www.cnblogs.com/shine-rainbow/p/18064799

相关文章

  • Python简单实现查重
    使用Python实现查重这个作业属于哪个课程软件工程这个作业要求在哪里个人项目这个作业的目标初步认识软件开发流程,独立培养开发能力,熟悉PSP记录开发过程你可以在GitHub上找到本项目并下载额外三种算法代码Slave前言作为开发人员,不幸的是此前未曾接触熟悉过......
  • flnkcdc+datastream实现mysql到mysql数据同步
    一、maven依赖<dependency><groupId>org.apache.flink</groupId><artifactId>flink-clients</artifactId><version>1.18.1</version></dependency><dependency>......
  • java springboot拦截器的实现及用法
     1.前景,有时候我们在不同的地方需要使用用户的信息,我们可以使用threadLocal存储信息,这样我们在在这个线程随时使用用户信息了,不用自己在写一段冗余代码了,这时候使用拦截器就很不错 2.实现1.实现HandlerInterceptor2.重写实现方法  preHandle:在业务处理器处理请......
  • python实现批量运行命令行
    python实现批量运行命令行背景:对于不同参数设置来调用同一个接口,如果手动一条条修改再运行非常慢且容易出错。尤其是这次参数非常多且长。比如之前都是输入nohuppython-uexe.py>>../log/exp3.log2>&1&来运行一次,在exe中会设置参数并调用接口运行preditction_uni(input_f......
  • Redis持久化
    目录RDBAOFRDB和AOF的优缺点Redis持久化方式有两种,RDB和AOFRDBRDB全称RedisDatabaseBackupfile(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。Redis内部由触发RDB的机制,可......
  • 要确保请求在一次会话中被转发到相同的后端服务器上,可以使用 Nginx 的 ip_hash 或 sti
    要确保请求在一次会话中被转发到相同的后端服务器上,可以使用Nginx的ip_hash或sticky模块来实现。ip_hash模块:ip_hash 模块使用客户端IP地址作为哈希键,将同一IP地址的请求始终转发到相同的后端服务器。要启用 ip_hash 模块,只需在Nginx配置文件的 http 块或......
  • 实现一个简单的 std::unique_ptr
    实现一个简单的std::unique_ptr简介std::unique_ptr是一个独占资源所有权的智能指针,通过RAII来自动管理资源的构造和析构。在标准库中,std::unique_ptr的通常实现是具有空基类优化。具体来讲,对于std::unique_ptr的删除器是其类型中的一部分,如果没有空基类优化,那么std::u......
  • 基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
    1.算法运行效果图预览RTL图:   仿真图:   导入到matlab显示效果如下:   2.算法运行软件版本matlab2022a vivado2019.2 3.算法理论概述      在计算机视觉领域,基于肤色模型和中值滤波的手部检测方法是一种常见的初步定位策略。该方法主要分为......
  • Redis 架构深入:主从复制、哨兵到集群
    大家好,我是小康,今天我们来聊下Redis的几种架构模式,包括主从复制、哨兵和集群模式。前言:设想一下,你的咖啡馆在城市中太受欢迎,导致每天都人满为患。为了缓解这种压力,你决定在其他地方开设分店,这样顾客就可以在附近的分店享受咖啡,而不必涌向一个地方,这就好比Redis的主从复制,让......
  • Redis 常见数据类型(对象类型)和应用案列
    前言:每次你在游戏中看到玩家排行榜,或者在音乐应用中浏览热门歌单,有没有想过这个排行榜是如何做到实时更新的?当然,依靠Redis即可做到。在技术领域,我们经常听到「键值存储」这个词。但在Redis的世界里,这只是冰山一角。Redis的对象,不仅仅是简单的数据,它们是为各种任务量身定......