[代码积累]C#中泛型缓存的简单实现
2017-12-24 14:39
627 查看
软谋补课中,Eleven老师讲到泛型的使用技巧:泛型缓存,刚好自己项目中也有用到缓存系统参数表的信息,之前都是直接读取表数据,每个需要缓存的表需要创建一个静态类,不利于扩展,这里将Eleven老师讲的泛型缓存简单的拓展了一下,可以根据版本信息更新缓存,不多说直接上代码:
/// <summary>
/// 使用泛型实现缓存:
/// 区别于之前用字典或静态变量存储缓存,这里不同类型的“T”会被即时编译为不同的类型从而实现缓存
/// </summary>
/// <typeparam name="T">缓存的数据类型 例如用户信息表实体:UserInfo</typeparam>
public static class LisStaticCache<T> where T : class
{
/// <summary>
/// 版本:可以从数据库的表或配置文件中读取,每次取值时查询是否更新缓存
/// </summary>
private static string _version = string.Empty;
/// <summary>
/// 缓存:缓存的内容
/// </summary>
private static List<T> _genericCache = null;
/// <summary>
/// 错误信息:保存缓存数据失败时的错误信息
/// </summary>
private static string _errMsg = string.Empty;
/// <summary>
/// 数据库:该参数表所在的数据库名
/// </summary>
private static string _database = string.Empty;
/// <summary>
/// 错误信息:保存缓存数据失败时的错误信息
/// </summary>
public static string ErrMsg { get => _errMsg; set => _errMsg = value; }
/// <summary>
/// 读取缓存
/// </summary>
private static void ReadData()
{
if (string.IsNullOrEmpty(_database))
{
//从数据库或配置文件中对该类型所在数据库进行赋值
_database = ConfigurationManager.AppSettings.Get(typeof(T).Name);
}
//从数据库中读取数据并赋值给缓存
DataSet dataSet = DBHelper.SqlHelper(string.Format("select * from {0} where 1=1", typeof(T).Name), _database, ref _errMsg);
if (dataSet != null && dataSet.Tables.Count > 0)
{
_genericCache = MapEntityHelper.MapEntityList<T>(dataSet.Tables[0]).ToList();
}
}
/// <summary>
/// 获取缓存
/// </summary>
/// <returns>缓存内容</returns>
public static List<T> GetCache()
{
//判断缓存内容是否需要更新 缓存版本可以存储在数据库中或配置文件中
994f
if (_genericCache == null || ConfigurationManager.AppSettings.Get(typeof(T).Name + ".Version") != _version)
{
ReadData();
}
return _genericCache;
}
}
思路大概是这样,但是实际使用还需要针对使用场景进行优化。比如数据类型的版本信息,一般我是从数据库中单独创建的一个参数表读取的,而具体的版本是通过触发器在对应缓存表的数据增删改后让数据库自动更新。同时参数表还存储这个表所在的数据库,只有在参数表内记录了的数据表才能使用缓存等等。
/// <summary>
/// 使用泛型实现缓存:
/// 区别于之前用字典或静态变量存储缓存,这里不同类型的“T”会被即时编译为不同的类型从而实现缓存
/// </summary>
/// <typeparam name="T">缓存的数据类型 例如用户信息表实体:UserInfo</typeparam>
public static class LisStaticCache<T> where T : class
{
/// <summary>
/// 版本:可以从数据库的表或配置文件中读取,每次取值时查询是否更新缓存
/// </summary>
private static string _version = string.Empty;
/// <summary>
/// 缓存:缓存的内容
/// </summary>
private static List<T> _genericCache = null;
/// <summary>
/// 错误信息:保存缓存数据失败时的错误信息
/// </summary>
private static string _errMsg = string.Empty;
/// <summary>
/// 数据库:该参数表所在的数据库名
/// </summary>
private static string _database = string.Empty;
/// <summary>
/// 错误信息:保存缓存数据失败时的错误信息
/// </summary>
public static string ErrMsg { get => _errMsg; set => _errMsg = value; }
/// <summary>
/// 读取缓存
/// </summary>
private static void ReadData()
{
if (string.IsNullOrEmpty(_database))
{
//从数据库或配置文件中对该类型所在数据库进行赋值
_database = ConfigurationManager.AppSettings.Get(typeof(T).Name);
}
//从数据库中读取数据并赋值给缓存
DataSet dataSet = DBHelper.SqlHelper(string.Format("select * from {0} where 1=1", typeof(T).Name), _database, ref _errMsg);
if (dataSet != null && dataSet.Tables.Count > 0)
{
_genericCache = MapEntityHelper.MapEntityList<T>(dataSet.Tables[0]).ToList();
}
}
/// <summary>
/// 获取缓存
/// </summary>
/// <returns>缓存内容</returns>
public static List<T> GetCache()
{
//判断缓存内容是否需要更新 缓存版本可以存储在数据库中或配置文件中
994f
if (_genericCache == null || ConfigurationManager.AppSettings.Get(typeof(T).Name + ".Version") != _version)
{
ReadData();
}
return _genericCache;
}
}
思路大概是这样,但是实际使用还需要针对使用场景进行优化。比如数据类型的版本信息,一般我是从数据库中单独创建的一个参数表读取的,而具体的版本是通过触发器在对应缓存表的数据增删改后让数据库自动更新。同时参数表还存储这个表所在的数据库,只有在参数表内记录了的数据表才能使用缓存等等。
相关文章推荐
- [导入]C#内容分页简单实现代码及祥解
- C#内容分页简单实现代码及祥解
- 贴下百度博客自动加好友的简单代码示例!!(c#.net实现)
- c#中泛型集合类的一个简单模拟实现
- C# 简单链表的实现下(使用泛型)
- 内容分页简单实现代码及祥解(C#)
- C#内容分页简单实现代码及祥解
- C#摄像头实现拍照功能的简单代码示例
- 一个简单的JavaScript数据缓存系统实现代码
- 简单代码实现C#中运行另外一个程序
- 简单实现C#生成XML文件代码
- 一个简单的AJAX实现,基于C#的ASP.Net,包括服务器端的程序代码
- c#3.5关于JSON简单操作的实用帮助类(泛型实现)
- C# 4行代码搞定数字猜大小(简单实现)
- C#实现数据库事务处理的简单示例代码
- c#3.5关于JSON简单操作的实用帮助类(泛型实现)
- C#实现数据库事务处理的简单示例代码
- C#内容分页简单实现代码及祥解
- C#内容分页简单实现代码及详解
- 简单的中文信息处理C#实现代码片段