Redis中如何实现全局ID生成器?

Redis 可以通过以下方式实现全局ID生成器:

  1. 使用 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);  
  1. 使用 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);  
  1. 对全局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);
}