参考:
https://www.jianshu.com/p/79f2e1d9568c
工具类:
import org.apache.log4j.Logger; import redis.clients.jedis.Jedis; import com.common.common.RedisCacheUtil; /** * 使用Redis实现的分布式锁 */ public class RedisLock{ static Logger logger = Logger.getLogger(RedisLock.class); private String lockKey; private boolean owner = false; private boolean waiting = false; private int defaltTimeoutMsecs = 60*1000;//锁等待超时时间,以毫秒为单位 private int defaultExpireMsecs = 60*1000;//锁持有超时时间,以毫秒为单位 private boolean expired = false; private boolean locked = false; private Jedis jedis = null; public RedisLock(Jedis jedis, String lockKey) { this.jedis = jedis; this.lockKey = lockKey; } /** * 获取分布式锁 * * @return true if lock is acquired, false acquire timeouted * @throws InterruptedException * in case of thread interruption */ public boolean acquire() throws InterruptedException { if(jedis == null){ return false; } Long startTime = System.currentTimeMillis(); int timeout = defaltTimeoutMsecs; while (timeout >= 0) { long expires = System.currentTimeMillis() + defaultExpireMsecs + 1; String expiresStr = String.valueOf(expires); //锁到期时间 if (jedis.setnx(lockKey, expiresStr) == 1) { // lock acquired locked = true; logger.debug("获取分布式锁成功1,锁key:" + lockKey + ",耗时:" + (System.currentTimeMillis()-startTime)); return true; } String currentValueStr = jedis.get(lockKey); //redis里的时间 if (currentValueStr != null && Long.parseLong(currentValueStr) < System.currentTimeMillis()) { //判断是否为空,不为空的情况下,如果被其他线程设置了值,则第二个条件判断是过不去的 // lock is expired String oldValueStr = jedis.getSet(lockKey, expiresStr); //获取上一个锁到期时间,并设置现在的锁到期时间, //只有一个线程才能获取上一个线上的设置时间,因为jedis.getSet是同步的 if (oldValueStr != null && oldValueStr.equals(currentValueStr)) { //如过这个时候,多个线程恰好都到了这里,但是只有一个线程的设置值和当前值相同,他才有权利获取锁 // lock acquired locked = true; logger.debug("获取分布式锁成功2,锁key:" + lockKey + ",耗时:" + (System.currentTimeMillis()-startTime)); return true; } } timeout -= 100; Thread.sleep(100); logger.debug("等待获取分布式锁,等待时间:" + (defaltTimeoutMsecs-timeout)); } logger.info("获取分布式锁失败,锁key:" + lockKey + ",耗时:" + (System.currentTimeMillis()-startTime)); return false; } /** * 释放分布式锁 */ public void release(){ if(locked){ jedis.del(lockKey); logger.info("释放分布式锁成功,锁key:" + lockKey); } } }
使用:
//锁定 RedisLock redisLock = new RedisLock(RedisCacheUtil.getResource(),"redis-lock-key"); boolean ac = false; try { ac = redisLock.acquire(); } catch (Exception e1) { // TODO Auto-generated catch block logger.error("code redis lock error"); return 0L; } if(ac){ // 从数据库中取数据。放缓存 redisLock.release(); }else { //没有取到锁,说明有进程正往缓存中写数据。 先休眠1秒,再取。 try { Thread.sleep(1000); } catch (InterruptedException e) { logger.error("thread sleep eror"); } }
..
相关推荐
Redis分布式锁----乐观锁的实现,以秒杀系统为例.rar
现在很多项目单机版已经不满足了,分布式变得越受欢迎,同时也带来很多问题,分布式锁也变得没那么容易实现,分享一个redis分布式锁工具类,里面的加锁采用lua脚本(脚本比较简单,采用java代码实现,无须外部调用...
SpringBoot基于redis的分布式锁,有word使用文档,根据文档配置即可使用
本资源为一步一步实现redis分布式锁的demo,利用redis实现高可用的分布式锁,规避各种坑、坑、坑!
tomcat-redis-session-manager-master为tomcat集群分布式session分享功能,详细信息见http://blog.csdn.net/fengshizty?viewmode=list对应内容
redlock-py, 在 python 中,Redis分布式锁 redlock - python 中的分布式锁这个 python 库实现了基于redis的分布式锁管理器算法( ) 。要创建锁定管理器:dlm = Redlock([{"host":"localhost","port":
Redis分布式锁的try-with-resources实现 一、简介 在当今这个时代,单体应用(standalone)已经很少了,java提供的synchronized已经不能满足需求,大家自然 而然的想到了分布式锁。谈到分布式锁,比较流行的方法有3...
redis分布式锁的工具类,采用的是Lua代码的方式,保证了Java执行方法的原子性。
主要介绍了Java基于redis实现分布式锁代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
redis分布式配置中心-config-center-redis
redis实现分布式锁,自旋式加锁,lua原子性解锁
Redis分布式锁实现Redisson 15问.doc
Scrapy-Redis分布式爬虫与搜索网站构建-搜索引擎论文-图书档案学论文.docxScrapy-Redis分布式爬虫与搜索网站构建-搜索引擎论文-图书档案学论文.docxScrapy-Redis分布式爬虫与搜索网站构建-搜索引擎论文-图书档案学...
用注解实现redis分布式锁,防止短时间内重复请求,尤其对于请求耗时较长的方法,希望对大家有帮助
windows环境 redis服务免安装 附带redis客户端 redis-desktop-manager-0.8.8.384
自己封装redisson方法,同时通过注解的方式加入redis分布式事务锁,可靠。
redis可视化工具redis-desktop-manager-0.8.8.384。。。。
基于redis的分布式锁spring-boot starter组件,使得项目拥有分布式锁能力变得异常简单,支持spring boot,和spirng mvc等spring相关项目
redis分布式锁带方法名和过期时间,如果不传方法名自动获取改方法名做key,使锁的粒度到方法级别,释放锁的时间可以根据自己的需要自定义,默认5s,为了解决超大方法执行时间太长,还没有执行完,锁就被释放掉的问题.
分布式缓存-基于Redis集群解决单机Redis存在的问题。分布式缓存-基于Redis集群解决单机Redis存在的问题。分布式缓存-基于Redis集群解决单机Redis存在的问题。分布式缓存-基于Redis集群解决单机Redis存在的问题。...