添加snowflake的datacenterId和workerId的ID分配策略,利用redis的原子锁特性

This commit is contained in:
wangkang
2017-09-04 20:17:49 +08:00
parent 2b566caee5
commit 256a4b9849
@@ -158,12 +158,12 @@ public class IdWorkerInit {
StringRedisSerializer serializer = new StringRedisSerializer();
//生成key
String key = cacheRedisProperties.getPrefix().concat(SPLIT).concat(CACHE_NAME).concat(SPLIT).concat(Integer.toString(this.datacenterId)).concat(SPLIT).concat(Integer.toString(this.workerId));
//如果key不存在就创建(方式特殊情况,缓存丢失掉)
//如果key不存在就创建(防止特殊情况,缓存丢失掉)
connection.setNX(serializer.serialize(key), serializer.serialize(cacheValue));
//获得值(用于确定锁是否是自己创建的)
String oldCacheVlue = serializer.deserialize(connection.get(serializer.serialize(key)));
String currentCacheVlue = serializer.deserialize(connection.get(serializer.serialize(key)));
//比较(如果值是一样,则代表自己拥有锁,如果值不一样,则代表锁已经被其他进程获取)
if (cacheValue.equals(oldCacheVlue)) {
if (cacheValue.equals(currentCacheVlue)) {
//设置超时时间
return connection.expire(serializer.serialize(key), EXPIRATION);
} else {