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
);
}
}