工作中想要生成一個特殊編碼,比如:SZ-2412030009,前面三位是編碼固定開頭,然後是yyMMdd,最後是當天的個數。
期望能夠生成一個計算當天task個數,第二天重新計數的一個編碼,用於插入到資料庫中作為特殊標識。便於使用者快速檢視任務時間和個數
@Resource
private RedisTemplate<String, Long> redisTemplate;
@Override
public String getLastVersionCode() {
SimpleDateFormat df = new SimpleDateFormat("yyMMdd");
// 當天的key是相同的,比如SZ-231107,當天的key一直會是這個
String code = "SZ-" + df.format(new Date());
// 個數遞增,如果不存在,設定為1
Long versionNumByToday = redisTemplate.opsForValue().increment(code, 1);
// Redis本身是有持久化的,即使重啟伺服器也不用擔心redis資料丟失
// 但是問題在於,專案之前的設計並不好,給使用者和其他人員配備了快取清理功能,會導致redis資料丟失。
// 所以如果key不存在的情況,也有可能是快取被清理,所以這裡要判斷一下(特殊業務處理)
if (versionNumByToday == 1L) {
// 如果沒有上述的特殊情況,不用設定以下兩行
versionNumByToday = getVersionNumByToday(code);
redisTemplate.opsForValue().set(code, versionNumByToday);
// 設定 Redis 鍵的過期時間為 1 天
redisTemplate.expire(code, 1, TimeUnit.DAYS);
}
DecimalFormat decimalFormat = new DecimalFormat("0000");
String newCode = decimalFormat.format(versionNumByToday);
newCode = code + newCode;
return newCode;
}
private Long getVersionNumByToday(String code) {
Long versionNumByToday = null;
// 從資料庫中獲取最新的編號
String latestVersionCode = getLatestVersionCodeFromDatabase();
if (latestVersionCode != null && latestVersionCode.startsWith(code)) {
// 解析最新的編號,提取出編號部分
String latestVersionCodePrefix = latestVersionCode.substring(9);
// 設定 Redis 中的計數器為最新的編號 + 1
versionNumByToday = Long.parseLong(latestVersionCodePrefix) + 1L;
} else {
// 如果資料庫中沒有編號,設定 Redis 計數器為 1
versionNumByToday = 1L;
}
return versionNumByToday;
}
/**
* 從資料庫中獲取最新的編號
*
* @return 最新的編號
*/
private String getLatestVersionCodeFromDatabase() {
// 假設 version_code 欄位儲存了編號
QueryWrapper<ShequnAiFileManager> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("version").last("limit 1");
ShequnAiFileManager latestRecord = this.getOne(queryWrapper);
return latestRecord != null ? latestRecord.getVersion() : null;
}
注:使用@Resource引入RedisTemplate,因為我們設定了泛型的。
references:
https://blog.csdn.net/victo_chao/article/details/120438648