Scut 快取管理

2022-09-16 02:06:14 字數 2792 閱讀 3421

scut 的快取管理看起來還是蠻複雜的。

redis 本身就有記憶體快取+持久化的作用,scut還是自己封裝了一層記憶體快取+redis快取+持久化。

這是乙個縮略版本的結構圖。

1. 上半部分是通用的快取池結構,用來存放各類快取資料。

第一層dictionary是按大類區分:entity_、personal_(0),type.name 等;

第二層dictionary則是進一步細分,比如同樣乙個type下的 type.name +"userid";

2. 下半部分則是應用層對快取的操作器,包含資料取用+操作方法,應用層資料結構要按照一定的規則進行封裝,才能直接使用scut提供的「帶資料修改事件」的各類元件。

cacheitemset 的作用:

cache 們都會用cacheitemset 容器來裝載具體的資料;

private readonly cachetype _cacheitemtype;  //標記了快取的型別,不同型別的快取在從redis載入時key的組裝方式,釋放快取的規則都不相同

private readonly bool_isreadonly;

private cacheperiod _period;          //快取的核心:生命週期       

private idataexpired _itemdata; //具體的資料

public bool haschanged

生命週期如何起作用?haschanged 如何起作用?

在 cachepool 裡的 disposecache 介面有統一處理,但沒有發現**在定期有效呼叫?

sharecachestruct:

public ienumerabletake()

public ienumerabletoentityenumerable(bool isload = false)

可以知道 sharecache 從快取載入資料時,是整塊相應型別的資料全部載入出來,適合用來管理配置、處理公有資料。

personalcache:

public ienumerabletake()

public t take(params object keys)

它可以單個或整體進行快取載入,更適合處理單使用者的某型別資料。

shareentity 比 baseentity 多了乙個 api:getidentityid() 未來有什麼作用再觀察。

abstractentity:

/// /// 儲存改變的屬性集合

///

private concurrentqueue_changepropertys = new concurrentqueue();

/// /// 等待更新屬性

///

private readonly hashset_waitupdatelist = new hashset();

這兩個屬性,表示 abstracentity 最重要的作用應該是「部分更新修改過的資料」

持續追蹤,發現其作用是向資料庫寫入修改過的資料:

sqldatasender.cs:

public bool send(params t datalist) wheret : abstractentity

那什麼時候進行寫入修改資料? abstractentity 下的 entitychangeevent : iitemchangeevent 是如何起作用的?

iitemchangeevent:

[jsonignore]

public bool i***pired

[jsonignore]

public bool isincache

/// /// 是否有變更

///

public abstract bool haschanged

/// /// 繫結實體類的屬性名(表的列名)

///

internal abstract string propertyname

/// /// 當前物件變更事件物件

///

public abstract cacheitemchangeevent itemevent

/// /// 當前物件的子類變更事件物件

///

public abstract cacheitemchangeevent childrenevent

在 abstractentity 中,對本身數值進行「修改、刪除進行封裝的api」,都會呼叫事件通知 notify。

abstractentity 過載的 notify api:

protected override void notify(objectsender, cacheitemeventargs eventargs)

private voidputtochangekeys(abstractentity entity)

}

可以看出這個位置並沒有真正使用  entitychangeevent 機制,而是重寫了 notity(),在修改資料後,直接向底層佇列壓入修改佇列。

Scut學習筆記(一)

關於scut官方helloword sample無法執行的解決方案 執行server端時遇到 redis server is using game server,it s path step 1,刪除redis安裝目錄下的 dump.rdb檔案,並重啟redis服務 step 2 重新執行服務端ga...

SCUT入門 環境搭建

scut是一款基於c 且開源的遊戲服務端框架,並且有一定的上線專案。最近正在入門中。1.安裝 源 建議osc china 需要安裝.net4.5.1,推薦直接裝vs2013,都有了 預設是redis記憶體nosql資料庫 sql資料庫。沒有接觸過redis的朋友可以看下我另外一篇 redis c 入...

ArcGlobe 快取管理

arcglobe擁有快取機制,因此可以應對大量3d資料的視覺化,下面就總結下有關快取的知識點。首先,需要了解,arcglobe具有兩種快取機制 記憶體快取,硬碟快取。記憶體快取指的是分配可供 arcglobe 使用的物理記憶體 ram 大小。要獲得最佳效能,可設定對每個所使用的資料型別所分配的記憶體...