iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Redis分布式锁一定要避开的两个坑是什么
  • 561
分享到

Redis分布式锁一定要避开的两个坑是什么

2023-07-06 02:07:08 561人浏览 八月长安
摘要

这篇文章主要介绍了Redis分布式锁一定要避开的两个坑是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redis分布式锁一定要避开的两个坑是什么文章都会有所收获,下面我们一起来看看吧。1 第一个坑:错误释放

这篇文章主要介绍了Redis分布式一定要避开的两个坑是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redis分布式锁一定要避开的两个坑是什么文章都会有所收获,下面我们一起来看看吧。

1 第一个坑:错误释放锁时机

1.1. 发现问题

分析以下代码存在什么问题:

// 分布式锁服务public interface RedisLockService {    // 获取锁    public boolean getLock(String key);    // 释放锁    public boolean releaseLock(String key);}// 业务服务public class BizService {    @Resource    private RedisLockService redisLockService;    public void bizMethod(String bizId) {        try {            // 获取锁            if(redisLockService.getLock(bizId)) {                // 业务重复校验                if(!bizValidate(bizId)) {                    throw new BizException(ErrorBizCode.REPEATED);                }                // 执行业务                return doBusiness();            }            // 获取锁失败            throw new BizException(ErrorBizCode.GET_LOCK_ERROR);        } finally {            // 释放锁            redisLockService.releaseLock(bizId);        }    }}

上述代码看似没问题,实则隐藏大问题。问题在于释放锁时没有校验当前线程是否拿到锁:

  • 线程1和线程2同一时刻访问业务方法

  • 线程2获取锁成功,进行业务处理

  • 线程1没有获取到锁,但是释放锁成功

  • 此时有线程3尝试获取锁成功,但是线程2业务没有处理完,所以线程3不会导致业务重复异常

  • 最终导致线程2和线程3重复执行业务

1.2 解决问题

解决方案是在确认获取锁成功后才允许释放锁:

public class BizService {    @Resource    private RedisLockService redisLockService;    public void bizMethod(String bizId) {        boolean getLockSuccess = false;        try {            // 尝试获取锁            getLockSuccess = redisLockService.getLock(bizId);            // 获取锁成功            if(getLockSuccess) {                // 业务重复校验                if(!bizValidate(bizId)) {                    throw new BizException(ErrorBizCode.REPEATED);                }                // 执行业务                return doBusiness();            }            // 获取锁失败            throw new BizException(ErrorBizCode.GET_LOCK_ERROR);        } finally {            // 获取锁成功才允许释放锁            if(getLockSuccess) {                redisLockService.releaseLock(bizId);            }        }    }}

2 第二个坑:缓存失效问题

第二个问题是Redis还存在内存清理机制,可能会导致分布式锁失效。

2.1 过期清理机制

(1) 定期删除

Redis定时检查哪些key已经过期,发现过期则删除

(2) 惰性删除

如果key非常多,定期删除会非常消耗资源,所以引入惰性删除策略

如果Redis访问key时发现已经过期则直接删除

2.2 内存回收机制

当内存不足时Redis会选择一些元素进行删除:

no-enviction

禁止驱逐数据,新写入操作会报错

volatile-lru

从已设置过期时间的数据集选择最近最少使用的数据淘汰

volatile-ttl

从已设置过期时间的数据集选择将要过期的数据淘汰

volatile-random

从已设置过期时间的数据集选择任意的数据淘汰

allkeys-lru

从数据集选择最近最少使用的数据淘汰

allkeys-random

从数据集选择任意的数据淘汰

至少存在两种场景导致分布式锁失效问题:

  • 场景一:Redis内存不足进行内存回收,使用allkeys-lru或者allkeys-random回收策略导致锁失效

  • 场景二:线程获取分布式锁成功,但处理业务时间过长,此时锁到期被定时清理,导致其它线程获取锁成功并重复执行业务

2.3 乐观锁

通用方案是在数据库层保护,例如库存扣减业务在数据库层用乐观锁。

udpate Goods set stock = stock - #{acquire} where sku_id = #{skuId} and stock - #{acquire} >= 0

关于“Redis分布式锁一定要避开的两个坑是什么”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Redis分布式锁一定要避开的两个坑是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: Redis分布式锁一定要避开的两个坑是什么

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

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

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

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

下载Word文档
猜你喜欢
  • Redis分布式锁一定要避开的两个坑是什么
    这篇文章主要介绍了Redis分布式锁一定要避开的两个坑是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redis分布式锁一定要避开的两个坑是什么文章都会有所收获,下面我们一起来看看吧。1 第一个坑:错误释放...
    99+
    2023-07-06
  • Redis分布式锁一定要避开的两个坑
    目录1 第一个坑:错误释放锁时机1.1. 发现问题1.2 解决问题2 第二个坑:缓存失效问题2.1 过期清理机制2.2 内存回收机制2.3 乐观锁1 第一个坑:错误释放锁时机 1.1. 发现问题 分析以下代码存在什么问题...
    99+
    2023-04-13
    Redis分布式锁避坑 Redis分布式锁
  • 分布式锁redis实现方式是什么
    分布式锁的Redis实现方式有两种:基于SETNX命令和基于RedLock算法。1. 基于SETNX命令:使用Redis的SETNX...
    99+
    2023-09-12
    redis
  • Redis分布式锁的优缺点是什么
    Redis分布式锁的优点包括: 高性能:Redis作为内存数据库,具有高性能的特点,能够快速地处理锁的请求。 可靠性:Red...
    99+
    2024-05-07
    Redis
  • Redis分布式锁进化史是什么
    这篇文章主要介绍“Redis分布式锁进化史是什么”,在日常操作中,相信很多人在Redis分布式锁进化史是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis分布式锁进化史是什么”的疑惑有所帮助!接下来...
    99+
    2023-06-02
  • 分布式锁要选择Zookeeper而不是Redis的原因是什么
    这篇文章给大家分享的是有关分布式锁要选择Zookeeper而不是Redis的原因是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在分布式的应用中,为了防止单点故障,保障高可用,通常会采用主从结构,当主节点挂掉...
    99+
    2023-06-15
  • redis分布式锁的实现原理是什么
    这篇文章主要讲解了“redis分布式锁的实现原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“redis分布式锁的实现原理是什么”吧!借助于redis...
    99+
    2024-04-02
  • Redis实现分布式锁的方法是什么
    本篇内容介绍了“Redis实现分布式锁的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在一个分布...
    99+
    2024-04-02
  • Redis分布式锁实现的方法是什么
    本篇内容主要讲解“Redis分布式锁实现的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis分布式锁实现的方法是什么”吧!一、分布式锁是什么分布式锁是 满足分布式系统或集群模式下...
    99+
    2023-07-05
  • Redis的分布式锁应该怎么打开
    这篇文章主要讲解了“Redis的分布式锁应该怎么打开”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis的分布式锁应该怎么打开”吧!要求基于Redis实...
    99+
    2024-04-02
  • redis实现分布式重入锁的方法是什么
    这篇文章主要为大家分析了redis实现分布式重入锁的方法是什么的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“redis实现...
    99+
    2024-04-02
  • Redis实现分布式锁的五种方法是什么
    本文小编为大家详细介绍“Redis实现分布式锁的五种方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Redis实现分布式锁的五种方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起...
    99+
    2024-04-02
  • Redis分布式锁的原理是什么和怎么实现
    这篇文章主要介绍了Redis分布式锁的原理是什么和怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redis分布式锁的原理是什么和怎么实现文章都会有所收获,下面我们一起来看看吧。1 一人一单并发安全问题之...
    99+
    2023-07-04
  • 如何使用Redis实现一个安全可靠的分布式锁
    这篇文章给大家分享的是有关如何使用Redis实现一个安全可靠的分布式锁的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。并发场景下多个进程或线程共享资源的读写,需要保证对资源的访问互...
    99+
    2024-04-02
  • Redis分布式锁怎么实现及应用场景是什么
    本篇内容介绍了“Redis分布式锁怎么实现及应用场景是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!引言锁是开发过程中十分常见的工具,你...
    99+
    2023-06-29
  • redis分布式应用的方法是什么
    Redis分布式应用的方法包括:1. 数据分片(Sharding):将数据分散存储在多个Redis节点上,每个节点负责存储部分数据。...
    99+
    2023-08-30
    redis
  • mysql分布式锁实现的方法是什么
    MySQL本身并没有提供分布式锁的实现方法,但可以借助MySQL的特性和其他技术来实现分布式锁。以下是几种常见的实现方法:1. 基于...
    99+
    2023-10-09
    mysql
  • 分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
    在分布式的应用中,为了防止单点故障,保障高可用,通常会采用主从结构,当主节点挂掉后,从节点可以代替主节点提供服务。 Redis通过复制 + sentinel哨兵来实现主从模式。 Zo...
    99+
    2024-04-02
  • Redis常见分布锁的原理是什么和怎么实现
    今天小编给大家分享一下Redis常见分布锁的原理是什么和怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我...
    99+
    2024-04-02
  • Redis一定要设置密码的原理是什么
    这篇文章主要讲解了“Redis一定要设置密码的原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis一定要设置密码的原理是什么”吧!为什么redis要设置密码?内网环境可以不设置...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作