编辑: 苹果的酸 | 2013-04-16 |
1
2 使用 Redis 实现排行榜功能.6 分布式缓存服务 最佳实践 目录2019-03-20 ii 1使用 Redis 实现分布式锁 很多互联网场景(如商品秒杀,论坛回帖盖楼等),需要用加锁的方式,以对某种资 源进行顺序访问控制.本实践介绍如何使用Redis对分布式应用加锁. 本节基于华为云分布式缓存服务实践所编写,用于指导您在以下场景使用DCS实现分 布式锁. 场景介绍 很多互联网场景(如商品秒杀,论坛回帖盖楼等),需要用加锁的方式,以对某种资 源进行顺序访问控制.如果应用服务集群部署,则涉及到对分布式应用加锁. 当前分布式加锁主要有三种方式:(磁盘)数据库、缓存数据库、Zookeeper. 使用DCS服务中Redis类型的缓存实例实现分布式加锁,有几大优势: l 加锁操作简单,使用SET、GET、DEL等几条简单命令即可实现锁的获取和释放. l 性能优越,缓存数据的读写优于磁盘数据库与Zookeeper. l 可靠性强,DCS有主备和集群实例类型,避免单点故障. 加锁实现 以下代码实现仅展示使用DCS服务进行加锁访问的便捷性.具体技术实现需要考虑死 锁、锁的检查等情况,这里不做详细说明. package dcsDemo01;
import java.util.UUID;
import redis.clients.jedis.Jedis;
public class DistributedLock { private final String host = 192.168.0.220 ;
private final int port = 6379;
private static final String SUCCESS = OK ;
private static final String SET_IF_NOT_EXIST = NX ;
private static final String EXPIRE_TIME = PX ;
分布式缓存服务 最佳实践
1 使用 Redis 实现分布式锁 2019-03-20
1 public DistributedLock(){} /* * @param lockName 锁名 * @param timeout 获取锁的超时时间 * @param lockTimeout 锁的有效时间 * @return 锁的标识 */ public String getLockWithTimeout(String lockName, long timeout, long lockTimeout) { String ret = null;
Jedis jedisClient = new Jedis(host, port);
try { String authMsg = jedisClient.auth( if (!SUCCESS.equals(authMsg)) { System.out.println( AUTH FAILED: + authMsg);
} String identifier = UUID.randomUUID().toString();
String lockKey = DLock: + lockName;
long end = System.currentTimeMillis() + timeout;
while(System.currentTimeMillis() <
end) { String result = jedisClient.set(lockKey, identifier, SET_IF_NOT_EXIST, EXPIRE_TIME, lockTimeout);
if(SUCCESS.equals(result)) { ret = identifier;
break;
} try { Thread.sleep(2);
} catch (InterruptedException e) { Thread.currentThread().interrupt();
} } } catch (Exception e) { e.printStackTrace();
}finally { jedisClient.quit();
jedisClient.close();
} return ret;
} /* * @param lockName 锁名 * @param identifier 锁的标识 */ public void releaseLock(String lockName, String identifier) { Jedis jedisClient = new Jedis(host, port);
try { String authMsg = jedisClient.auth( if (!SUCCESS.equals(authMsg)) { System.out.println( AUTH FAILED: + authMsg);
} String lockKey = DLock: + lockName;
if(identifier.equals(jedisClient.get(lockKey))) { jedisClient.del(lockKey);
} } catch (Exception e) { e.printStackTrace();
}finally { jedisClient.quit();
分布式缓存服务 最佳实践
1 使用 Redis 实现分布式锁 2019-03-20
2 jedisClient.close();
} } } 测试代码 假设20个线程对10台mate10手机进行抢购: package dcsDemo01;
import java.util.UUID;
public class CaseTest { public static void main(String[] args) { ServiceOrder service = new ServiceOrder();