using System.Collections.Generic; using System.Threading.Tasks; namespace Model { [ObjectSystem] public class DbCacheComponentSystem : ObjectSystem, IAwake { public void Awake() { this.Get().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 = EntityFactory.Create(); this.tasks.Add(taskQueue); } } public Task Add(Disposer disposer, string collectionName = "") { TaskCompletionSource tcs = new TaskCompletionSource(); this.AddToCache(disposer, collectionName); if (string.IsNullOrEmpty(collectionName)) { collectionName = disposer.GetType().Name; } DBSaveTask task = EntityFactory.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 = EntityFactory.Create, string, TaskCompletionSource>(disposers, collectionName, tcs); this.tasks[(int)((ulong)task.Id % taskCount)].Add(task); return tcs.Task; } public void AddToCache(Disposer 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 Disposer GetFromCache(string collectionName, long id) { Dictionary d; if (!this.cache.TryGetValue(collectionName, out d)) { return null; } Disposer 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) { Disposer entity = GetFromCache(collectionName, id); if (entity != null) { return Task.FromResult(entity); } TaskCompletionSource tcs = new TaskCompletionSource(); DBQueryTask dbQueryTask = EntityFactory.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) { Disposer entity = this.GetFromCache(collectionName, id); if (entity == null) { isAllInCache = false; break; } disposers.Add(entity); } if (isAllInCache) { return Task.FromResult(disposers); } TaskCompletionSource> tcs = new TaskCompletionSource>(); DBQueryBatchTask dbQueryBatchTask = EntityFactory.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 = EntityFactory.Create>>(collectionName, json, tcs); this.tasks[(int)((ulong)dbQueryJsonTask.Id % taskCount)].Add(dbQueryJsonTask); return tcs.Task; } } }