redis 分布式锁

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

分布式锁实现,redis实现。


setnx命令:setnx key value。

结果:如果redis里这个key,则返回0,如果redis里没这个key,则返回value是1。


getset命令:

如果redis里有这个key,则返回旧数据的value。如果redis里没有这个key就直接插入进去了。


/**

* 获取redis对应的爬虫key的锁

* @param lockKey

* @return

*/

public boolean obtainLock(String lockKey) {

   // 1. 通过SETNX试图获取一个lock

   boolean obtainLockSuccess = false;

   boolean lock = false;

   //默认为当前时间加6000毫秒,一分钟,根据需求更改

   long value  = System.currentTimeMillis() + 6000 + 1;   

   //分布式锁开始

   lock = setNX(lockKey, String.valueOf(value));   

   if (lock) {//如果等于true,说明setNX成功,不懂的话可以自己登陆redis客户端试一试setnx命令     

   obtainLockSuccess = true;

   }else {

       long oldValue = Long.valueOf(getLock(lockKey));

       //超时

       if (oldValue < System.currentTimeMillis()) {

       String getValue = getSet(lockKey, String.valueOf(value));

           // 获取锁成功,什么意思?是因为需要判断最开始设值进去的value和getset得道的value是否是一样的,不一样啊,说明这期间

       //有人getset了,你得到的是别得值,说明获取这个锁失败,就是并发的有人比你快一步,自己这块需要拿笔在本上写一写。

           if (Long.valueOf(getValue) == oldValue) {

           obtainLockSuccess = true;

           }else { //获取锁失败

           obtainLockSuccess = false;

           }

       }else { //未超时,则直接返回失败,现在还要人用到这个key的锁   

       obtainLockSuccess = false;

       }

   }        

   return obtainLockSuccess;      

}

 

/**

* 释放锁,也就是删除锁

* @param lockKey

*/

public void releaseLock(String lockKey) {

long current = System.currentTimeMillis();

// 避免删除非自己获取得到的锁

   if (current < Long.valueOf(valueOperations.get(lockKey)))

   redisTemplate.delete(lockKey);      

}

/**

* 获取这个Key的value,把这个value当入key,再放入redis队列里,String类型

* @param key

* @param value

* @return

*/

public boolean setNX(String key, String value) {

return valueOperations.setIfAbsent(key, value);

}

/**

* 获取setNx放入里的Key

* @param key

* @return

*/

public String getLock(String key) {

return valueOperations.get(key);

}

/**

* 这个getSet是redis的特性,这个是先设置新的值覆盖,返回给原来老的值

* @param key

* @param value

* @return

*/

public String getSet(String key, String value) {

return valueOperations.getAndSet(key, value);

本文转自 豆芽菜橙 51CTO博客,原文链接:http://blog.51cto.com/shangdc/1914852


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
NoSQL 算法 安全
Redlock 算法-主从redis分布式锁主节点宕机锁丢失的问题
Redlock 算法-主从redis分布式锁主节点宕机锁丢失的问题
155 0
|
1月前
|
NoSQL 关系型数据库 MySQL
分布式锁(redis/mysql)
分布式锁(redis/mysql)
59 1
|
30天前
|
NoSQL Java Redis
如何通俗易懂的理解Redis分布式锁
在多线程并发的情况下,我们如何保证一个代码块在同一时间只能由一个线程访问呢?
38 2
|
1月前
|
人工智能 监控 NoSQL
【万字长文 一文搞定】Redis:从新手村到大师殿堂的奥德赛之旅 9种实现分布式锁的全技术指南
【万字长文 一文搞定】Redis:从新手村到大师殿堂的奥德赛之旅 9种实现分布式锁的全技术指南
83 4
|
1月前
|
消息中间件 存储 NoSQL
【Redis项目实战】使用Springcloud整合Redis分布式锁+RabbitMQ技术实现高并发预约管理处理系统
【Redis项目实战】使用Springcloud整合Redis分布式锁+RabbitMQ技术实现高并发预约管理处理系统
|
1月前
|
NoSQL API Redis
Redis分布式锁实现的三个核心
Redis分布式锁实现的三个核心
|
1月前
|
NoSQL Java Redis
Redis分布式锁和Java锁的区别
Redis分布式锁和Java锁的主要区别在于它们的适用范围和实现机制。
41 2
|
机器学习/深度学习 缓存 NoSQL
|
缓存 NoSQL Java
为什么分布式一定要有redis?
1、为什么使用redis 分析:博主觉得在项目中使用redis,主要是从两个角度去考虑:性能和并发。当然,redis还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中间件(如zookpeer等)代替,并不是非要使用redis。
1332 0
|
16天前
|
NoSQL Linux Redis
06- 你们使用Redis是单点还是集群 ? 哪种集群 ?
**Redis配置:** 使用哨兵集群,结构为1主2从,加上3个哨兵节点,总计分布在3台Linux服务器上,提供高可用性。
230 0

热门文章

最新文章