Silverlight/WCF架构下,数据的缓存/服务器的访问/逻辑的安置原则
给team member做的ppt,这里直接复制过来。
数据缓存原则
为什么要缓存?
**缓存不是必需的**
加快程序执行速度
减轻数据库压力
减少等待时间
减少网络占用
总之,缓存是一种用空间(甚至是分布式的空间占用)换取时间(性能)的做法
缓存有什么风险?有何坏处?
数据一致性问题(不统一)
占用额外的内存/磁盘
增加代码复杂度(需要加载/同步/甚至按需决定读取缓存还是数据库)
最大的问题就是数据一致性问题,这也是是否使用缓存的最最主要决定因素
如何规避风险?
构建完善的(可接受的)数据同步机制
根据数据的实时性/一致性/安全性要求以及数据量的实际情况,为缓存分级别,或决定是否使用缓存
缓存分哪些类别?
个人划分了以下级别:
数据库级别(严格上说,不属于缓存,但可以起到类似作用)
内存数据库(数据库提供同步机制,对开发人员透明,需要DBA设置)
数据分区(将常用数据分区并放到快速磁盘上,如SSD,提高IO速度)
应用服务器级别
服务器/框架提供的缓存,如http缓存,EF提供的查询结果的缓存
需要编码实现的,如ASP.NET的Cache对象,如PDL(数据持久层)
客户端磁盘级别
针对富客户端或桌面应用,将数据存在本地磁盘上,每次优先加载缓存数据
客户端内存级别
从服务器获取数据后放在内存中,在程序运行周期内使用
创建缓存有哪些机制?
应用程序启动时加载全部数据
程序启动速度降低
整体性能最好,开发难度最低
占用内存最大
第一次使用时,加载全部数据
减少不必要的内容占用
性能比第一种略差,但程序启动时间短
开发难度略高
使用时,加载所需数据并缓存
开发难度大,不建议使用
需要额外的检查/合并机制
性能不见得好于第一次使用时全部加载
更新缓存的机制有哪些?
程序重新启动/部署时更新
设定标志位更新
添加时间戳,定时更新
添加时间戳,每次调用延长时间戳,超时后更新(调用延迟更新)
每次更新(这不叫缓存,但项目中,确实有这么干的)
如何界定使用何种缓存?
界定使用何种缓存,包括使用的缓存种类,构建机制和更新机制
高实时性,要求绝对统一的数据
不缓存,或做数据库级别的内存数据库/快速磁盘分区
较少变化的数据,且对业务影响不大
服务器/客户端,全部/第一次使用加载,调用延迟更新,并设定时间戳强制定时更新
几乎不变化的数据
客户端磁盘缓存,重新部署后更新/设定标志位通知更新
数据量大,被使用的地方有限,实时性要求不高
客户端内存第一次使用时加载,客户端程序重新启动时更新。
定义一个缓存机制:
当制定了一个缓存机制之后,反问一下自己:
它提高程序的性能了吗?
耗费的内存/开发时间值得吗?
它会影响数据的完整性/可靠性吗?(业务上能接受吗?)
它会给开发/测试/support带来新的问题吗?
需要为性能/Cost/实时性找出一个平衡点。