Redis生成分布式ID(附Java代码模版)
import redis.clients.jedis.Jedis;
public class RedisDistributedIdGenerator {
private static final String KEY_SUFFIX = "distributed_id_counter";
private static final long BEGIN_TIMESTAMP = 1670000000000L; // 自定义起始时间戳
private Jedis jedis;
private String keyPrefix;
public RedisDistributedIdGenerator(Jedis jedis, String keyPrefix) {
this.jedis = jedis;
this.keyPrefix = keyPrefix;
}
public synchronized long nextId() {
String key = keyPrefix + KEY_SUFFIX;
long currentTimestamp = System.currentTimeMillis();
long timeStamp = currentTimestamp - BEGIN_TIMESTAMP;
String value = jedis.getSet(key, String.valueOf(timeStamp));
if (value == null) { // 如果value为null,表示这是该key第一次被访问
jedis.setnx(key, String.valueOf(timeStamp));
return generateId(timeStamp, 0);
} else {
long oldTimeStamp = Long.parseLong(value);
if (timeStamp > oldTimeStamp) { // 如果当前时间戳大于旧的,更新存储的时间戳并从0开始计数
jedis.set(key, String.valueOf(timeStamp));
return generateId(timeStamp, 0);
} else { // 时间戳相同或更小,获取当前值并自增
long count = jedis.incr(key);
return generateId(timeStamp, count);
}
}
}
private long generateId(long timeStamp, long count) {
// 根据业务需求组合ID
return (timeStamp << 22) | (count & 0x3FF_FFFFL);
}
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
RedisDistributedIdGenerator idGenerator = new RedisDistributedIdGenerator(jedis, "my_key_prefix_");
for (int i = 0; i < 10; i++) {
System.out.println("Generated ID: " + idGenerator.nextId());
}
jedis.close();
}
}
这段代码提供了一个RedisDistributedIdGenerator类,它使用Redis的GETSET命令来生成分布式唯一ID。它使用了一个Redis键和一个前缀来保证不同应用或服务之间的唯一性。生成的ID是一个64位的长整型数,其中包含了时间戳和自增计数。这个例子提供了一个简单的方法来生成分布式ID,并且可以作为生成分布式唯一ID的参考实现。
评论已关闭