首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

網站熱點資料實時緩存更新架構:Spring AOP 切面零侵入實現

     編輯:J2EE

業務背景

首頁排行榜、熱門話題等高頻讀低頻寫資料,若每請求查 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)
}

Spring AOP 切面攔截持久層寫操作

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

Spring 配置啟用切面

<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 或顯式鎖。
  • 緩存淘汰:LinkedList 無容量上限,需定時修剪 (如只保留最近 100 條) 或改用 LRU Map (Guava Cache / Caffeine)。
  • 一致性:AOP 更新屬「最終一致性」,極端情況 (事務回滾後緩存已更新) 可接受短暫髒讀,或引入事務同步器 TransactionSynchronizationManager 在提交後才更新緩存。
  • 性能基準:文中未壓測,高併發建議改用 Redis + Lua 腳本原子操作,JVM 記憶體緩存僅作為 L2。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved