場景:針對於分散式併發環境,易出現編碼生成重覆問題 方案特點:串列操作可避免阻塞加鎖,處理效率更高 具體解決方案 ...
場景:針對於分散式併發環境,易出現編碼生成重覆問題
方案特點:串列操作可避免阻塞加鎖,處理效率更高
具體解決方案
private final static String ENTERPRISE_CODE = "enterpriseCode";
@Resource
private RedisTemplate redisTemplate;
private String generateCode() {
String code;
if (!redisTemplate.hasKey(ENTERPRISE_CODE)) {
// Mybatis-Plus 查詢資料庫中企業編碼最大值
EnterprisePO enterprise = enterpriseService.getOne(
Wrappers.<EnterprisePO>lambdaQuery()
.orderByDesc(EnterprisePO::getCode)
.last("limit 1"));
// 緩存企業編碼
if (ObjectUtils.isNotEmpty(enterprise)) {
// 如果 key 不存在才 set 避免併發重覆 set,setIfAbsent() 屬於原子操作
redisTemplate.opsForValue().setIfAbsent(ENTERPRISE_CODE, Long.valueOf(enterprise.getCode()));
// 也可設置 key 過期時間,此處設置為 1 天
// redisTemplate.opsForValue().setIfAbsent(ENTERPRISE_CODE, Long.valueOf(enterprise.getCode()), 1, TimeUnit.DAYS);
}
}
// 以遞增方式緩存最新編碼
Long number = redisTemplate.opsForValue().increment(ENTERPRISE_CODE, 1L);
// %06d 意為保留 6 位數,不足六位數字前面補 0
code = String.format("%06d", number);
return code;
}
本文來自博客園,作者:這個殺手冷死了,轉載請註明原文鏈接:https://www.cnblogs.com/pandacode/p/16093023.html