当前位置: 首页 > 知识库问答 >
问题:

Spring-Data-Redis带有Jedis PutifAstant用于分布式锁-不正确行为

海鸣
2023-03-14

我在使用Spring Data Redis创建分布式锁时遇到了一些问题。为此,使用CacheManager中的putifAstant方法。

从高层的角度来看,操作如下所示:

if (manager.putIfAbsent(parameters) == null) {
   executeOperation();
}

Spring实现的代码类似于:

if (!connection.setNX(keyBytes, value)) {
   return connection.get(keyBytes);
}
maintainKnownKeys(element, connection);
processKeyExpiration(element, connection);

连接的setNX只是对实际客户端操作的委派。关于该方法的实现,有如下内容:

jedisconverters.toBoolean(jedis.setnx(键,值));

我达到了一种情况,钥匙仍然没有过期。这意味着代码processKeyExpiration(element,connection)没有执行。这意味着在该语句之前没有添加和返回作为键执行的setNx,但实际上是添加了键。

大多数时候一切都很好。密钥序列化程序是stringredisserializer

我使用的是:spring-data-redis 1.8.23。Release jedis 2.9.3

会不会有一些环境问题没有被绝地武士正确对待,或者类似这样的事情?有人达到这样的东西吗?是否有任何可以尝试的修复程序,库更新?

共有1个答案

澹台鸿熙
2023-03-14

所以我对此做了更多的分析。而且,由于PutifAstant的实现方式,如果在多个进程/线程中使用,似乎容易出现争用情况。

这是因为putifA缺席实现的系列命令setNX、expire、get不是事务性的,并且由于适当的条件(长时间的操作,不适当的驱逐逻辑),它很容易出现不正确的行为。

关于如何基于Redis setNX操作进行分布式锁定的类似解释,可以在Redis setNX命令中找到。

总而言之,将PutifAstant与Jedis驱动一起用于分布式锁定可能不是最好的主意,至少在Spring的那个版本上是这样的,因为从2.x.x开始,我知道实现发生了一些变化。

 类似资料:
  • 主要内容:Redis分布式锁介绍,Redis分布式锁命令在分布式系统中,当不同进程或线程一起访问共享资源时,会造成资源争抢,如果不加以控制的话,就会引发程序错乱。此时使用分布式锁能够非常有效的解决这个问题,它采用了一种互斥机制来防止线程或进程间相互干扰,从而保证了数据的一致性。 提示:如果对分布式系统这一概念不清楚,可参考百度百科《分布式系统》,简而言之,它是一种架构、一种模式。 Redis分布式锁介绍 分布式锁并非是 Redis 独有,比如 MySQ

  • 主要内容:写在前面,Redisson实现Redis分布式锁的底层原理写在前面 现在面试,一般都会聊聊分布式系统这块的东西。通常面试官都会从服务框架(Spring Cloud、Dubbo)聊起,一路聊到分布式事务、分布式锁、ZooKeeper等知识。 所以咱们这篇文章就来聊聊分布式锁这块知识,具体的来看看Redis分布式锁的实现原理。 说实话,如果在公司里落地生产环境用分布式锁的时候,一定是会用开源类库的,比如Redis分布式锁,一般就是用Redisson框架就好了

  • 问题内容: 我有一个生成计数器的要求,该计数器将发送到一些api调用。我的应用程序在多个节点上运行,因此我想如何生成唯一计数器。我尝试了以下代码 并通过Task Parallel libray运行测试。当我有边界值时,我看到的是设置了多次0条目 请让我知道我需要做的更正 更新:我的最终逻辑如下 问题答案: 实际上,您的代码在翻转边界附近并不安全,因为您正在执行“获取”,(等待时间和思考),“设置”

  • 背景 在很多互联网产品应用中,有些场景需要加锁处理,比如:秒杀,全局递增ID,楼层生成等等。大部分的解决方案是基于DB实现的,Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对redis的连接并不存在竞争关系。其次Redis提供一些命令SETNX,GETSET,可以方便实现分布式锁机制。 一、使用分布式锁要满足的几个条件: 系统是一个分布式系统(关键是分布式,单机的可以

  • Redis 分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行如果超出了锁的超时时间就会出现问题。 Redis容易产生的几个问题: 锁未被释放 B锁被A锁释放了 数据库事务超时 锁过期了,业务还没执行完 Redis主从复制的问题

  • 本文向大家介绍Redis 分布式锁有什么缺陷?相关面试题,主要包含被问及Redis 分布式锁有什么缺陷?时的应答技巧和注意事项,需要的朋友参考一下 Redis 分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行如果超出了锁的超时时间就会出现问题。