首页 > 数据库 >Redis分布式锁

Redis分布式锁

时间:2024-01-15 22:26:35浏览次数:23  
标签:释放 请求 300 Redis 服务器 执行 分布式

初始第一版代码

背景:Redis中stock字段的value设为300

超卖问题:

多个请求(3个)同时调用这个接口,他们查出的stock都是300,都进行减1操作,实际上需要减3得到297,但都是执行300-1记录stock为299。

解决:使用jdk自带的锁,可以使多个请求排队,实现同一时间单个请求执行锁区间的代码。

架构背景:前端部署在nginx,实现负载均衡。请求实现分发到不同的服务器上。不同服务器,有着各自独立的jvm,jdk。

像synchronize,retreentlock是进程级别的,只能在当前进程内部有效。

问题:jvm提供的锁,集群情况下,这个是不能控制并发超卖问题的。

解决:使用Redis的setnx命令,实现分布式锁。

Redis执行请求命令时,是串行执行的。会进行排队。

setnx:有无存在此key,无则设置vlaue,有则不做操作。锁的效果,去处理并发资源问题。

代码实现:

多个请求同时调用接口,利用Redis接收all,实现一个请求setnx成功--锁住资源(商品),正常执行减商品逻辑,其他请求进行错误提示返回。

问题:执行后续减库存的请求,在后续逻辑都会有出现异常的可能,一旦过程出现异常,则导致后续无法执行释放锁,锁得不到释放,后续出现的请求无法正常拿到商品资源锁。

解决:加try,finally,释放锁放入finally。无论抛什么异常,都必须把锁释放掉。

问题:执行到一半,服务器宕机,不能执行到释放锁。

解决:加过期时间。

问题:执行完锁资源,服务器宕机了,锁得不到释放。

解决:将锁资源、设置过期时间设为原子操作,这样无论发生什么,只要设置锁,就会有锁释放的时候。

 

标签:释放,请求,300,Redis,服务器,执行,分布式
From: https://www.cnblogs.com/fengok/p/17965336

相关文章

  • Jmeter如何分布式执行脚本?
    Jmeter分布式执行原理:JMeter分布式执行时,选择其中一台作为调度机(master),其他机器作为执行机(slave);master会在本地编辑好jmx压测脚本,执行时,master将jmx脚本发送至slave上,slaver执行时不需要启动jmeter,只需要把jmeter-sever.bat文件打开以非GUI形式执行;slave执行完毕后将结果回传给......
  • Redis - Sorted Set Use Cases
         ......
  • Redis - Set Use Cases
          ......
  • 配置redisTemplate序列化,解决乱码与反序列化失败
    /***@projectName:MultiModuleDemo*@package:com.example.config*@className:RedisConfig*@description:TODO(配置RedisTemplate序列化)*@date:2023/12/1821:08*@version:1.0*/@ConfigurationpublicclassRedisConfig{@BeanpublicRedi......
  • Redis - Design 2
                            ......
  • 如果redis没有设置expire,他是否默认永不过期
    如果redis没有设置expire,他是否默认永不过期?默认是的通过EXPIREkeyseconds命令来设置数据的过期时间。返回1表明设置成功,返回0表明key不存在或者不能成功设置过期时间。在key上设置了过期时间后key将在指定的秒数后被自动删除。被指定了过期时间的key在Redis中被称为是不稳定......
  • 分布式系统和微服务的关系
     分布式系统和微服务的关系   分布式系统    分布式系统是由多台计算机组成的系统,这些计算机通过网络进行通信和协作,共同完成一个或多个共享目标。在分布式系统中,各个计算机节点可以分布在不同的地理位置,它们通过消息传递或共享存储等方式进行通信。分布......
  • Redis 做缓存常见的几个问题总结
     1.数据一致性我们知道,Redis主要是用来做缓存使用,只要使用到缓存,无论是本地内存做缓存还是使用Redis做缓存,那么就会存在数据同步的问题。一般情况下,我们都是先读缓存数据,缓存数据有,则立即返回结果;如果没有数据,则从数据库读数据,并且把读到的数据同步到缓存里,提供下次读请......
  • 精确掌控并发:滑动时间窗口算法在分布式环境下并发流量控制的设计与实现
    这是《百图解码支付系统设计与实现》专栏系列文章中的第(15)篇,也是流量控制系列的第(2)篇。点击上方关注,深入了解支付系统的方方面面。上一篇介绍了固定时间窗口算法在支付渠道限流的应用以及使用redis实现的核心代码。本篇重点讲清楚分布式环境下滑动时间窗口算法原理和应用场景,以及使......
  • Redis、Memcache和MongoDB的区别
    Redis、Memcache和MongoDB的区别 >>MemcachedMemcached的优点:Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key、value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右)。适用于最大程度扛量。支持直接配置为sessionhandle。Memcached的......