日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

?Redis?串行生成順序編碼的方法實現_Redis

作者:這個殺手冷死了 ? 更新時間: 2022-06-06 編程語言

場景:針對于分布式并發環境,易出現編碼生成重復問題

方案特點:串行操作可避免阻塞加鎖,處理效率更高

具體解決方案

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.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

欄目分類
最近更新