博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简谈 Enterprise Library CAB 的 Backing Store
阅读量:5257 次
发布时间:2019-06-14

本文共 1134 字,大约阅读时间需要 3 分钟。

Enterprise Library 提供了 CAB(Caching Application Block) 来帮助开发人员进行数据缓存管理.

其内存缓存的实现倒也简单实用——取一个Hashtable来保存各个缓存项——跟我们自己做的一样,不过其中有个Backing Store的概念,倒是让这个缓存库一下丰富了起来.

看CAB入门文章时,常常会看到介绍它有4种存储方式:

  1. 内存存储
  2. 独立文件缓存(Isolated Storage)
  3. 数据库存储(DataBase Cache Storage)
  4. 自定义存储

看到这种排版的介绍方式,很容易就将读者导入这样的思维:独立文件存储、数据库存储和自定义存储是跟内存存储同种性质的,可以互相不依赖。

然而事实并非这样。我们来看看一文中的插图:

the interrelationships between the key classes in the Caching Application Block

 

从这张图中可以看出上面四者的关系:放在 Cache 类中的内存存储属于缓存主体,而其它几种存储方式仅仅是作为其后备存储(Backing Store)而已。

以Database cache storage为例,当我们用CAB提供的SQL脚本创建了数据库,并在Config文件中作好了相应的配置后,如无差错,程序运行时每一次执行CacheManager.Add方法,就会发现Cache数据库中对应表会多出一条记录。如果以为Get的时候也是实时从该表中取的,那就上了大当了。所谓Backing Store,就只是内存缓存的一个备份而已。备份的原因是要避免程序重启内存数据丢失从而内存缓存一并丢失的问题。

查看CAB的源代码,会发现CacheManager在初始化的时候会调用BackingStore.Load方法将Backing Storage中的数据读进内存,以后的每一次缓存项修改操作(添加、移除等),都会将Backing Storage中的数据更新。

一些头脑灵活的同学会问那每次都去新建一个CacheManager岂不是就变成完全采用Backing Storage作为缓存存储了?

答案是不会。CAB的源代码中是通过调用ServiceLocation.GetInstance()来创建CacheManager的,而ServiceLocation.GetInstance()创建的对象是单例模式的,也就是说,无论new几次,返回的都是第一次新建的那个CacheManager实例对象.

不知道EntLib下一个版本什么时候出,其文档说要将CAB改成依赖于Framework中的Cache对象的方式,期待中.

转载于:https://www.cnblogs.com/deafcat/archive/2011/12/15/Cache-and-Backing-Store-in-CAB.html

你可能感兴趣的文章
[翻译] Foo over UDP
查看>>
spring boot 入门 使用spring.profiles.active来分区配置
查看>>
【转载】构建高并发高可用的电商平台架构实践
查看>>
使用mysql函数 group_concat 一点需要注意的
查看>>
差分进化算法 DE-Differential Evolution
查看>>
JAVA I/O操作那些事之新I/O(nio)
查看>>
DS博客作业08--课程总结
查看>>
opencv读取并播放视频代码
查看>>
AIX 常用命令汇总
查看>>
Eclipse创建一个普通maven项目详细步骤
查看>>
HDU-3046 Pleasant sheep and big big wolf
查看>>
Jquery拖拽,拖动排序插件
查看>>
前端现状与趋势
查看>>
PS图层混合算法之一(不透明度,正片叠底,颜色加深,颜色减淡)
查看>>
字符串截取
查看>>
博客园win8客户端开发记录6 - 成功发布到微软应用商店
查看>>
【android】android对位图文件的支持
查看>>
mysql慢查询日志分析工具 mysqlsla(转)
查看>>
iteritems()与items()
查看>>
改ubuntu密码
查看>>