高平发优化
id生成器
弊端
nodeid由zk来分配好一点 他保证了C
取三台机器的时间比较一下 大致一样就行
源码解析
第一种方法 segment
首先看sql语句
1.以业务id为主键
2.max 就是现在用了多少个值 比如 开始是1 用了1000个 就是1001
3.step就是固定的步速 用于一次分配多少id
入口
最主要的步骤
1.初始化 获取所有的业务id 更新cache 把没有的业务号删掉 把新的加入 每隔60秒检查一次 2.双重检查 确保每一个业务id都搞定 3.取id 开启读锁 就是如果超了0.9就不玩了 下一个buffer就要准备好改业务的后续id 然后呼唤就行了,
public Result get(final String key) {
if (!initOK) {
return new Result(EXCEPTION_ID_IDCACHE_INIT_FALSE, Status.EXCEPTION);
}
if (cache.containsKey(key)) {
SegmentBuffer buffer = cache.get(key);
if (!buffer.isInitOk()) {
synchronized (buffer) {
if (!buffer.isInitOk()) {
try {
updateSegmentFromDb(key, buffer.getCurrent());
logger.info("Init buffer. Update leafkey {} {} from db", key, buffer.getCurrent());
buffer.setInitOk(true);
} catch (Exception e) {
logger.warn("Init buffer {} exception", buffer.getCurrent(), e);
}
}
}
}
return getIdFromSegmentBuffer(cache.get(key));
}
return new Result(EXCEPTION_ID_KEY_NOT_EXISTS, Status.EXCEPTION);
}