Redis.setIfAbsent分布式锁

Redis中的setIfAbsent方法和execute 此外,在使用时需要注意异常处理,例如,当键已经存在时,该方法不会抛出异常,而是返回。如果键已经存在,它将不执行任何操作。上述方法是 RedisTemplate 中 delete 方法的源码,它就是使用 execute() 来执行具体的删除操作(即调用 connection.del(rawKeys) 方法)。方法是一种原子操作,它的作用是只有在指定的键不存在时才会设置值。其实,在 RedisTemplate 中,其他很多方法均是通过调用 execute() 方法来实现,只是不同的方法实现不同的回调接口。 阅读详情

1.问题简介:当三台机器使用Spring定时器,会同时给消费者发送支付成功的通知。而且会发三次,对商户的影响很大。例如:客户在使用商户的平台去购买票的时候,支付成功发了三次通知,那么就会出票三次。

2.问题解决:使用redis分布式锁,并设置超时时间。当消费者发送通知失败的时候去删除锁,然后重新推送.

3.技术:使用Redis的Spring-data-redis依赖,  TimeUnit的介绍.    

一:Redis简介

      Redis是一款开源的Key-Value数据库,运行在内存中,由C语言编写。企业开发通常采用Redid来实现缓存。同类的产品还有memcache、memcached等。

二:Jedis

       Jedis是Redis官方推出的一款面向Javad的客户端,提供了很多接口供Java语言调用。可以在Redis官网下载,当然还有一些开源爱好者提供的客户端,如Jredis、SRP等等,推荐使用Jedis。

三:Spring-data-redis

        Spring-data-redis是Spring大家族的一部分,提供了在spring应用中通过简单的配置访问redis服务,对redis底层开发包(Jedis,JRedis,an RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅。

四:TimeUnit的介绍

        TimeUnit是JDK封装好的java.uitl.concurrent包下面的一个类,表示给定单元粒度的时间段

五:TimeUnit的作用

       1.时间颗粒度转换
        2.线程延时

六:TimeUnit讲解

        TimeUnit.DAYS //天
        TimeUnit.HOURS //小时
        TimeUnit.MINUTES //分钟
        TimeUnit.SECONDS //秒
        TimeUnit.MILLISECONDS //毫秒
        TimeUnit.MICROSSECONDS //微妙
        TimeUnit.NANOSSECONDS //纳秒

七:TimeUnit中有最全面的转换颗粒度方法,基本所有的都能转换,具体要用的话可以查看他的源码,下面这个方法是把10分钟转换为多少毫米

TimeUnit.MILLISECONDS.convert(10L,TimeUnit.MINUTES);

2.问题解决:

        (1):Spring-data-redis针对Jedis提供了如下功能:

        (2):RedisTemplate中API使用

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>1.8.4.RELEASE</version>
</dependency>

        (3):RedisTemplate的直接方法 

@Autowired
private StringRedisTemplate redisTemplate;
#注释:setIfAbsent 分布式锁 true加锁成 false 失败
Boolean temp = redisTemplate.opsForValue().setIfAbsent(Key, plain);
#注释Key:唯一标识
#注释Plian:存入redis的内容
if (!temp) {
    log.info("加锁失败");
    return false;
}
#注释Expire 过期时间
Boolean expire = redisTemplate.expire(Key, 5, TimeUnit.MINUTES);
#注释删除单个key
redisTemplate.delete(Key);
#注释根据Key获取过期时间
redisTemplate.getExpire(Key);
#注释判断key是否存在
redisTemplate.hasKey(Key);
注:建议使用spring-data-redis 2.1.0版本 举例说明,只需要一行代码,加锁已经设置失效时间(需要和Jedis版本匹配,要不会报错)
Boolean  temp = redisTemplate.opsForValue().setIfAbsent(Key, plain,5, TimeUnit.MINUTES);

 

 

 

 

Redis分布式锁学习 Redis 红锁的名称来源于 Redis 的logo,Redis 的 logo 是一个红色热气球,而红色的热气球上有一把锁的图案,因此这种分布式锁解决方案也被称为"Redlock",中文翻译为"红锁"。redisson在获取锁之后,会开启一个守护线程(看门狗线程),当锁即将过期还没有释放时,不断的延长锁key的生存时间。 阅读详情

相关推荐

redis事务中setIfAbsent无法及时返回true或false,返回null

代码如下,现需要批量处理业务,为了防止一条数据被多次处理,故缓存到redis中。又因可以同时操作多条数据,故考虑用redis事务,当其中一个已被其他人处理中时,之前设置的也全部回滚。但实际过程中 redisOperations.opsForValue().setIfAbsent();并非返回true或false。需要等到exec时才能获取返回值。故一下做法就无效了,需要换一种实现方式。 RedisTemplate redisTemplate = RedisUtils.getRedisTemplate()

weixin_48484941的博客 7689

浅析redis setIfAbsent的用法及在分布式锁上的应用及同步锁的缺陷

浅析redis setIfAbsent的用法及在分布式锁上的应用及同步锁的缺陷

weixin_45979191的博客 1万+

Spring Data Redis实战:用setIfAbsent实现分布式锁的5个坑你踩过吗?

本文深入探讨了使用Spring Data RedissetIfAbsent方法实现分布式锁时常见的5个陷阱,包括锁超时设置、集群环境锁失效、锁误删、锁重入和锁竞争问题。通过实际案例分析和代码示例,提供了针对性的解决方案,帮助开发者避免在Redis分布式锁实现中踩坑。

weixin_29260291的博客 350

redis中的分布式锁(setIfAbsent)(expire)

还是一个同事问的一个问题,然后闲着没事就记录下来了。多人操作同一个保单,会出现数据不一致,所以呢,就准备为此单子加一个锁,所以就有了下面的代码。分享给大家分布式锁的定义大家基本都很了解了,具体就是当需要在分布式环境中保证资源的互斥访问或一致性时,就可以考虑使用分布式锁。但需要注意的是,分布式锁虽然可以解决问题,但也会带来一定的性能开销和复杂度,因此在使用时需要权衡系统的性能和可维护性,以及使用分布式锁所带来的成本和风险。

比起日出,我更喜欢日落。我的意思是比起遇见你,我更喜欢与你终老 1万+

springboot+redis分布式锁(原子性)使用到setIfAbsent()

redis分布式锁

AsherYZHY的博客 1481

利用redissetIfAbsent()方法实现分布式锁

再集群环境中,存在定时任务多次执行,浪费资源,那么如何避免这种情况呢,下面就说明一下如何利用一个注解解决问题,利用切面配合redis可以简单实现分布式锁,解决定时任务重复执行的问题。直接上干货了,感觉不对的朋友勿喷,请划过。这样就可以利用注解的形式实现分布式锁,这样每次需要用的时候直接一个注解就搞定了,避免了每次都要写很长的代码。到此一个自定义注解实现redis分布式锁的代码就完成了,下面就是如何利用这个注解了。

askuld的博客 1万+

RedisForValueService.setIfAbsent()

RedissetIfAbsent方法是实现分布式锁和幂等性控制的核心功能,对应Redis的SETNX命令。该方法通过原子性操作检查Key是否存在并设置值,确保并发安全。典型应用场景包括防止重复提交订单、定时任务去重等。使用时必须设置合理的过期时间以避免死锁,其原子性依赖于Redis单线程执行特性。正确实现应直接使用原生SETNX命令,避免客户端拆分检查与设置操作。超时时间设置需基于业务耗时统计,留出适当冗余,既要防止正常业务被中断,又要确保异常情况下能自动释放锁。

qq_65032048的博客 503

RedisTemplate的setIfAbsent方法在分布式锁中的实战应用

本文深入探讨了RedisTemplate的setIfAbsent方法在分布式锁中的实战应用。通过分析其原子性特性和底层Redis命令,提供了完整的分布式锁实现方案,包括锁续期机制和生产环境中的注意事项,帮助开发者解决高并发场景下的数据一致性问题。

weixin_30335575的博客 100

SpringBoot中的RedisTemplate对象中的setIfAbsent()方法有什么作用?

SpringBoot中的RedisTemplate对象中的setIfAbsent()方法有什么作用?

m0_72926194的博客 2045

常见面试题知识点之:分布式锁

对缓存查询数据库的代码进行加锁,有两种方式: 本地锁 进程锁 具有局限性,只能在同一个项目中生效,不能控制另一个项目中的方式。保证同一时刻只有一个线程可访问共享资源 例如:对查询数据库的方法加锁,同一时间就只能有一个人查询数据库。 分布式锁 分布式锁是指分布式环境下,系统部署在多个机器中,实现多进程分布式互斥的一种锁。为了保证多个进程能看到锁,锁被存在公共存储(比如 Redis、Memcache、数据库等三方存储中),以实现多个进程并发访问同一个临界资源,同一时刻只有一个进程可访问共享资源,确保数据的一致

软件开发实战项目分享 8353

redis记录——分布式锁解析

场景:减库存 知识点: setIfAbsent():设置值之前判断key是否存在,setIfAbsent(key,vlue,时长,时间类型) *setIfAbsent()是redis(setnx)在java中的用法 思路: 1.生成一个库存锁,把存库数量stock和库存的锁result同时放在redis中,更改存库数量时,先判断库存锁是否有效和存在。 2.如果库存锁存在返回一个错误提示 3.如果存库锁不存在,拿取库存数量执行具体代码逻辑 4.执行完毕后删除锁 5.整个业...

hou_tao_gu的博客 3921

setIfAbsent(K key, V value)

setIfAbsent(K key, V value) 如果键不存在则新增,存在则不改变已经有的值。 如果为空就set值,并返回1 如果存在(不为空)不进行操作,并返回0

Wow 五六 !!! 的博客 9718

介绍redis分布式锁

介绍redis分布式锁

无边热爱,来日方长 2512

java中io流(文件流)的使用(二)mmap零拷贝等

java中io流(文件流)的使用、资源加载笔记(二)mmap零拷贝等

enthan809882的博客 11万+

redis方法 setIfAbsent

【代码】redis方法 setIfAbsent

taiguolaotu的博客 5353

Redis实现分布式锁

使用Redis的SETNX指令实现分布式锁,以及使用Redisson框架提供的分布式锁

fourforfo的博客 4635

redisTemplate 使用 setIfAbsent 返回 null 问题原理及解决办法

redisTemplate 使用 setIfAbsent 返回 null 问题原理及解决办法

zh123456_789的博客 6724
上一篇: PostgreSQL PgSql序列
下一篇: Liunx 批量去调用接口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值