?Redis 串行生成順序編碼的方法實現(xiàn)
更新時間:2022年04月03日 10:23:48 作者:這個殺手冷死了
本文主要介紹了?Redis 串行生成順序編碼的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
場景:針對于分布式并發(fā)環(huán)境,易出現(xiàn)編碼生成重復(fù)問題
方案特點:串行操作可避免阻塞加鎖,處理效率更高
具體解決方案
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.<EnterprisePO>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è)置為 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ù)字前面補 0 ? ? code = String.format("%06d", number); ? ? return code; }
到此這篇關(guān)于 Redis 串行生成順序編碼的方法實現(xiàn)的文章就介紹到這了,更多相關(guān) Redis 串行生成順序編碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:
相關(guān)文章
Redis中的配置文件,數(shù)據(jù)持久化,事務(wù)
這篇文章主要介紹了Redis中的配置文件,數(shù)據(jù)持久化,事務(wù)問題,具有很好的參考價值,希望對大家有所幫助。2022-12-12將MongoDB作為Redis式的內(nèi)存數(shù)據(jù)庫的使用方法
這篇文章主要介紹了將MongoDB作為Redis式的內(nèi)存數(shù)據(jù)庫的使用方法,原理其實只是將內(nèi)存虛擬作為磁盤,需要的朋友可以參考下2015-06-06如何在centos中安裝redis插件bloom-filter
布隆過濾器在第一次add的時候自動創(chuàng)建基于默認(rèn)參數(shù)的過濾器,Redis還提供了自定義參數(shù)的布隆過濾器,下面這篇文章主要給大家介紹了關(guān)于如何在centos中安裝redis插件bloom-filter的相關(guān)資料,需要的朋友可以參考下2021-11-11