1 整体流程
2 代码实现
2.1 查询的整体实现代码
@Transactional(rollbackFor = Exception.class)
public List<RecordLevelParam> getRecordLevelList(String businessId) {
synchronized (lock) {
if (!localStorage.containsKey(businessId)) {
initialRecordLevelCache(businessId);
}
try {
boolean isUpdate = checkUpdate(businessId);
if (isUpdate) {
updateRecordLevelCache(businessId);
}
} catch (Exception e) {
}
Map<Integer, RecordLevelParam> recordLevelParamMap = localStorage.get(businessId);
List<RecordLevelParam> recordLevelParams = new ArrayList<>();
for (Map.Entry<Integer, RecordLevelParam> entity : recordLevelParamMap.entrySet()) {
recordLevelParams.add(entity.getValue());
}
return recordLevelParams;
}
}
2.1.1 初始化缓存
private void initialRecordLevelCache(String businessId) {
synchronized (lock) {
List<RecordLevelParam> list = prepareRecordLevelParam(businessId);
Map<Integer, RecordLevelParam> businessMap = new HashMap<>(list.size());
if (list != null && list.size() > 0) {
list.forEach(recordLevelParam -> businessMap.put(recordLevelParam.getLevel(), recordLevelParam));
localStorage.put(businessId, businessMap);
} else {
localStorage.put(businessId, new HashMap<>());
}
Long timeStamp = (Long) redisManager.hget(RECORD_LEVEL_REDIS_HASH_KEY, businessId);
Long now = System.currentTimeMillis();
if (null == timeStamp) {
redisManager.hset(RECORD_LEVEL_REDIS_HASH_KEY, businessId, now);
RECORD_LEVEL_CACHE_STAMP.put(businessId, now);
} else {
RECORD_LEVEL_CACHE_STAMP.put(businessId, timeStamp);
}
}
}
2.1.2 是否更新本地缓存
private boolean checkUpdate(String businessId) throws Exception {
Long redisStamp = (Long) redisManager.hget(RECORD_LEVEL_REDIS_HASH_KEY, businessId);
Long cashStamp = RECORD_LEVEL_CACHE_STAMP.get(businessId);
if (null == cashStamp) {
throw new Exception("unfind: " + businessId);
}
return redisStamp > cashStamp;
}
2.1.3 从缓存中获取数据
Map<Integer, RecordLevelParam> recordLevelParamMap = localStorage.get(businessId);
List<RecordLevelParam> recordLevelParams = new ArrayList<>();
for (Map.Entry<Integer, RecordLevelParam> entity : recordLevelParamMap.entrySet()) {
recordLevelParams.add(entity.getValue());
}
2.2 修改的整体实现代码
@Transactional(rollbackFor = Exception.class)
public void updateBusinessLevel(String businessId, Integer recordLevel) throws Exception {
if (localStorage.containsKey(businessId)) {
int level = recordLevel;
localStorage.get(businessId).put(level, getRecordLevelByBusinessId(businessId, level));
Long now = System.currentTimeMillis();
redisManager.hset(RECORD_LEVEL_REDIS_HASH_KEY, businessId, now);
RECORD_LEVEL_CACHE_STAMP.put(businessId, now);
}
}