Java服务使用Redis实现分布式全局唯一标识
2024-09-21 15:35:07
此处以SpringBoot
为例,示范如何使用Redis
构造全局唯一标识.
1. RedisTemplate配置
spring.redis.database = 0
spring.redis.host = **
spring.redis.port = 6379
spring.redis.password = **
spring.redis.lettuce.pool.max-wait = 1000ms
以上配置,参照实际情况进行设置.,
2.Java服务中Redis配置
@Repository
@Slf4j
public class RedisCounterRepository {
private final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
private RedisTemplate<String, Object> redisTemplate;
@Autowired
public RedisCounterRepository(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
// 根据获取的自增数据,添加日期标识构造分布式全局唯一标识
private String getNumFromRedis(String changeNumPrefix) {
String dateStr = LocalDate.now().format(dateTimeFormatter);
Long value = incrementNum(changeNumPrefix + dateStr);
return dateStr + StringUtils.leftPad(String.valueOf(value), 4, '0');
}
// 从redis中获取自增数据(redis保证自增是原子操作)
private long incrementNum(String key) {
RedisConnectionFactory factory = redisTemplate.getConnectionFactory();
if (null == factory) {
log.error("Unable to connect to redis.");
throw new UserException(AppStatus.INTERNAL_SERVER_ERROR);
}
RedisAtomicLong redisAtomicLong = new RedisAtomicLong(key, factory);
long increment = redisAtomicLong.incrementAndGet();
if (1 == increment) {
// 如果数据是初次设置,需要设置超时时间
redisAtomicLong.expire(1, TimeUnit.DAYS);
}
return increment;
}
PS:
如果您觉得我的文章对您有帮助,请关注我的微信公众号,谢谢!
最新文章
- monkeyrunner之控件ID不存在或重复
- 记录SQL Server2008日志文件损坏的恢复过程
- 一个简单的物料防错DEMO
- jquery validate表单验证插件
- BZOJ 3594 方伯伯的玉米田
- linux top命令
- C#中的lock关键字有何作用
- ICON文件保存
- POJ #2479 - Maximum sum
- SQLServer2005中查询语句的执行顺序
- Tomcat8 配置NIO
- Druid数据库连接池源码分析
- Adobe RIA 开发工程师认证考试大纲
- c# 利用IEqualityComparer接口去除DataTable重复数据
- form编码方式application/x-www-form-urlencoded和multipart/form-data的区别
- MYSQL学习笔记——sql语句优化工具
- vue中的组件
- jQuery实现淘宝轮播图
- 百度AI搜索引擎
- vs2017_enterprise正式版离线安装包bt下载