场景介绍
很多互联网场景(如商品秒杀,论坛回帖盖楼等),需要用加锁的方式,以对某种资源进行顺序访问控制。如果应用服务集群部署,则涉及到对分布式应用加锁。当前分布式加锁主要有三种方式:(磁盘)数据库、缓存数据库、Zookeeper。接下里让我们一起看看加锁实践过程。
加锁实现
1 package dcsDemo01;
2
3 import java.util.UUID;
4
5 import redis.clients.jedis.Jedis;
6
7 public class DistributedLock {
8 private final String host = "192.168.0.220";
9 private final int port = 6379;
10
11 private static final String SUCCESS = "OK";
12 private static final String SET_IF_NOT_EXIST = "NX";
13 private static final String EXPIRE_TIME = "PX";
14
15 public DistributedLock(){}
16
17 /*
18 * @param lockName 锁名
19 * @param timeout 获取锁的超时时间
20 * @param lockTimeout 锁的有效时间
21 * @return 锁的标识
22 */
23 public String getLockWithTimeout(String lockName, long timeout, long lockTimeout) {
24 String ret = null;
25 Jedis jedisClient = new Jedis(host, port);
26
27 try {
28 String authMsg = jedisClient.auth("Demo@123");
29 if (!SUCCESS.equals(authMsg)) {
30 System.out.println("AUTH FAILED: " + authMsg);
31 }
32
33 String identifier = UUID.randomUUID().toString();
34 String lockKey = "DLock:" + lockName;
35 long end = System.currentTimeMillis() + timeout;
36
37 while(System.currentTimeMillis() < end) {
38 String result = jedisClient.set(lockKey, identifier, SET_IF_NOT_EXIST, EXPIRE_TIME, lockTimeout);
39