1 Core.Configuration.CacheConfig
namespace Core.Configuration
{
/// <summary>
/// 【缓存配置--类】
/// <remarks>
/// 摘要:
/// 通过该类中的属性成员实例对“appsettings.json”文件中的1个指定缓存项(键/值对)在内存或指定分布式软件中保存的保留时间等数据进行设定性读写操作,为1个指定缓存项(键/值对)在内存或指定分布式软件中保存的保留时间提供数据支撑。
/// 说明:
/// 属性成员的名称必须与JSON键/值对中的键相同,且属性成员的个数与键的个数也必须相等,
/// 否则ConfigurationBinder.Bind方法将不支持通过“appsettings.json”文件中数据库连接相关数据与当前类中的属性成员实例的设定性读写操作。
/// </remarks>
/// </summary>
public partial class CacheConfig : IConfig
{
/// <summary>
/// 【默认缓存时间】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定缓存项(键/值对)在内存或指定分布式软件中保存的默认保留时间(默认值:60分钟=1小时)。
/// </remarks>
/// </summary>
public int DefaultCacheTime { get; private set; } = 60;
/// <summary>
/// 【短期缓存时间】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定缓存项(键/值对)在内存或指定分布式软件中保存的最短保留时间(默认值:3分钟)。
/// </remarks>
/// </summary>
public int ShortTermCacheTime { get; private set; } = 3;
/// <summary>
/// 【打包文件缓存时间】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定缓存项(键/值对)在内存或指定分布式软件中保存的(JS/CSS)绑定文件中所有数据的保留时间(默认值:120分钟=2小时)。
/// </remarks>
/// </summary>
public int BundledFilesCacheTime { get; private set; } = 120;
}
}
2 Core.Configuration.DistributedCacheType
using System.Runtime.Serialization;
namespace Core.Configuration
{
/// <summary>
/// 【分布式缓存类型--枚举】
/// <remarks>
/// 摘要:
/// 该枚举实例定义了3种缓存项(键/值对)进行集中管理的方式,通过枚举实例选定其中的1种方式,实现当前程序对所有缓存项(键/值对)进行集中管理。
/// </remarks>
/// </summary>
public enum DistributedCacheType
{
/// <summary>
/// 【内存】
/// <remarks>
/// 摘要:
/// 指定通过“Microsoft.Extensions.Caching.Memory”程序集,对当前程序中所有缓存项(键/值对)进行集中管理。
/// EnumMember特性:
/// 在JSON序列化操作时把该枚举成员实例的值序列化为“memory”字符串,赋值给键/值对中的值。
/// </remarks>
/// </summary>
[EnumMember(Value = "memory")]
Memory,
/// <summary>
/// 【SqlServer】
/// <remarks>
/// 摘要:
/// 指定通过“Microsoft.Extensions.Caching.SqlServer”中间件使用“Microsoft SQL Server”数据库软件中的指定数据库中的指定表,对当前程序中所有缓存项(键/值对)进行集中管理。
/// EnumMember特性:
/// 在JSON序列化操作时把该枚举成员实例的值序列化为“sqlserver”字符串,赋值给键/值对中的值。
/// </remarks>
/// </summary>
[EnumMember(Value = "sqlserver")]
SqlServer,
/// <summary>
/// 【Redis】
/// <remarks>
/// 摘要:
/// 指定通过“Microsoft.Extensions.Caching.StackExchangeRedis”中间件使用“Redis”分页式数据库软件,对当前程序中所有缓存项(键/值对)进行集中管理。
/// EnumMember特性:
/// 在JSON序列化操作时把该枚举成员实例的值序列化为“redis”字符串,赋值给键/值对中的值。
/// </remarks>
/// </summary>
[EnumMember(Value = "redis")]
Redis
}
}
3 Core.Configuration.DistributedCacheConfig
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
namespace Core.Configuration
{
/// <summary>
/// 【分页式缓存配置--类】
/// <remarks>
/// 摘要:
/// 通过该类中的属性成员实例对“appsettings.json”文件中的1个指定分布式软件所需数据进行设定性读写操作,为当前程序与1个指定分布式数据库软件建立连接关系提供数据支撑。
/// 说明:
/// 属性成员的名称必须与JSON键/值对中的键相同,且属性成员的个数与键的个数也必须相等,
/// 否则ConfigurationBinder.Bind方法将不支持通过“appsettings.json”文件中的1个指定分布式软件所需数据进行设定性读写操作。
/// </remarks>
/// </summary>
public partial class DistributedCacheConfig : IConfig
{
/// <summary>
/// 【分布式缓存类型】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定分布式数据库软件与当前程序建立连接关系,默认指定通过“Redis”分布式数据库软件与当前程序进行数据交互操作。
/// JsonConverter特性:
/// 当前“DataConfig”类的实例通过JSON中的方法进行序列化/反序化时,需要根据字符字符串枚举方式来实例当前属性成员实例值与JSON键/值对中值的相对转换操作。
/// </remarks>
/// </summary>
[JsonConverter(typeof(StringEnumConverter))]
public DistributedCacheType DistributedCacheType { get; private set; } = DistributedCacheType.Redis;
/// <summary>
/// 【启用?】
/// <remarks>
/// 摘要:
/// 获取/设置1个值false(默认值:禁用)/true(启用),该值指示当前程序是否已经启用了1个指定分布式数据库软件与当前程序进行数据交互操作。
/// </remarks>
/// </summary>
public bool Enabled { get; private set; } = false;
/// <summary>
/// 【连接字符串】
/// <remarks>
/// 摘要:
/// 获取/设置1个连接字符串,该连接字符串只为实例化“Redis”分布式数据库软件与当前程序的连接提供数据支撑。
/// </remarks>
/// </summary>
public string ConnectionString { get; private set; } = "127.0.0.1:6379,ssl=False";
/// <summary>
/// 【方案名】
/// <remarks>
/// 摘要:
/// 获取/设置1个方案名,该连接字符串只用于实例化“Microsoft SQL Server”数据库软件中的指定表的方案名,为建立“Microsoft SQL Server”数据库软件中的指定数据库中的指定表与当前程序的连接提供数据支撑。
/// </remarks>
/// </summary>
public string SchemaName { get; private set; } = "dbo";
/// <summary>
/// 【表名】
/// <remarks>
/// 摘要:
/// 获取/设置1个表名,该连接字符串只用于实例化“Microsoft SQL Server”数据库软件中的指定表,为建立“Microsoft SQL Server”数据库软件中的指定数据库中的指定表与当前程序的连接提供数据支撑。
/// </remarks>
/// </summary>
public string TableName { get; private set; } = "DistributedCache";
}
}
4 分布式缓存运行原理
由于在开始的程序开发中由于内存资源的昂贵和稀缺,程序中的所有实例都是有生命周期的,在1个指定功能执行完成后,系统会自动销毁这些实例所占据的内存资源,从而为新的实例的产生预先腾出的所需要的内存空间。当前虽然内存资源的昂贵和稀缺得以缓解,但程序的这种产生->释放机制却根深蒂固的存在着。
基于网络数据传输的程序,需要减少把持久化数据加载的内存中的频率,从而提供程序的性能最终达到提升用户体验的目标。但这种目标的实现又与程序内存的产生->释放机制相矛盾,所以最终给出的解决方案是:通过“Redis”等特定分页式软件开辟内存空间,并以键/值对程序中所产生的实例进行集中(读/写/销毁)管理。
4.1“Microsoft.Extensions.Caching.Memory”程序集
“Microsoft.Extensions.Caching.Memory”程序集,是微软最早所提供对述问题的解决方案,但是由于功能态过于单薄,当前在程序开发中已经不太多被使用。
当程序中集成了通过“Microsoft.Extensions.Caching.Memory”程序集对缓存数据的管理,这只是为了为当前程序增加1种缓存管理的可选择性,如果简化程序定义实现可以删除该定义:“MemoryCacheManager”。
4.2 “Redis”分布式数据库软件
当前程序开发中最多被使用的对缓存数据进行管理的软件,网上有很多案例,这里不再赘述,如果简化程序定义实现,且程序需要缓存数据进行支撑,最好的解决方案是在程序中实现该定义:“DistributedCacheManager”。
4.3 “Microsoft SQL Server”数据库软件中的指定数据库中的指定表
这种解决方案的操作定义实现比较傻瓜,只要引用指定的中间件,并根据配置中的数据在“Microsoft SQL Server”数据库软件中的指定数据库中新建1个指定的表,其它的不需要任何的定义即可使用,但这种方案,也找不找几个应用案例,且只支持“Microsoft SQL Server”数据库软件,如果如果简化程序定义也可以删除配置定义中的相关属性成员:
1、public string SchemaName { get; private set; } = "dbo";
2、public string TableName { get; private set; } = "DistributedCache";
对以上功能更为具体实现和注释见230127_020shopDemo(分布式缓存数据库配置的定义实现)。