实现Redis数据库自增ID功能(redis添加自增id)
实现Redis数据库自增ID功能
Redis是一个高性能的非关系型数据库,常用于缓存、消息队列等场景。在实际项目中,我们常常需要生成全局唯一的ID,因为MySQL或其他关系型数据库的自增ID存在限制,容易导致ID不唯一的情况。这时候,我们可以利用Redis的自增功能来生成唯一ID。
Redis的自增功能是通过INCR命令实现的,INCR key会将key对应的值原子性地增加1,如果key不存在,则会先创建并置为0再进行增加。因此,我们可以建立一个名为“id:generator”的key,将其初始化为0,每次使用INCR命令自增并返回当前值,得到唯一的ID。
以下是一个Java实现的Redis自增ID的示例代码:
public class RedisIdGenerator {
private static final String REDIS_KEY = "id:generator"; private static Jedis jedis;
public RedisIdGenerator() { jedis = new Jedis("localhost", 6379);
}
public long getNextId() { return jedis.incr(REDIS_KEY);
}
public static void mn(String[] args) { RedisIdGenerator generator = new RedisIdGenerator();
System.out.println(generator.getNextId()); System.out.println(generator.getNextId());
System.out.println(generator.getNextId()); }
}
运行上述代码,可以看到输出了递增的ID:
1
23
上述实现方式的缺点是:如果我们在分布式环境下使用同一个Redis实例,会导致ID不唯一的情况。这时候,我们可以加入分布式锁的机制,确保Redis的自增ID是全局唯一的。
以下是一个使用Redisson框架实现分布式锁的示例代码:
public class RedisIdGeneratorWithLock {
private static final String REDIS_KEY = "id:generator"; private static final String LOCK_KEY = "id:generator:lock";
private static final Random RANDOM = new Random(12345); private static RedissonClient redisson;
public RedisIdGeneratorWithLock() { Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379"); redisson = Redisson.create(config);
}
public long getNextId() { RLock lock = redisson.getLock(LOCK_KEY);
try { // 尝试加锁,最多等待100毫秒锁
boolean locked = lock.tryLock(100, 100, TimeUnit.MILLISECONDS); if (!locked) {
// 获取锁失败,随机休眠一段时间再重试 Thread.sleep(RANDOM.nextInt(100));
return getNextId(); }
long id = redisson.getAtomicLong(REDIS_KEY).incrementAndGet(); return id;
} catch (InterruptedException e) { throw new RuntimeException(e);
} finally { lock.unlock();
} }
public static void mn(String[] args) { RedisIdGeneratorWithLock generator = new RedisIdGeneratorWithLock();
System.out.println(generator.getNextId()); System.out.println(generator.getNextId());
System.out.println(generator.getNextId()); }
}
运行上述代码,可以看到输出了递增的ID:
1
23
上述代码的实现方式是:添加一个“id:generator:lock”的key,使用Redisson框架的RLock对象对其进行操作。在获取ID之前,尝试获取该key的锁,最多等待100毫秒。如果获取锁失败,则随机休眠一段时间再重试。获取到锁之后,使用Redisson框架的RAtomicLong对象自增ID并返回。
总结:利用Redis的自增功能可以实现全局唯一的ID,通过添加分布式锁,可以在分布式环境下确保ID不重复。