RIA 富客户端数据加载原则 - 缓存原则

来源:互联网 发布:mac os x lion 编辑:程序博客网 时间:2024/06/08 19:46
Silverlight/WCF架构下,数据的缓存/服务器的访问/逻辑的安置原则
给team member做的ppt,这里直接复制过来。

数据缓存原则

为什么要缓存?

**缓存不是必需的**
 
加快程序执行速度
减轻数据库压力
减少等待时间
减少网络占用
 
总之,缓存是一种用空间(甚至是分布式的空间占用)换取时间(性能)的做法

 

缓存有什么风险?有何坏处?

数据一致性问题(不统一)
占用额外的内存/磁盘
增加代码复杂度(需要加载/同步/甚至按需决定读取缓存还是数据库)
 
最大的问题就是数据一致性问题,这也是是否使用缓存的最最主要决定因素
 

如何规避风险?

构建完善的(可接受的)数据同步机制
根据数据的实时性/一致性/安全性要求以及数据量的实际情况,为缓存分级别,或决定是否使用缓存
 

缓存分哪些类别?

个人划分了以下级别:
数据库级别(严格上说,不属于缓存,但可以起到类似作用)
 内存数据库(数据库提供同步机制,对开发人员透明,需要DBA设置)
 数据分区(将常用数据分区并放到快速磁盘上,如SSD,提高IO速度)
 
应用服务器级别
 服务器/框架提供的缓存,如http缓存,EF提供的查询结果的缓存
 需要编码实现的,如ASP.NET的Cache对象,如PDL(数据持久层)
 
客户端磁盘级别
 针对富客户端或桌面应用,将数据存在本地磁盘上,每次优先加载缓存数据
 
客户端内存级别
 从服务器获取数据后放在内存中,在程序运行周期内使用
 

创建缓存有哪些机制?

应用程序启动时加载全部数据
 程序启动速度降低
 整体性能最好,开发难度最低
 占用内存最大
 
第一次使用时,加载全部数据
 减少不必要的内容占用
 性能比第一种略差,但程序启动时间短
 开发难度略高
 
使用时,加载所需数据并缓存
 开发难度大,不建议使用
 需要额外的检查/合并机制
 性能不见得好于第一次使用时全部加载
 

更新缓存的机制有哪些?

程序重新启动/部署时更新
设定标志位更新
添加时间戳,定时更新
添加时间戳,每次调用延长时间戳,超时后更新(调用延迟更新)
每次更新(这不叫缓存,但项目中,确实有这么干的)
 

如何界定使用何种缓存?

界定使用何种缓存,包括使用的缓存种类,构建机制和更新机制
 
高实时性,要求绝对统一的数据
 不缓存,或做数据库级别的内存数据库/快速磁盘分区
 
较少变化的数据,且对业务影响不大
 服务器/客户端,全部/第一次使用加载,调用延迟更新,并设定时间戳强制定时更新
 
几乎不变化的数据
 客户端磁盘缓存,重新部署后更新/设定标志位通知更新
 
数据量大,被使用的地方有限,实时性要求不高
 客户端内存第一次使用时加载,客户端程序重新启动时更新。
 
定义一个缓存机制:
 
  
  
服务器/客户端
  
  
  
缓存类型
  
  
  
加载方式
  
  
  
更新机制
当制定了一个缓存机制之后,反问一下自己:
  它提高程序的性能了吗?
  耗费的内存/开发时间值得吗?
  它会影响数据的完整性/可靠性吗?(业务上能接受吗?)
  它会给开发/测试/support带来新的问题吗?
 
需要为性能/Cost/实时性找出一个平衡点。
 
 
原创粉丝点击