用redis实现分布式锁
2018-01-12 18:48
197 查看
Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系。redis的SETNX命令可以方便的实现分布式锁。
maven依赖:
初始化jedis
测试:
这只是一个简单的小例子,curator(基于zookeeper)已经封装好了,可以直接使用
http://blog.csdn.net/zyj_2012/article/details/78842908 href="http://blog.csdn.net/zyj_2012/article/details/78842908" target=_blank>点击打开链接
maven依赖:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.4.RELEASE</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>
初始化jedis
@Configuration public class JedisConfig { @Bean @Order(1) public JedisPoolConfig jedisPoolConfig() { JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxIdle(10); poolConfig.setMaxTotal(30); return poolConfig; } @Bean @Order(2) public JedisPool jedisPool(JedisPoolConfig jedisPoolConfig) { return new JedisPool(jedisPoolConfig, "192.168.1.81", 4000 6379, 3000, "password"); } @Bean @Order(3) public JedisLock jedisLock(JedisPool jedisPool){ JedisLock jedisLock = new JedisLock(); jedisLock.setJedisPool(jedisPool); return jedisLock; } }
public class JedisLock { private static final String key = "LOCK"; private static final String SUCCESS = "OK"; JedisPool jedisPool; public String getLock(int lockTimout){ String value = null; try { Jedis jedis = jedisPool.getResource(); long end = System.currentTimeMillis() + lockTimout; Random random = new Random(); value = UUID.randomUUID().toString(); while (System.currentTimeMillis()<end){ String response = jedis.set(key, value, "NX", "EX", lockTimout); if (SUCCESS.equals(response)){ //成功获取锁,用完记得释放 System.out.println("成功获得锁 response:"+response+",value:"+value); return value; } TimeUnit.MILLISECONDS.sleep(Math.max(20, random.nextInt(100))); } }catch (Exception e){ e.printStackTrace(); } System.out.println("超时未获得锁。。。。"); return null; } public boolean releaseLock(String value){ try { Jedis jedis = jedisPool.getResource(); jedis.watch(key); if (StringUtils.pathEquals(value,jedis.get(key))){ Transaction transaction = jedis.multi(); transaction.del(key); List<Object> list = transaction.exec(); jedis.unwatch(); if (null != list){ return true; } } }catch (Exception e){ e.printStackTrace(); } return false; } /** * Setter method for property <tt>jedisPool</tt>. * * @param jedisPool value to be assigned to property jedisPool */ public void setJedisPool(JedisPool jedisPool) { this.jedisPool = jedisPool; } }
测试:
public class JedisTest { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(JedisConfig.class); JedisLock jedisLock = (JedisLock) context.getBean("jedisLock"); String lock = jedisLock.getLock(10000); System.out.println(lock); String lock1 = jedisLock.getLock(1000); System.out.println(lock1); boolean b = jedisLock.releaseLock(lock); System.out.println("释放锁:"+b); } }
这只是一个简单的小例子,curator(基于zookeeper)已经封装好了,可以直接使用
http://blog.csdn.net/zyj_2012/article/details/78842908 href="http://blog.csdn.net/zyj_2012/article/details/78842908" target=_blank>点击打开链接
相关文章推荐
- 分布式环境下限流方案的实现redis RateLimiter Guava,Token Bucket, Leaky Bucket
- Redis分布式锁的正确实现方式(Java版)
- 分布式集群Session共享 简单多tomcat8+redis的session共享实现
- php+redis+lua实现分布式锁
- 基于Redis实现分布式锁
- python实现redis分布式锁
- 分布式中使用Redis实现Session共享(二)
- Redis 分布式锁的正确实现方式( Java 版 )
- 用Redis实现分布式锁 与 实现任务队列
- 使用 Redis 实现分布式锁
- Java 实现基于Redis的分布式可重入锁
- Java实现基于Redis的分布式锁
- 用redis实现分布式锁
- Redis实现分布式锁 php
- 用redis实现分布式锁
- 基于Redis实现分布式锁
- scrapy-redis实现爬虫分布式爬取分析与实现
- Redis 分布式锁的正确实现方式( Java 版 )
- 用Redis实现分布式锁
- Redis分布式锁的实现