String pageKey = RedisKeyManagement.getKey(RedisKeyManagement.ACTIVITY_BAISHI_PAGE_CACHE,
Arrays.asList(activityId.toString(),String.valueOf(current)));
Object pageObj = redisService.get(pageKey);
if(pageObj != null) {
return ApiResult.success(pageObj);
}
// 字符串对象要.intern()很重要
// 字符串[a+b] 最终的结果实际是new 的新的String,并不会存在字符串常量池中,所以synchronized认为其锁住的字符串其实并不是同一个对象。
// 调用了.intern()方法,将字符串统一放到字符串常量池中管理,相同的字符串代表的对象地址是一样的
synchronized (("lock" + activityId + current).intern()) {
pageObj = redisService.get(pageKey);
if(pageObj != null) {
return ApiResult.success(pageObj);
}
ApiResult<PortalPageVO<PlayRecordBaseExtendVO>> apiResult = 读数据库的请求;
redisService.set(pageKey,apiResult.getData(), Constant.TEN_SECOND);
return apiResult;
}

注意: 对缓存的记录, 如果需要实时更新的,则在根据主键回表查询,再重新组装

参考:

https://blog.csdn.net/A_art_xiang/article/details/126340579

posted on 2022-09-07 18:53  毛会懂  阅读(300)  评论(0编辑  收藏  举报