redis 分布式多线程细粒度锁_Cons_Step_By_Step的博客-程序员秘密

技术标签: redis  

@Autowired
private StringRedisTemplate redisTemplate;

加锁

/**
 *
 * @param key
 * @param value 一般用 当前时间+超时时间
 * @return
 */
public boolean lock(String key,String value){

    if(redisTemplate.opsForValue().setIfAbsent(key,value)){
        //没有线程获得这个key的锁
        return true;
    }

    // 即使锁被占用,再判断锁是否过期
    String currentValue = redisTemplate.opsForValue().get(key);
    if(!StringUtils.isEmpty(currentValue) &&
            Long.parseLong(currentValue) < System.currentTimeMillis()){
        // 锁过期,再判断是否有两个线程都走到了这里,还是有锁的原子性问题.

        //利用了Redis操作的原子性。该方法是原子操作。所以后一个线程执行该方法是在前一个线程已经设置好value并且返回给oldValue之后
        // 这样第一个进来的线程是可以返回true。后面的都不可以。
        // 所以理论上value值是不能有重复的。
        String oldValue = redisTemplate.opsForValue().getAndSet(key,value);
        if(!StringUtils.isEmpty(oldValue) && oldValue.equals(value)){
            return true;
        }
    }
    return false;
}

解锁

public void unlock(String key,String value){
    String currentValue = redisTemplate.opsForValue().get(key);
    if(!StringUtils.isEmpty(currentValue) && currentValue.equals(value)){
        redisTemplate.opsForValue().getOperations().delete(key);
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cons_step_by_step/article/details/78359613

智能推荐

K8S service调试的几种场景_qq_道可道的博客-程序员秘密

不暴露service访问service进行调试,端口转发至本地kubectl port-forward service/frontend-antd-svc 5000:8080集群8080端口转发本地5000端口UI版端口转发至本地,更方便管理和人性化kube forwarder本地运行service调试,且应用在集群中使用本地服务的场景,双向代理telepresence...

00065.Oracle表空间只读_nauwzj的博客-程序员秘密

SQL> alter tablespace test_tab read only; Tablespace altered. SQL> alter tablespace test_tab read write; Tablespace altered.

TCP连接的四次挥手全过程_四次挥手过程[email protected]的博客-程序员秘密

TCP通过四次挥手来释放连接四次挥手的过程如下:第一次挥手:客户端向服务器发送一个 FIN 数据包(FIN = 1,seq = u)主动断开连接,报文中会指定一个序列号。告诉服务器:我要跟你断开连接了,不会再给你发数据了;客户端此时还是可以接收数据的,如果一直没有收到被动连接方的确认包,则可以重新发送这个包。此时客户端处于 FIN_WAIT1 状态。第二次挥手:服务器收到 FIN 数据包之后,向客户端发送确认包(ACK = 1,ack = u + 1),把客户端的序列号值 + 1 作

Qt/PyQt多线程_pyqt 多线程通信_YanHua_jake的博客-程序员秘密

Qt提供了跨平台的线程支持,其中包括线程类、线程安全的事件发布机制以及支持线程间信号槽连接的特性。这些功能可以帮助开发者轻松地开发可移植的多线程Qt应用程序,并有效利用多处理器系统的资源。此外,多线程编程可以提升应用程序的性能和用户体验,因为耗时操作可以在后台线程中执行,避免主线程阻塞。在现代应用程序开发中,多线程编程变得越来越重要。Qt的线程类基于POSIX线程库,可以轻松地创建、启动和管理线程,并提供同步和互斥机制,避免线程之间的竞争和死锁问题。

android&nbsp;关机闹钟_andorid 关机闹铃 ioctl代码实现_shangyaowei的博客-程序员秘密

新项目的手机需要实现关机状态下的闹钟,早在刚开始接触 android 的时候都在想为什么 android不支持关机状态下的一些功能呢?像充电或者闹钟什么的,虽然每个平台的驱动不一样但上层应用是可以提供统一接口的呀,果然在 4.0的时候支持关机充电了,关机闹钟仍然不在默认支持中。市场上的很多品牌手机也都不支持这个功能,让很多用惯了Feature Phone 以及担心辐射的用户都不习惯。这次做关

使用WeTest压测大师进行API/CGI压测_zdj1414的博客-程序员秘密

压测的API有三条:1)Get VersionAPI:http://xxxx/get_versionResponse:     {&quot;ret&quot;:0,&quot;version&quot;:&quot;1.0.7&quot;}2)LoginAPI:http://xxxx/loginRequest:     { &quot;openid&quot;: &quot;6282c0d2016e05f26130007969ef8f2f&quot;, &quot;access_token&quot;:

随便推点

C1认证考试-任务01_唐小艾的博客-程序员秘密

数据编码像素任务像素任务网址前16bits表示画布的长和高,然后根据输入的0或1分别表示黑或白,以此来设计自己想要显示的图案。自测题1) 110101010001转十六进制是多少?有什么最快的计算方法能得到结果?答:(110101010001)B = (D51)H,快速计算,将二进制数从右往左每4个成有一组,每四位得到一个16进制数,就可以快速转换成16进制。本题,1101 0101 0001,对应16进制分别是,D 5 1,故得到答案。2) 101011.101011对应的十进制是多少?

pandas小技巧------------df.sample随机抽样_df 随机抽样提效_cc抱富的博客-程序员秘密

https://www.cnblogs.com/webRobot/p/11484648.html1、功能说明有时候我们只需要数据集中的一部分,并不需要全部的数据。这个时候我们就要对数据集进行随机的抽样。pandas中自带有抽样的方法。函数名及功能DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)[source]输入参数说明参数名称 参数说明 举例说明

程序员一年稳赚50w,却被群嘲只造改bug!TA说:2020年我的愿望是........_csdn业界要闻的博客-程序员秘密

最近,笔者在经常后台看到小伙伴留言在问,想学Python,但不知道如何入门?其实对于这个问题,真是仁者见仁智者见智。有句老话说的好“一千个读者,就有一千个哈姆雷特”不过对于此疑惑,笔者就...

stm32 nvic的理解_Wu_2014的博客-程序员秘密

学了stm32的nvic,中断嵌套,拿来与大家分享分享!因为stm32有43个中断源,当同时用到多个中断时,就要指定其中断的优先级了。 nvic即是中断向量的控制!由SCB->AIRCR寄存器控制,SCB->AIRCR中目前只用到4位,也就是最高能有16级中断嵌套,如果全使用的话可以达到256级   (1);选用优先级分组(实际就是选几位用于主优先级几位用于辅优先级)

Linux-命令-pwd_adouwen3320的博客-程序员秘密

命令: pwd [options]参数:-L: 显示逻辑路径-P: 显示物理路径举例:如/etc/init.d, init.d 是link 所以.当 pwd -L 时,显示 /etc/init.d当pwd -P 时,显示实际物理路径/etc/rc.d/init.d转载于:https://www.cnblogs.com/mirrorlake/p/734541...

[PTA]7-54 求阶乘序列前N项和 (15分)_pta求阶乘序列前n项和_heavenFrank的博客-程序员秘密

本题要求编写程序,计算序列 1!+2!+3!+⋯ 的前N项之和。输入格式:输入在一行中给出一个不超过12的正整数N。输出格式:在一行中输出整数结果。输入样例:5输出样例:153#include&lt;stdio.h&gt;int main(){ int n,i,x=1,sum=0; scanf("%d",&amp;n); for(i=1;i&lt;=n...