1、上代码,基于aof持久化方式 always每发生一次写的操作都记录到日志中,这里可以优化成aof+rdb(优势:rdb是按照时间分片来保存数据成功后,将会删除aof 的日志,再重启后会快速恢复数据也不会丢失)
@Autowired
private StringRedisTemplate redisTemplate;
//自增并获取自增结果值. 网上通用的方法
//因为你要考虑宕机情况,内存数据丢失没有写进磁盘的情况,所以基于aof持久化,
public Long incrementAndGetId(String key) {
RedisAtomicLong counter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
return counter.incrementAndGet();
}
2.上代码 ,基于内存每次宕机 重启后会丢失全部内存数据,可以实现不会造成重复id,减少磁盘IO,不需要持久化
@Autowired
private StringRedisTemplate redisTemplate;
@GetMapping("/test")
public void test(String key) {
log.info("当前redis为空,查询数据库MAX并+1");
if (redisTemplate.opsForValue().get(key) == null) {
log.info("setIfAbsent,如果set成功返回true,否则返回false");
Boolean ifAbsent = redisTemplate.opsForValue().setIfAbsent(key, "100");
log.info("返回false,代表线程set抢夺失败,通过key获取自增id");
if (!ifAbsent) {
Long pm1 = redisTemplate.opsForValue().increment(key);
}
} else {
log.info("当前redis不为空,通过key获取自增id");
Long pm1 = redisTemplate.opsForValue().increment(key);
}
log.info("输出自增ID:" + redisTemplate.opsForValue().get(key));
}