using System.Collections.Generic; using System.Threading.Tasks; namespace ETModel { [ObjectSystem] public class DbCacheComponentSystem : AwakeSystem { public override void Awake(DBCacheComponent self) { self.Awake(); } } /// /// 用来缓存数据 /// public class DBCacheComponent : Component { public Dictionary> cache = new Dictionary>(); public const int taskCount = 32; public List tasks = new List(taskCount); public void Awake() { for (int i = 0; i < taskCount; ++i) { DBTaskQueue taskQueue = ComponentFactory.Create(); this.tasks.Add(taskQueue); } } public Task Add(Component disposer, string collectionName = "") { TaskCompletionSource tcs = new TaskCompletionSource(); this.AddToCache(disposer, collectionName); if (string.IsNullOrEmpty(collectionName)) { collectionName = disposer.GetType().Name; } DBSaveTask task = ComponentFactory.CreateWithId>(disposer.Id, disposer, collectionName, tcs); this.tasks[(int)((ulong)task.Id % taskCount)].Add(task); return tcs.Task; } public Task AddBatch(List disposers, string collectionName) { TaskCompletionSource tcs = new TaskCompletionSource(); DBSaveBatchTask task = ComponentFactory.Create, string, TaskCompletionSource>(disposers, collectionName, tcs); this.tasks[(int)((ulong)task.Id % taskCount)].Add(task); return tcs.Task; } public void AddToCache(Component disposer, string collectionName = "") { if (string.IsNullOrEmpty(collectionName)) { collectionName = disposer.GetType().Name; } Dictionary collection; if (!this.cache.TryGetValue(collectionName, out collection)) { collection = new Dictionary(); this.cache.Add(collectionName, collection); } collection[disposer.Id] = disposer; } public Component GetFromCache(string collectionName, long id) { Dictionary d; if (!this.cache.TryGetValue(collectionName, out d)) { return null; } Component result; if (!d.TryGetValue(id, out result)) { return null; } return result; } public void RemoveFromCache(string collectionName, long id) { Dictionary d; if (!this.cache.TryGetValue(collectionName, out d)) { return; } d.Remove(id); } public Task Get(string collectionName, long id) { Component disposer = GetFromCache(collectionName, id); if (disposer != null) { return Task.FromResult(disposer); } TaskCompletionSource tcs = new TaskCompletionSource(); DBQueryTask dbQueryTask = ComponentFactory.CreateWithId>(id, collectionName, tcs); this.tasks[(int)((ulong)id % taskCount)].Add(dbQueryTask); return tcs.Task; } public Task> GetBatch(string collectionName, List idList) { List disposers = new List(); bool isAllInCache = true; foreach (long id in idList) { Component disposer = this.GetFromCache(collectionName, id); if (disposer == null) { isAllInCache = false; break; } disposers.Add(disposer); } if (isAllInCache) { return Task.FromResult(disposers); } TaskCompletionSource> tcs = new TaskCompletionSource>(); DBQueryBatchTask dbQueryBatchTask = ComponentFactory.Create, string, TaskCompletionSource>>(idList, collectionName, tcs); this.tasks[(int)((ulong)dbQueryBatchTask.Id % taskCount)].Add(dbQueryBatchTask); return tcs.Task; } public Task> GetJson(string collectionName, string json) { TaskCompletionSource> tcs = new TaskCompletionSource>(); DBQueryJsonTask dbQueryJsonTask = ComponentFactory.Create>>(collectionName, json, tcs); this.tasks[(int)((ulong)dbQueryJsonTask.Id % taskCount)].Add(dbQueryJsonTask); return tcs.Task; } } }