Redis 分布式锁 (欢迎吐槽)
来源:互联网 发布:java判断是否有双引号 编辑:程序博客网 时间:2024/06/04 23:20
** * 采用分布式锁进行 * * */@Servicepublic class DistributedLock { private final static Logger LOGGER = LoggerFactory.getLogger(DistributedLock.class); public final static Long TIMEOUT=Const.DL_TIMEOUT; @Resource private DealWithByRedis dealWithByRedis; /** * 获取锁操作 * * @return */ public boolean getLock(String LOCK_KEY) { boolean flag = false; // 默认没有获得锁/** * 循环获取值 */ while (!flag) { flag = dealWithByRedis.setnx( LOCK_KEY, String.valueOf(System.currentTimeMillis() + TIMEOUT + 1)); if (flag) { // 已经获取了这个锁 然后跳出循环// flag = true;//LOGGER.info("********获取分布式锁********"); break; } String rtTimestamp = dealWithByRedis.get(LOCK_KEY); if (rtTimestamp != null && !"".equals(rtTimestamp.trim())) { // 判断是否不为空// 从redis获取的时间戳 Long rtLongTimestamp = Long.valueOf(rtTimestamp);// 当前的时间戳 Long rtCurrentTimestamp = System.currentTimeMillis(); if (rtLongTimestamp < rtCurrentTimestamp) { // 查看LOCK_KEY这个KEY是否过期// 如果过期,则 String rtTimestamp2 = dealWithByRedis.getSet( LOCK_KEY, String.valueOf(System.currentTimeMillis() + TIMEOUT + 1)); // 调用getset方法获取之前的时间戳 if (rtTimestamp2 != null && rtTimestamp.equals(rtTimestamp2)) { // 如果刚获取的时间戳和之前获取的时间戳一样的话,说明没有其他线程在占用这个锁,则此线程可以获取这个锁. flag = true; // 获取锁标记//return flag; break; }// else if (rtTimestamp2 != null// && rtTimestamp.equals(rtTimestamp2)) {//// 如果不一样的话,则说明已经有其他线程占用了这个锁. } }/** * 暂停100ms,重新循环 */ try { Thread.sleep(100); } catch (InterruptedException e) { System.out.println(" e=" + e.getCause()); } } return flag; } /** * 释放锁操作 */ public void releaseLock(String KEY) { dealWithByRedis.del(KEY); }}
阅读全文
0 0
- Redis 分布式锁 (欢迎吐槽)
- 基于Redis实现分布式锁(上)
- 基于Redis实现分布式锁(下)
- redis实战教程(一)-分布式锁
- 基于redis 实现分布式锁(二)
- redis分布式锁redisson(下)
- Redis实现分布式锁
- Redis 分布式锁实现
- Redis 分布式锁实现
- redis 分布式锁
- redis分布式锁
- Redis实现分布式锁
- Redis分布式锁思考
- redis实现分布式锁
- Redis实现分布式锁
- Redis分布式锁
- redis分布式锁
- maven + redis + 分布式锁
- java-----分支.循环
- Reinforcement Learning 的核心基础概念及实现
- 一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
- HashTable
- 123. Best Time to Buy and Sell Stock III
- Redis 分布式锁 (欢迎吐槽)
- Android源码解析之应用程序在新的进程中启动新的Activity的方法和过程分析
- rabbitmq的用户管理
- chrome密码自动填写表单底色变黄
- 利用Math对象,获取数组的最大值最小值,获取随机数
- 根据输入的数量生成符合EXCEL列标的数组
- mysql断电后启动失败数据库表损坏解决
- Java加载图片
- 10进制转16进制