nopCommerce_4.4功能实现详解-----第16章 核心层缓存定义实现

下面从第16~18章将按照自底向上的开发模式来解释,“nopCommerce4.3”程序是通过那些定义来实现,使用Redis内存数据库来缓存“nopCommerce”程序中的数据,第14章将会解释“nopCommerce”程序所有的缓存具体定义的核心层是怎样来具体定义和实现的。

“nopCommerce4.3”程序是最后一个使用常规定义方式使用Redis内存数据库来缓存“nopCommerce”程序中的数据,在之后的“nopCommerce4.4”程序中将使用DistributedCache定义方式使用Redis内存数据库来缓存“nopCommerce”程序中的数据,下面的解释是根据“nopCommerce4.3”程序中代码。

0033、NopCachingDefaults、CacheKey、RedisDatabaseNumber

(1)、NopCachingDefaults类为缓存键/值对提供了两个默认的参数实例设置:1、默认缓存时间。2、指定实体实例的一/多个默认缓存键。

(2)、CacheKey类的定义通过缓存键字符串、缓存键格式字符串式、前缀字符串,及其缓存数据在内存中被保留时间等参数实例,来规范了缓存键(CacheKey)实例所具有的特性。

(3)、NopCustomerDefaults枚举定义了三种方式。这些三种方式都可以使当前程序与Redis软件内存数据库建立连接,并根据枚举指定的方式调用该方式所包含的API方法,调用Redis软件内存数据库中的缓存数据,从而实现当前程序与Redis软件内存数据库的交互操作。

0034、ILocker、IstaticCacheManager、MemoryCacheManager

(4)、MemoryCacheManager类同时继承于Ilocker和IstaticCacheManager接口。该类通过微软所提供实例,及其这些实例的API缓存方法,该类自定义和扩展了自己缓存方法,以实现把当前程序中的数据进行缓存存储的目的。

该类是IStaticCacheManager接口实例的具体实现之一,它提升了“nopCommerce”程序的健壮性、容错性,在实际开发中如果确认要使用Redis内存数据作为程序中数据的缓存,那么该个体实现类是可以不定义的,即只要修改好相应的配置,可以删除该实现类的定义,也不影响“nopCommerce”程序的正常执行,但是“nopCommerce”程序的默认设置是使用该实例的操作对程序中的数据进行缓存,设置信息见下图:

首先在Nop.Web.Framework.Infrastructure.DependencyRegistrar.Register方法的定义中MemoryCacheManager实例并不首选项(见下图), 其次MemoryCacheManager类相对于RedisCacheManager类从定义实现的逻辑和具体实现的复杂性、重视程度等方面,可以很直接的看出前者比者存在着明显的不如,这也下本人认为可以被删除的原因,但是开发者如果移植缓存定义时,保留MemoryCacheManager类的定义对程序的健壮性、容错性而言则是不可或缺的。

0035、ISettings、CachingSettings

(5)、CachingSettings类继承于ISettings接口。该类定义了三个属性,通过选择其中的一个来确认缓存键/值对在内存中的保留时间。

0036、IRedisConnectionWrapper、RedisConnectionWrapper

 (6)、RedisConnectionWrapper类继承于IRedisConnectionWrapper接口。该类通过Redis所提供实例及其这此实例的API缓存方法,该类自定义和扩展了自己缓存方法,以实现把当前程序中的数据进行缓存存储的目的, 它定义实现“nopCommerce”程序与Redis软件基本的连接和操作设置,为“nopCommerce”程序与Redis软件内存数据库进行缓存数据的交互操作提供相应的支撑方法。

0037、ReaderWriteLockDisposable、ReaderWriteLockType、NopDataProtectionDefaults

(7)、ReaderWriteLokeType枚举定义了三种读写操作,或者三种读写操作的操作状态,其它方法通过指定其中的一个,用来确认一个实例及其数据所处读写的操作状态。。

(8)、NopDataProtectionDefaults类定义了数据保护密钥在Redis内存数据库中的默认缓存键,数据保护密钥及其值所构建的键/值对,由于与安全实现和操作相关,所以该键/值对在程序是极其特殊的存在,在实现具体表面为以该键/值需要单列出来进行操作或调用的设置。并且由于该键/值对的特殊性,该类及其所有实例都被定义为静态的,所以该及其所有实例,存在于当前程序执行的整个生命周期中,甚至之外,因为数据默认的缓存时间为60分钟,即1小时。

(9)、ReaderWriteLockDisposable类定义了,如果存在多个线程同时进行读锁操作,该类通过小读写锁操作实例来统一的管理程序缓存在Redis内存数据库中的数据,其它实例方法调用该类实例,对键/值对数据进行缓存操作,该类更为重要的作用是可以通过该实例来统一的显式销毁和释放Redis内存数据库中的指定的键/值对数据。

0038、IStaticCacheManager、RedisCacheManager

(10)、RedisCacheManager类定义通过Redis内存数据库所提供实例及其这此实例的API缓存方法,该类自定义和扩展了自己的缓存方法,以实现把当前程序中的数据进行缓存存储的目的。

1、该类是IStaticCacheManager接口实例的具体实现之一,它提确认要使用Redis内存数据做为程序中数据的缓存,在配置的默认值限定,该实现类实例是不被启用的,只有修改配置的默认值,才能够让Redis内存数据库做为程序中数据的缓存(见下图)。

2、“nopCommerce”程序实际上是通过请求操作,控制Redis内存数据库来缓存那些键/值对数据的。在启用了Redis内存数据库后,它所键/值对数据是根据浏览器中不同页面的请求,隐式更新或者更换Redis内存数据库所缓存键/值对数据,即Redis内存数据库所缓存所有的键/值对数据,其中的一些生命周期并不是并不能达到在内存中的默认保留时间(60分钟),而会在下一个不同页面的请求发出后,清理出这些的键/值对数据,同时Redis内存数据库会隐式的缓存一些新的键/值对数据,为当前新页面的请求操作提供缓存数据支撑。

3、“nopCommerce”程序对Redis内存数据库缓存操作的定义,从性能、健壮性、扩展性和可移植性等方面来说都得到了很好的兼顾,同时Redis内存数据库所缓存所有的键/值对数据的生命周期,是由请求操作和默认保留时间进行双控制,且请求操作的控制权限高于默认保留时间。为了兼顾上述的这此特性,在实现逻辑、具体实现定义等方面形成了相对复杂的实现定义体系。

0039、PerRequestCache

(11)、PerRequestCache类在“nopCommerce4.2”中被单独定义为“PerRequestCacheManager”类,而 “nopCommerce4.3”中被定义为RedisCacheManager类的嵌套类,名称也改变为“PerRequestCache”。如果对“nopCommerce”程序源代码有一定的了解,就会很容易的发现“nopCommerce”的开发者很喜欢和习惯使用嵌套类,这种定义方式,这种定义方式使用程序的实现逻辑显得更加明确、简单和直接,但是嵌套类这种定义方式,让本人从使用习惯上来说总是有一点不自然感觉,本人更为习惯把不同的实现分割定义在不同的类文件中,例如:“nopCommerce4.2”中“PerRequestCacheManager”类,这种被单独定义的方式。

1、该类是一个嵌套类,主要是通一个指定的Http上下文访问(请求)实例,来控制Redis软件指定编号内存数据中所存储的所有键/值对数据的生命周期。

2、在浏览器跳转到指定页面时,Http上下文访问(请求)实例会通过该类中的方法,把该页面后继操作,所需要的所有键/值对数据缓存到Redis软件指定编号内存数据中。

3、在浏览器执行该页面后继操作,跳转出该页面时,Http上下文访问(请求)实例会通过该类中的方法,把Redis软件指定编号内存数据中,所缓存的该页面键/值对数据,进行销毁和释放操作。

4、在实际执行过程中Http上下文访问(请求)实例,来缓存、销毁和释放指定页面键/值对数据操作,更为重要的是Http上下文访问(请求)实例,销毁和释放指定页面键/值对数据的操作控制权限,高于保留时间控制权限,即如果指定页面键/值对数据在保留时间到期前,跳转出该页面,程序会通过PerRequestCache实例中的方法销毁和释放指定页面键/值对数据。

 5、在绝大部分实际操作中嵌套类实例(PerRequestCache实例)的销毁和释放操作的控件权限,是大于外部类实例(RedisCacheManager实例)的销毁和释放操作的控件权限的,因为除非极端情况下,浏览器中的一个指定页面不会1个小时内都不执行跳转操作。

(13)、重构Nop.Web.Framework.Infrastructure.DependencyRegistrar.Register方法。

(14)、在语句if (config.RedisEnabled && config.UseRedisForCaching)、builder.RegisterType<RedisCacheManager>().As<IStaticCacheManager>().InstancePerLifetimeScope();设置断点,按F5执行程序后,可以很直接的看出config.RedisEnabled和config.UseRedisForCaching实例的值都为true

    (15)、总结:

        RedisCacheManager类定义是“nopCommerce”程序中核心层缓存定义实现的重点和难点,在核心层缓存定义中从实现逻辑和具体实现上来说,整个核心层缓存的定义除了MemoryCacheManager类外(MemoryCacheManager类实例只有内存缓存保留时间进行单独控制),都是为RedisCacheManager类定义及其实现提供支撑的,由于RedisCacheManager类实例的Http上下文访问(请求)实例和内存缓存保留时间的双控制体系, MemoryCacheManager类的定义从实现逻辑和具体实现上,实现难度和复杂性更加加剧。

对以上功能更为具体实现和注释见21-06-24_Nop4.4(019_核心层缓存定义实现完成,构建后无语法错误产生)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值