智能字典缓存 ISmartDictionaryCache-- ESBasic 可复用的.NET类库(18)

简介: 1.缘起:    假设我们有一个会员管理系统,需要向各方提供查询会员基础资料的功能。会员一经注册,其基础资料就将不再发生变化(如会员帐号、身份证ID、注册时间等等)。    基于这样的需求,我们可以将会员的基础资料“永久地”缓存在内存中,从而提升对任何一个会员基础资料的查询速度。

1.缘起:

   假设我们有一个会员管理系统,需要向各方提供查询会员基础资料的功能。会员一经注册,其基础资料就将不再发生变化(如会员帐号、身份证ID、注册时间等等)。

   基于这样的需求,我们可以将会员的基础资料“永久地”缓存在内存中,从而提升对任何一个会员基础资料的查询速度。

   我设计了ESBasic.ObjectManagement.Cache.ISmartDictionaryCache来对这种性质的对象进行缓存。

    职能字典缓存的形象示意图如下:

 

2.适用场合:

   在使用ISmartDictionaryCache之前,必须满足以下条件:

(1)将要被缓存的每个对象都有唯一的ID

(2)被缓存的对象一旦“出生”就是恒定不变的。

(3)对象永远不会被销毁,或者说即使被销毁了在缓存中仍然存在也无关紧要。

 

3.设计思想与实现

ISmartDictionaryCache的接口定义如下:

    public   interface   ISmartDictionaryCache < Tkey ,TVal >
    {
        
IObjectRetriever < Tkey, TVal >  ObjectRetriever {  set ; }
        
int  Count {  get ; }


        
void  Initialize();        

        
///   <summary>
        
///  Get 如果缓存中不存在id对应的object,则采用ObjectRetriever提取一次,如果仍然提取不到则返回null。
        
///   </summary>        
        TVal Get(Tkey id);

        
void  Clear();

        
///   <summary>
        
///  HaveContained 当前容器是否已经存在目标对象。
        
///   </summary>        
         bool  HaveContained(Tkey id);                 

        
IList < TVal >  GetAllValListCopy();

        
IList < Tkey >  GetAllKeyListCopy();
    }

 

 

ISmartDictionaryCache依赖于我们前面介绍的IObjectRetriever接口,这就表示智能字典缓存是通过IObjectRetriever来将对象加载到缓存中来的。

      Initialize方法执行时,会将所有对象都加载到内存中。

   当外部调用Get方法时,如果目标对象在缓存中不存在,缓存则会调用IObjectRetriever加载目标对象。如果目标对象在持久化存储中都不存在,就会返回null

   注意,ISmartDictionaryCache并没有提供任何将对象移除缓存的方法,这表明对象一旦加载到缓存中,就将一直存在直到系统停止运行。

      ISmartDictionaryCache接口的实现是简单的。同样的,SmartDictionaryCache可以在多线程的环境中使用,因为我们在实现时对内部集合ditionary进行了加锁控制。

 

4. 使用时的注意事项

(1)在使用智能字典缓存时,要考虑到对象的数量和对象的尺寸大小的问题。因为如果对象的数量巨大,而且对象的个头也很大,那将占用很多的内存空间。

(2)如果缓存中的对象被访问的概率不是一样的,而是由明显的差别,比如有绝大部分对象从来不被访问,有的对象被密集访问,那这个时候可以考虑使用我们后面即将介绍的“热缓存”IHotCache来代替智能字典缓存。

(3)智能字典缓存在初始化时调用了IObjectRetriever接口的RetrieveAll方法,但是正如我们在介绍IObjectRetriever时提到的,在实现IObjectRetriever接口的RetrieveAll方法,不一定要真正的返回所有的对象,你可以只返回那些你认为将会被使用到的对象。甚至,你可以返回一个不包含任何元素的集合,这样,智能字典缓存就只会缓存那些至少被访问过一次的对象了。在某些系统中,这也许可以有效地节省一些内存空间。

 

5.扩展

   智能字典缓存ISmartDictionaryCache只能缓存恒定不变的对象?嗯,这一点是千真万确的。但是,有些情况我们可以灵活处理。

   还是以我们在缘起部分提到的那个例子继续讲解,让我们在其基础上,再假设一个会员(Member)的绝大部分资料是在注册时就确定下来不会发生改变的,但是有小部分资料(比如对应这数据库中Member表中的几个列)是会发生变化的,比如会员的额度、密码、最后一次访问时间等这样的信息。当外部向系统请求这些非恒定信息时,我们就无法从智能字典缓存中获取了,因为智能字典缓存中的目标会员的这些字段可能已经不是正确的值了。

   基于这样的情况,我们仍然是可以使用智能字典缓存的。这里我提出一个SubObject(“子对象”)的概念。所谓“子对象”就是由某对象的一部分属性构成的一个新的对象。

所以,我们可以将Member中恒定不变的部分抽出来形成一个子对象,如SubMember,那么SubMember就符合了使用ISmartDictionaryCache进行缓存条件。当外部要查询会员的基础资料属于恒定部分时,我们就可以非常快速地从ISmartDictionaryCache获取返回。

   对于像Member这样由恒定部分和非恒定部分构成的对象来说,除了使用这种方式进行缓存之外,还有其它的办法。但由于超出了本节的主题,我们会在其它小节进行介绍。

 

注: ESBasic已经开源,点击这里下载源码。
    
ESBasic开源前言

 

 

 

目录
相关文章
|
2月前
|
人工智能 缓存 Kubernetes
.NET 9 首个预览版发布:瞄准云原生和智能应用开发
.NET 9 首个预览版发布:瞄准云原生和智能应用开发
|
22天前
|
缓存 NoSQL Java
实现Java应用的智能缓存管理策略
实现Java应用的智能缓存管理策略
|
22天前
|
人工智能 开发框架 Devops
.NET技术概览:** 本文探讨了.NET的核心特性,包括多语言支持、Common Language Runtime、丰富的类库和跨平台能力,强调其在企业级、Web、移动及游戏开发中的应用。
【7月更文挑战第4天】.NET技术概览:** 本文探讨了.NET的核心特性,包括多语言支持、Common Language Runtime、丰富的类库和跨平台能力,强调其在企业级、Web、移动及游戏开发中的应用。此外,讨论了.NET如何通过性能优化、DevOps集成、AI与ML支持以及开源策略应对未来挑战,为开发者提供强大工具,共创软件开发新篇章。
21 3
|
22天前
|
人工智能 前端开发 Devops
NET技术在现代开发中的影响力日益增强,本文聚焦其核心价值,如多语言支持、强大的Visual Studio工具、丰富的类库和跨平台能力。
【7月更文挑战第4天】**.NET技术在现代开发中的影响力日益增强,本文聚焦其核心价值,如多语言支持、强大的Visual Studio工具、丰富的类库和跨平台能力。实际应用涵盖企业系统、Web、移动和游戏开发,以及云服务。面对性能挑战、容器化、AI集成及跨平台竞争,.NET持续创新,开发者应关注技术趋势,提升技能,并参与社区,共同推进技术发展。**
18 1
|
18天前
|
开发框架 .NET API
.NET Core 和 .NET 标准类库项目类型有什么区别?
在 Visual Studio 中,可创建三种类库:.NET Framework、.NET Standard 和 .NET Core。.NET Standard 是规范,确保跨.NET实现的API一致性,适用于代码共享。.NET Framework 用于特定技术,如旧版支持。.NET Core 库允许访问更多API但限制兼容性。选择取决于兼容性和所需API:需要广泛兼容性时用.NET Standard,需要更多API时用.NET Core。.NET Standard 替代了 PCL,促进多平台共享代码。
|
2月前
|
C# 数据安全/隐私保护
一款实用的.NET Core加密解密工具类库
一款实用的.NET Core加密解密工具类库
|
2月前
|
缓存 C# Windows
一款.NET开源的小巧、智能、免费的Windows内存清理工具 - WinMemoryCleaner
一款.NET开源的小巧、智能、免费的Windows内存清理工具 - WinMemoryCleaner
111 0
|
7月前
|
存储 文字识别 C#
一个基于百度飞桨封装的.NET版本OCR工具类库 - PaddleOCRSharp
一个基于百度飞桨封装的.NET版本OCR工具类库 - PaddleOCRSharp
190 0
|
10天前
|
canal 缓存 NoSQL
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;先删除缓存还是先修改数据库,双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
|
2天前
|
缓存 NoSQL 数据库
在高并发场景下,如何保证Redis缓存和数据库的一致性
在高并发场景下,如何保证Redis缓存和数据库的一致性