Redis 可以通过以下方式实现全局ID生成器:
- 使用 INCR 命令实现简单ID生成器:
- 初始化一个键,其值为当前最大ID。
- 每次生成新ID时,使用 INCR 命令对该键的值增加1,并返回增加后的值作为全局ID。
- 这样可以保证每个ID的值唯一,且递增。
例如:
Jedis jedis = new Jedis("localhost");
String idKey = "id_generator";
// 初始化idKey值为0
jedis.set(idKey, "0");
// 生成ID
Long id = jedis.incr(idKey);
- 使用 INCRBY 命令预分配一段ID:
- 此方法可以提前生成一段连续的ID,存储到列表或集合中。
- 每次需要新ID时,从已生成的ID段中取出一个,并在需要时补充生成新的ID段。
- 这样可以减轻生成ID时的Redis访问压力,提高系统吞吐量。
例如:
jedis.incrby(idKey, 100); // 生成100个新ID,当前值为100
List<Long> idList = new ArrayList<>();
for (long i=jedis.get(idKey); i<jedis.get(idKey)+100; i++) {
idList.add(i);
}
// 从idList中取出ID使用
Long id = idList.remove(0);
- 对全局ID设置过期时间,定期重新生成:
- 这可以防止ID增长到极大值后溢出,影响系统稳定性。
- 我们可以设置一个较长的过期时间,定期重新设置过期时间以及当前最大ID值。
例如:
jedis.setex(idKey, 3600, 100); // 1小时过期,当前ID值为100
// 每30秒获取当前ID并重置过期时间
while (true) {
Long maxId = jedis.get(idKey);
jedis.setex(idKey, 3600, maxId);
Thread.sleep(30 * 1000);
}