分布式其实就是多进程的程序,当多个进程访问一个资源,会造成问题:
1.资源共享的竞争问题
2.数据的安全性
分布式锁的解决方案:
1.怎么去获取锁
数据库
zookeeper
redis
2.怎么释放锁
package org.maple.lock; import org.maple.redis.RedisManager; import redis.clients.jedis.Jedis; import redis.clients.jedis.Transaction; import java.util.List; import java.util.UUID; /** * @author mapleins * @Date 2018-12-25 12:25 * @Desc Redis实现分布式锁 **/ public class RedisLock { public String getLock(String key, int timeout) { try { Jedis jedis = RedisManager.getJedis(); String value = UUID.randomUUID().toString(); long end = System.currentTimeMillis() + timeout; while (System.currentTimeMillis() < end) { if (jedis.setnx(key, value) == 1) { jedis.expire(key,timeout); //锁设置成功,redis操作成功 return value; } //如果在setnx,redis宕机,那么就不会设置过期时间,此处加一个判断,防止永不过期 if(jedis.ttl(key)==-1){ jedis.expire(key,timeout); } Thread.sleep(1000); } } catch (Exception e) { e.printStackTrace(); } return null; } public boolean releaseLock(String key, String value) { try { Jedis jedis = RedisManager.getJedis(); while (true) { jedis.watch(key); if (value.equals(jedis.get(key))) { //确保当前获得锁的线程和redis中存的是同一把锁 Transaction transaction = jedis.multi(); transaction.del(key); List<Object> list = transaction.exec(); if(list==null){ continue; } return true; } break; } } catch (Exception e) { e.printStackTrace(); } return false; } }