首頁排行榜、熱門話題等高頻讀低頻寫資料,若每請求查 DB 將撞垮資料庫。需在記憶體緩存並支援「寫入即更新」,且業務代碼零侵入。
public class WebCacheUtils {
// 最近註冊用戶
public static final LinkedList<Login> regRecentUser = new LinkedList<>();
// 最近登入用戶
public static final LinkedList<Login> regLoginedUser = new LinkedList<>();
// 熱門話題 (自定義排序)
public static final List<Topic> hotTopic = new ArrayList<>();
// 自定義比較器:讚數權重 0.4 + 評論數權重 0.6
static class TopicCompare implements Comparator<Topic> {
@Override
public int compare(Topic a, Topic b) {
double sa = a.getAgreeit() * 0.4 + a.getCmtnum() * 0.6;
double sb = b.getAgreeit() * 0.4 + b.getCmtnum() * 0.6;
return Double.compare(sb, sa); // 降序
}
}
// 線程安全的緩存更新方法 (略,建議用 CopyOnWriteArrayList 或 ReadWriteLock)
}
public class LoginAdvice implements AfterReturningAdvice {
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) {
if ("checkUserLogin".equalsIgnoreCase(method.getName()) && returnValue != null) {
// 登入成功 → 更新最近登入緩存
WebCacheUtils.addRegLoginedUser((Login) returnValue);
} else if ("addUser".equalsIgnoreCase(method.getName())) {
// 註冊成功 → 更新最近註冊緩存
WebCacheUtils.addRegRecentUser((Login) args[0]);
}
// 可擴展攔截 Topic 發布/回覆 → 更新 hotTopic
}
}
<bean id="loginAdvice" class="com.common.cache.LoginAdvice"/>
<aop:config>
<aop:advisor advice-ref="loginAdvice"
pointcut="execution(* com.cxlh.dao.hibernate.LoginDAO.*(..))"/>
</aop:config>
ConcurrentLinkedQueue、CopyOnWriteArrayList 或顯式鎖。TransactionSynchronizationManager 在提交後才更新緩存。