分布式锁的实现(基于Redis)
参考:http://www.jb51.net/article/75439.htm
http://www.linuxidc.com/Linux/2015-01/111827.htm
http://www.tuicool.com/articles/6juqmm7
方式一: 基于第三方类库 redssion
1.安装redis
安装redssion的锁服务队redis的版本有要求,要求必须高于2.6版本。关于redis的安装,请参考redis安装。
2.redssion库
redssion的库添加的pom文件中去。
<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>2.1.0</version></dependency>
3.测试例子
Config config = new Config(); config.useSingleServer().setAddress("ipaddress:6379"); Redisson redisson = Redisson.create(config); for(int i=0;i<5;i++){ RLock lock = redisson.getLock("testLock"); lock.lock(10, TimeUnit.SECONDS);//10s超时 logger.info("the lock client id is client{}",i); Thread.sleep(1000); logger.info("client{} unlock",i); lock.unlock(); }
4.参考
方式二: 自定义代码实现
) { ) { &&lastLockTime > System.currentTimeMillis()){ ||lastLockTime < System.currentTimeMillis()) { jedisProxy.del(key)); } } catch (Exception e) { logger.error("从redis获取定时任务锁错误,key="+String.format(LOCK, id), e); return false; } } return true; } /** * 释放锁 * @param id */ public void unLock(String id) { //这里的Jedis实际上是个代理。代理类JedisCallback,JedisFactoryBean Jedis jedisProxy = JedisProxy.create(); String key = String.format(LOCK, id); jedisProxy.del(key); }}
JedisProxy类
/** * Jedis代理 */@Componentpublic class JedisProxy implements ApplicationContextAware { private static volatile ApplicationContext ac; /** * 创建Jedis 代理 * * @return */ public static Jedis create() { return ac.getBean(Jedis.class); } @Override public void setApplicationContext(ApplicationContext applicationContext) { if (ac != null) { return; } synchronized (JedisProxy.class) { if (ac != null) { return; } ac = applicationContext; } }}