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

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

?Redis?串行生成順序編碼的方法實(shí)現(xiàn)_Redis

作者:這個(gè)殺手冷死了 ? 更新時(shí)間: 2022-06-06 編程語言

場景:針對于分布式并發(fā)環(huán)境,易出現(xiàn)編碼生成重復(fù)問題

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

具體解決方案

private final static String ENTERPRISE_CODE = "enterpriseCode";

@Resource
private RedisTemplate redisTemplate;

private String generateCode() {
? ? String code;
? ? if (!redisTemplate.hasKey(ENTERPRISE_CODE)) {
? ? ? ? // Mybatis-Plus 查詢數(shù)據(jù)庫中企業(yè)編碼最大值
? ? ? ? EnterprisePO enterprise = enterpriseService.getOne(
? ? ? ? ? ? Wrappers.lambdaQuery()
? ? ? ? ? ? ? ? .orderByDesc(EnterprisePO::getCode)
? ? ? ? ? ? ? ? .last("limit 1"));
? ? ? ? // 緩存企業(yè)編碼
? ? ? ? if (ObjectUtils.isNotEmpty(enterprise)) {
? ? ? ? ? ? // 如果 key 不存在才 set 避免并發(fā)重復(fù) set,setIfAbsent() 屬于原子操作
? ? ? ? ? ? redisTemplate.opsForValue().setIfAbsent(ENTERPRISE_CODE, Long.valueOf(enterprise.getCode()));
? ? ? ? ? ? // 也可設(shè)置 key 過期時(shí)間,此處設(shè)置為 1 天
? ? ? ? ? ? // redisTemplate.opsForValue().setIfAbsent(ENTERPRISE_CODE, Long.valueOf(enterprise.getCode()), 1, TimeUnit.DAYS);
? ? ? ? }
? ? }
? ? // 以遞增方式緩存最新編碼
? ? Long number = redisTemplate.opsForValue().increment(ENTERPRISE_CODE, 1L);
? ? // %06d 意為保留 6 位數(shù),不足六位數(shù)字前面補(bǔ) 0
? ? code = String.format("%06d", number);
? ? return code;
}

原文鏈接:https://www.cnblogs.com/pandacode/p/16093023.html

欄目分類
最近更新