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