我是靠谱客的博主 端庄墨镜,最近开发中收集的这篇文章主要介绍Redis.setIfAbsent分布式锁,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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.setIfAbsent分布式锁的全部内容,希望文章能够帮你解决Redis.setIfAbsent分布式锁所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部