商城网站管理系统,学影视后期大概多少钱,互动营销成功案例,网站图片设计制作自己实现的一个缓存数据库#xff08;搞着玩#xff09; 想法来源特点说明 上代码主体基类测试类 注 想法来源 做过一个小型项目#xff0c;客户要求易移植#xff0c;不能使用收费的数据库#xff0c;最好是一个包搞定#xff0c;尝试过用sqlite#xff0c;在部分linux… 自己实现的一个缓存数据库搞着玩 想法来源特点说明 上代码主体基类测试类 注 想法来源 做过一个小型项目客户要求易移植不能使用收费的数据库最好是一个包搞定尝试过用sqlite在部分linux上可能需要自己安装环境比较麻烦 mysql也需要安装客户技术实力比较弱不安装多的依赖一键运行最好 特点说明 支持多线程 支持多表 适合小型项目不用安装配置其它数据库可以做到只有一个包一键启动 如果将主键id调整为手动指定的字符串可以作为系统的配置库来使用数据都在内存里面读取速度快 由于是数据是全量进行持久化保存所以不支持太大的数据量 上代码
主体 namespace Memory.Db
{/// summary/// 内存数据库/// 支持多线程/// 支持多表/// 不支持大量数据/// 建议每个表数据量不要超过1w或者数据文件大小保持在5M以内/// 数据都在内存里面所以读取速度会相当快/// 适合项目/// 1.小型项目/// 2.数据量小 不想使用数据库安装配置麻烦/// /summarypublic class CacheDB:ISingleton{/// summary/// 雪花id类/// /summaryreadonly SnowflakeId _sid;public CacheDB(SnowflakeId sid){_sid sid;}//数据库private static ConcurrentDictionarystring, ConcurrentDictionarylong, dynamic _db new();//数据存放路径private string _fielpath wwwroot/cachedb/;//锁对象private object lockobj new object();/// summary/// 新增或修改/// /summary/// typeparam nameT/typeparam/// param nameitem/param/// returns/returns/// exception crefException/exceptionpublic T AddOrUpdateT(T item) where T : CacheDBEntityBase, new(){//取得表var table GetTableT();//判断是否新增if (item.Id 0){//新增item.Id _sid.GenerateId();item.CreatedTime DateTime.Now;}else{//修改if (!table.ContainsKey(item.Id)) throw new Exception(数据不存在);var old table[item.Id];item.CreatedTime old.CreatedTime;//将原来的创建时间值取过来防止被空值覆盖item.UpdateTime DateTime.Now;}///新增或修改table.AddOrUpdate(item.Id, item, (a, b) item);//保存快照SaveToFileT();return item;}/// summary/// 删除/// /summary/// typeparam nameT/typeparam/// param nameitem/param/// exception crefException/exceptionpublic void DeleteT(T item) where T : CacheDBEntityBase, new(){//取得表var table GetTableT();//按id删除if (item.Id 0) throw new Exception(未提供Id);if (table.ContainsKey(item.Id)){table.Remove(item.Id, out _);//保存快照SaveToFileT();}}/// summary/// 返回列表/// /summary/// typeparam nameT/typeparam/// returns/returnspublic ListT GetListT() where T : CacheDBEntityBase, new(){var table GetTableT();//这里先序列化成json再序列化为指定类型不然会出现值为空的情况var json table.ToJson();var data json.ToEntityDictionarylong, T();return data.Select(x x.Value).ToList();}/// summary/// 按id查询单条/// /summary/// typeparam nameT/typeparam/// param nameid/param/// returns/returnspublic T FindT(long id) where T : CacheDBEntityBase, new(){var table GetTableT();var mod table[id] as T;return mod;}/// summary/// 取得表/// /summary/// typeparam nameT/typeparam/// returns/returnspublic ConcurrentDictionarylong, dynamic GetTableT() where T: CacheDBEntityBase,new(){//获取表名var _table typeof(T).Name;ConcurrentDictionarylong, dynamic data;//判断表是否已经存在于缓存if (!_db.ContainsKey(_table)){//保存路径var _path ${_fielpath}{_table}.json;if (File.Exists(_path)){//如果文件存在从文件读取数据到缓存var json File.ReadAllText(_path);_db[_table] json.ToEntityConcurrentDictionarylong, dynamic();}else{//如果文件不存在创建新的表_db[_table] new ConcurrentDictionarylong, dynamic();}}data _db[_table];//返回表return data;}/// summary/// 快照/// /summary/// typeparam nameT/typeparam/// returns/returnsprivate async Task SaveToFileT(){lock (lockobj){var _table typeof(T).Name;var json _db[_table].ToJson();var _path ${_fielpath}{_table}.json;Directory.CreateDirectory(_fielpath);File.WriteAllText(_path, json);}}}
}
基类
public class CacheDBEntityBase{/// summary/// 主键/// /summarypublic long Id { get; set; }/// summary/// 创建时间/// /summarypublic DateTime CreatedTime { get; set; }/// summary/// 修改时间/// /summarypublic DateTime? UpdateTime { get; set; }}
测试类 public class aa: CacheDBEntityBase{public string name { get; set; }public string name2 { get; set; }public string name3 { get; set; }public string name4 { get; set; }public string name5{ get; set; }}public class bb : CacheDBEntityBase{public string name { get; set; }}注 上面代码中的部分内容说明 ToJson 方法将实体转为json字符串 ToEntity 方法将json字符串转为指定的类型 SnowflakeId 雪花id类 用来生成id 上面代码中没有这些内容的实现请自行实现替代