[NewLife.XCode]對象字典緩存(百萬軍中取敵首級)

NewLife.XCode是一個有10多年曆史的開源數據中間件,支持nfx/netcore,由新生命團隊(2002~2019)開發完成並維護至今,以下簡稱XCode。

整個系列教程會大量結合示例代碼和運行日誌來進行深入分析,蘊含多年開發經驗於其中,代表作有百億級大數據實時計算項目。

開源地址:https://github.com/NewLifeX/X (求star, 770+)

 

單對象緩存

前文提到了以sql爲key的數據層緩存,以及整表緩存的實體列表緩存,各自有其優缺點,適用於不同場合。

當單表數據較大(10萬+)時,兩者就無能爲力了。天空一道巨響,對象字典緩存隆重登場!

 

對象字典緩存:以主鍵爲key,緩存實體對象,以滿足應用層的高頻單點查詢需求!

 

例程跑起來:

先給學生表加了100萬行,再隨機生成1024個編號,然後查詢1000萬次。速度200萬qps,命中率99.99%。

 

緩存本質

Student.FindByID內使用了單對象緩存:Meta.SingleCache[id];

單對象緩存本質就是並行字典,因此使用方式上只需要直接索引器查找即可。

 

在Meta.SingleCache內查找id時,如果已存在,則直接返回,否則執行委託Student.FindByKey查找對象後緩存起來。

非XCode用戶,也可以根據該思想設計自己的緩存。

 

單對象緩存也有過期時間,默認10秒,過期後異步更新(老規矩,爲了性能)。

單對象緩存還會根據LRU定期清理緩存,此時採用最後訪問時間而不是過期時間。

 

對象緩存還有最大緩存數限制,默認10000個,超過時刪除最久未訪問緩存數據。

 

 

 

因此,單對象緩存特別適用於單行特點很突出且修改不多的數據,如用戶表、產品表等。

即使目標表有千萬級數據,單對象字典緩存仍然可以輕鬆的取敵首級!^_^

 

從鍵查詢 

 前面實例展示了根據ID查找緩存對象,實際應用場景,還可能會根據名稱進行查找,總不能另外搞一個對象緩存吧?

來自深圳的海洋餅乾,很有創意的解決了這個問題,發明了從鍵緩存!

如上,Meta.SingleCache.GetItemWithSlaveKey(name) 實現了根據 name 查詢用戶。

在此之前,需要手工配置查詢方法,因爲XCode已經無法猜測得知。

 

 使用從鍵緩存後,等於有兩個入口(FindKey/FindSlaveKey)查詢數據庫,得到一個實體對象後,分別加入主鍵字典和從鍵字典,用於兩個維度索引查詢。

因此,從鍵緩存需要配置根據從鍵查數據庫的方法FindSlaveKeyMethod,同時還需要配置實體對象獲取從鍵值的方法GetSlaveKey,因爲主鍵查庫後加入從鍵緩存時,需要從對象內得到從鍵值。

 

過期策略

所有緩存都必須有過期策略。單對象字典緩存的過期策略有以下:

  • 初始化。首次訪問緩存時,無需阻塞,並行查詢。
  • 定時過期。緩存過期後,開異步線程更新並同時返回舊數據,確保應用層性能。設置文件的 SingleCacheExpire, 默認10秒
  • 添刪改過期。對實體類的添刪改操作完成後,都會直接修改緩存對應項。

顯然,初始化加載以後,將來訪問的永遠是定時更新的緩存數據,應用層可以得到非常好的性能!

由於緩存的添刪改過期跟實體操作綁定在一起,因此,越過實體類直接DAL執行更新操作,或者其它服務器修改數據,此時無法影響實體緩存,導致數據更新不及時。

早期版本XCode緩存默認過期時間60秒,隨着數據庫性能提升,默認值修改爲10秒,可根據實際場景設置。

 

 

 

系列教程

NewLife.XCode教程系列[2019版]

  1. 增刪改查入門。快速展現用法,代碼配置連接字符串
  2. 數據模型文件。建立表格字段和索引,名字以及數據類型規範,推薦字段(時間,用戶,IP)
  3. 實體類詳解。數據類業務類,泛型基類,接口
  4. 功能設置。連接字符串,調試開關,SQL日誌,慢日誌,參數化,執行超時。代碼與配置文件設置,連接字符串局部設置
  5. 反向工程。自動建立數據庫數據表
  6. 數據初始化。InitData寫入初始化數據
  7. 高級增刪改。重載攔截,自增字段,Valid驗證,實體模型(時間,用戶,IP)
  8. 髒數據。如何產生,怎麼利用
  9. 增量累加。高併發統計
  10. 事務處理。單表和多表,不同連接,多種寫法
  11. 擴展屬性。多表關聯,Map映射
  12. 高級查詢。複雜條件,分頁,自定義擴展FieldItem,查總記錄數,查彙總統計
  13. 數據層緩存。Sql緩存,更新機制
  14. 實體緩存。全表整理緩存,更新機制
  15. 對象緩存。字典緩存,適用用戶等數據較多場景。
  16. 百億級性能。字段精煉,索引完備,合理查詢,充分利用緩存
  17. 實體工廠。元數據,通用處理程序
  18. 角色權限。Membership
  19. 導入導出。Xml,Json,二進制,網絡或文件
  20. 分表分庫。常見拆分邏輯
  21. 高級統計。聚合統計,分組統計
  22. 批量寫入。批量插入,批量Upsert,異步保存
  23. 實體隊列。寫入級緩存,提升性能。
  24. 備份同步。備份數據,恢復數據,同步數據
  25. 數據服務。提供RPC接口服務,遠程執行查詢,例如SQLite網絡版
  26. 大數據分析。ETL抽取,調度計算處理,結果持久化

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章