在系统架构设计中,使用缓存是最常用的降低数据库负载和提升性能的策略,缓存的主要目的是减少对数据库的Read操作。但是在不同的情况下,我们需要使用不同形式的缓存。
比如,如果数据表中的数据是静态的、不会发生变化的,那就非常容易,我们只需要在系统启动的时候,将其加载到内存,以后每次从内存读取数据即可。
再比如,数据表中的数据会发生变化(增删改),但是变化的频率非常低,而恰巧我们的系统对数据实时性的敏感度也不是特别高,那我们可以使用定时刷新的缓存,DataRabbit 中也内置了对这种缓存的支持,可以参见 DataRabbit 轻量的ORM框架(16)-- Entity缓存 。
再比如,数据表中的记录非常多,并且修改方面只会有Insert操作,那么我们可以使用HotCache,把那些经常使用的记录缓存在内存中,并且设定超时机制。HotCache我们会在后面介绍。
再比如,某个数据表的修改经常是Insert和Update操作,但是无论如何Update,每条记录有些固定栏位的值都是不会发生变化的,那我们可以把这些不会发生变化的栏位封装在一个【子对象】中,然后在内存中缓存这些子对象。
举了这么多例子,现在我们进入本文正题,假设我们的某个数据表中的数据会发生变化(增删改),但是变化的频率比较低,但是我们的系统对这个表的数据的实时性的敏感度也特别高,那这时候我们就需要用到【实时同步的实体缓存】,这个缓存中的数据在任何时候都与数据表中的数据是完全一致的。
DataRabbit 中的SyncEntityCache就是这样的缓存。
当然,使用这样的实时同步缓存有一个前提是必须保证的,那就是对目标数据表的修改都必须经由SyncEntityCache来进行,这个前提应该还是比较容易保证的。
我们来看看ISyncEntityCache接口的内容:
该接口有两个泛型参数:TPKey和TEntity,TPKey表示数据表主键的类型,TEntity就是目标Entity的类型。
其三个属性分别是:
TransactionScopeFactory 表明目标数据表位于哪个数据库中。
PKeyName 即主键列的名称。
PKeyAutoIncreased 表示主键是否为自增类型。
然而,能被缓存的Entity必须实现ISyncCachedEntity接口:
基接口ICachedEntity的GetID()方法用于返回Entity的主键字段的值。ISyncCachedEntity继承了ICloneable接口,表明Entity是必须可以复制的,继承这个接口的缘由后面会介绍到。
当系统启动时,我们调用Initialize方法从数据库中加载目标表的所有记录。接着我们就可以通过GetEntityCopy()方法和GetEntityCopyList()方法来读取需要的Entity。注意这两个方法的名称中包含了“Copy”,这表明它们会返回缓存的Entity的副本。所以,即使你对返回的副本进行修改,也不会影响到缓存中的Entity。
显然,这两种方法的效率会因为Entity的clone而有轻微降低。但是,如果你能保证读取的Entity仅用于Read,那么你可以调用GetEntityList4Read()这个效率更高的方法,它将直接返回缓存中的Entity。
另外,你看到ISyncEntityCache提供了基本的增删改的方法,我们必须调用这些方法来修改目标数据表中的记录,而且这些方法会自动同步缓存中的Entity使其与数据库中一致。
最后,ISyncEntityCache提供了Reload()方法,该方法用于目标数据表中的记录在意外的情况下发生修改时(即修改不是通过ISyncEntityCache进行的),手动刷新缓存以获得与数据库中的数据完全的一致性。
DataRabbit.Application.Cache.SyncEntityCache 类实现了ISyncEntityCache接口,并且这个实现是线程安全的,你可以在多线程的环境下放心使用。
DataRabbit3.0及以上版本对上述策略都给予了充分的支持,你可以下载最新版本试试。
关于DataRabbit的更多信息目录,参见这里。
分享到:
相关推荐
5:先执行缓存数据后执行请求数据 (缓存性能) 6:使用状态模式 观察者模式更好的处理多线程 最初的想法:网络优化开发框架 (移除任务未完成) 网络稳定,系统运行稳定性,大内存消耗稳定,长时间运行稳定性 ...
缓存、缓存算法和缓存框架简介 - 文章 - 伯乐在线.pdf 来自http://blog.jobbole.com/30940/
优点: 1.可将多张小图解码后存储到同一张大图上,在同屏渲染多图时,效率极高; 2.支持mmap内存映射,高效的I/O操作,减少一次文件拷贝操作 3.减少内存占用; 支持Byte Alignment字节对其,渲染过程中,避免执行CA::...
目录结构: app:网站系统目录 ---common:网站配置目录 ---tpl:网站模板目录 ---logs:网站日志目录 ---cache:网站缓存目录 ---libs:网站系统文件目录 jsphp:jsphp框架目录 ---tpl:框架模板目录 ---libs:框架...
Java数据结构-->框架-->Java中间件,缓存JAVA核心知识点整理--》从Java基础-->Java数据结构-->框架-->Java中间件,缓存JAVA核心知识点整理--》从Java基础-->Java数据结构-->框架-->Java...
php轻量型框架目录结构: app:网站系统目录 ---common:网站配置目录 ---tpl:网站模板目录 ---logs:网站日志目录 ---cache:网站缓存目录 ---libs:网站系统文件目录 jsphp:jsphp框架目录 ---tpl:框架...
主从同步:Redis支持主从同步,即可以将数据复制到任意数量的从服务器。这一特性使得Redis能够实现数据的备份和恢复,提高系统的可用性和可靠性。 Redis的应用场景非常广泛,包括但不限于: 缓存:Redis常被用作
微信小程序开发-教案-6.4-教案-数据缓存.docx
数据库优化,详细介绍缓存对象与数据,一种优化手段。
Swift 版本的轻量级磁盘缓存框架。.zip,Delightful on-disk cache (written in Swift)
金民一期婚姻管理测试系统_开发框架功能点-分布式缓存.pdf金民一期婚姻管理测试系统_开发框架功能点-分布式缓存.pdf金民一期婚姻管理测试系统_开发框架功能点-分布式缓存.pdf金民一期婚姻管理测试系统_开发框架功能...
行业分类-设备装置-写缓存的数据同步方法及装置.zip
计算机前端-实战.aravel框架4-02.缓存操作.wmv
使用sqlite数据库本地缓存
仿redis缓存Java版轻量级缓存组件LocalCache,基于JVM内存实现数据缓存及过期机制
SPTPersistentCache 一个LRU缓存管理框架,可以设置缓存数据有效时间和缓存自动回收。
Uncode-DAL是一个功能全面的Java数据访问层组件,它深度整合了MyBatis、Spring JDBC以及Hibernate等主流ORM框架,致力于为开发者提供一套简便、高效的数据操作解决方案。该组件支持多数据源配置,能够实现读写分离、...
Android图片框架Glide-3.7.0(最新,很强大),超好用的图片框架(包含jar和源码) Glide 是一个高效、开源、 Android设备上的媒体管理框架,它遵循BSD、MIT以及Apache 2.0协议发布。Glide具有获取、解码和展示视频...
EhCache EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。 主要的特性有: 1. 快速. 2. 简单. 3. 多种缓存策略 4. 缓存数据有两级:内存和磁盘,因此无需担心容量...
C#版的Hibernate,本来想...这次源码不仅有生成器的,还有CSHibernate组件的源码,以后没什么大问题是不会改了,还要再改就不是轻量框架了,还不如去用企业库或者linq。 欢迎向我邮箱提交BUG。 email:173023135@qq.com