场景:很多时候,我们希望避开数据库,更多的使用缓存来代替直接从数据库的读取,以此来提供程序的性能。为此,我们进行了一些比较常见的封装
一、针对配置表相关的封装代码如下:
例如:什么配置信息,常见的活动配置、基础配置、系统配置、营销配置等
/// <summary>
/// 配置相关的缓存服务基类
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class BaseConfigCacheService<T> where T : ITableBase, new()
{
/// <summary>
/// 获取List
/// </summary>
/// <returns></returns>
public List<T> GetList()
{
List<T> list = null;
var CacheKey = GetCacheKey();
var objValue = CacheHelper.GetCache(CacheKey);
if (objValue == null)
{
CacheHelper.RemoveKeyCache(CacheKey);
list = GetListForDB();
if (list != null && list.Any())
{
CacheHelper.SetCache(CacheKey, list, DateTime.Now.AddHours(2));
}
}
else
{
list = (List<T>)objValue;
}
return list;
}
/// <summary>
/// 通过数据库获取List
/// </summary>
protected abstract List<T> GetListForDB();
/// <summary>
/// 获取List
/// </summary>
/// <param name="match">条件</param>
/// <returns></returns>
public List<T> GetList(Predicate<T> match)
{
var list = GetList();
if (list != null && list.Any() && match != null)
{
return list.FindAll(match);
}
return null;
}
/// <summary>
/// 获取实体
/// </summary>
/// <param name="match">条件</param>
public T GetModel(Predicate<T> match)
{
var list = GetList();
if (list != null && list.Any() && match != null)
{
return list.Find(match);
}
return default(T);
}
/// <summary>
/// 更新配置
/// </summary>
public void Update()
{
CacheHelper.RemoveKeyCache(GetCacheKey());
}
/// <summary>
/// 获取CacheKey
/// </summary>
/// <returns></returns>
public string GetCacheKey()
{
var objModel = new T();
return $"CfgPrefix_{objModel.GetDBName()}_{objModel.GetTableName()}";
}
}
public class CoursesConfigCacheService : BaseConfigCacheService<CoursesConfigEntity>
{
protected override List<CoursesConfigEntity> GetListForDB()
{
//从数据库中读取数据
var list = new List<CoursesConfigEntity>
{
new CoursesConfigEntity
{
Id = 1,
CoursesType = 100,
LongTime = 40,
Remark = "这是正式课"
},
new CoursesConfigEntity
{
Id = 2,
CoursesType = 101,
LongTime = 50,
Remark = "这是业余课"
}
};
return list;
}
}
调用端使用:
//读取配置信息
{
var configService = new CoursesConfigCacheService();
//获取所有的配置
var allList = configService.GetList();
//获取指定的配置列表
var filterList = configService.GetList(t => t.LongTime == 40);
//获取指定的配置
var configModel = configService.GetModel(t => t.Id == 2);
//更新配置信息
configService.Update();
}
二、针对记录表相关的封装代码如下:
例如:一些和用户相关的记录表,用户订单表、学生的选课记录等
/// <summary>
/// 记录相关的缓存服务基类
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class BaseRecordCacheService<T> where T : ITableBase, new()
{
/// <summary>
/// 获取列表
/// </summary>
/// <returns></returns>
public List<T> GetList(long id)
{
List<T> list = null;
var CacheKey = GetCacheKey(id);
var objValue = CacheHelper.GetCache(CacheKey);
if (objValue == null)
{
CacheHelper.RemoveKeyCache(CacheKey);
list = GetListForDB(id);
if (list != null && list.Any())
{
CacheHelper.SetCache(CacheKey, list, DateTime.Now.AddHours(2));
}
}
else
{
list = (List<T>)objValue;
}
return list;
}
/// <summary>
/// 通过数据库获取List
/// </summary>
/// <param name="id">Id</param>
protected abstract List<T> GetListForDB(long id);
/// <summary>
/// 条件获取列表
/// </summary>
/// <param name="id"></param>
/// <param name="match">匹配条件</param>
/// <returns></returns>
public List<T> GetList(long id, Predicate<T> match)
{
var list = GetList(id);
if (list != null && list.Any() && match != null)
{
return list.FindAll(match);
}
return null;
}
/// <summary>
/// 获取实体
/// </summary>
/// <param name="id"></param>
/// <param name="match">匹配条件</param>
/// <returns></returns>
public T GetModel(long id, Predicate<T> match)
{
var list = GetList(id);
if (list != null && list.Any() && match != null)
{
return list.Find(match);
}
return default(T);
}
/// <summary>
/// 更新记录
/// </summary>
/// <param name="id">用户Id</param>
public void Update(long id)
{
CacheHelper.RemoveKeyCache(GetCacheKey(id));
}
/// <summary>
/// 获取CacheKey
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public string GetCacheKey(long id)
{
var objModel = new T();
return $"CfgPrefix_{objModel.GetDBName()}_{objModel.GetTableName()}{id}";
}
}
public class StudentCoursesReocrdCacheService : BaseRecordCacheService<StudentCoursesReocrdEntity>
{
protected override List<StudentCoursesReocrdEntity> GetListForDB(long studentId)
{
//从数据库中读取数据
var list = new List<StudentCoursesReocrdEntity>
{
new StudentCoursesReocrdEntity
{
Id = 1,
CoursesId = 1,
StudentId = studentId
},
new StudentCoursesReocrdEntity
{
Id = 2,
CoursesId = 2,
StudentId = studentId
},
};
return list;
}
}
调用端代码:
//读取记录信息
{
var recordService = new StudentCoursesReocrdCacheService();
var studentId = 2;
//获取当前学生所有的记录
var allList = recordService.GetList(studentId);
//获取当前学生指定的记录列表
var filterList = recordService.GetList(studentId, t => t.CoursesId == 2);
//获取当前学生指定的记录
var recordModel = recordService.GetModel(studentId, t => t.Id == 2);
//更新当前学生记录信息
recordService.Update(studentId);
}
完整的代码Demo下载:https://pan.baidu.com/s/1XhTPtFCUq28rbLwXDwaBTw 0xwx