随着应对大规模交易的Web应用程序、SOA和其他服务器应用程序的爆炸式增长,数据存储无法跟上应用增长速度,因为数据存储无法继续添加更多服务器以扩展,这与可扩展性极高的应用架构不同。
在这种情况下,内存分布式缓存为数据存储瓶颈提供了极好的解决方案。它跨越多个服务器(称为集群)将内存集中在一起,并保持所有服务器之间的高速缓存同步,并且可以像应用程序服务器一样不断增长高速缓存集群,这减少了数据存储的压力,使其不再是可扩展性的瓶颈。
分布式缓存主要有两种使用方式:
·Cache:这是应用程序负责读取和写入数据库的地方,Cache不与数据库交互。Cache“kept aside”为更快,更具可扩展性的内存数据存储。应用程序在从数据库读取任何内容之前需要检查Cache。并且,应用程序在对数据库进行更新后会自动更新Cache,保证应用程序可以确保Cache与数据库内数据的同步。
·read-through/write-through(RT / WT):这是应用程序将Cache视为主数据存储并从中读取数据向其写入数据的位置。缓存负责将这些数据读写到数据库,从而减轻应用负担。Read-Through,业务代码首先调用Cache,如果Cache不命中由Cache回源到SoR,而不是业务代码(即由Cache读SoR)。Write-Through,称之为穿透写模式/直写模式,业务代码首先调用Cache写(新增/修改)数据,然后由Cache负责写缓存和写SoR,而不是业务代码。
▲通读式/直写式缓存架构
Cache-aside是一种非常强大的技术,即业务代码围绕Cache写,是由业务代码直接维护缓存,可以让用户进行复杂的数据库查询,包括连接和嵌套查询,并以任何用户想要的方式处理数据。尽管如此,Read-through / Write-through与Cache相比具有各种优势,如下所述:
·简化应用程序代码:在Cache-aside方法中,如果多个应用程序处理相同的数据,则应用程序代码将继续具有复杂性并直接依赖于数据库,甚至会重复执行代码。Read-through / Write-through将部分数据访问代码从应用程序移至Cache层,极大地简化了应用程序并更加清晰地提取数据。
·通过Read-through更好地实现可伸缩性:在许多情况下,缓存项到期并且多个并行用户线程最终触发数据库,将其与数以百万计的缓存项和数以千计的并行用户请求相乘,数据库负载明显变高。但是,当从数据库获取最新副本时,“Read-through”将cache-item保存至缓存中,同时从数据库中获取最新副本。最终结果是应用程序永远不会去数据库获取这些cache-items ,并且数据库负载保持最小。
·使用Write-behind获取更好得写入性能:在cache-aside中,应用程序直接同步更新数据库。Write-behind可让应用程序快速更新缓存并返回。然后,让cache在后台更新数据库。
·使用Write-behind更好地实现数据库可伸缩性:使用Write-behind,用户可以指定限制条件,因此数据库写入速度不会像缓存更新那样快,因此数据库压力不会太大。此外,用户可安排数据库写入在非高峰时段进行,再次将压力降至最低。
·到期自动刷新缓存:使用Read-through ,Cache可自动从数据库重新加载对象。这意味着应用程序不必在繁忙时间点击数据库,因为最新的数据总是在Cache中。
·数据库更改时自动刷新Cache:当数据库中相应的数据发生更改时,Read-through 允许Cache自动从数据库中重新加载对象。 这意味着缓存总是最新的,并且应用程序不必在繁忙时间点击数据库,因为最新的数据总是在Cache中。
“读取/写入”(RT/WT)不适用于应用程序中的所有数据访问,最适合从数据库读取单个行或读取可直接映射到单个缓存项数据的情况。即使数据周期性变化,频繁读取也是在Cache中实现。
开发Read-Through Handler
Read-Through Handler向cache服务器注册,并允许cache直接从数据库读取数据。 NCache服务器提供了一个 Read-through handler接口。 这使NCache能够调用Read-through处理程序。
Start()执行某些资源分配任务,例如建立到主数据源的连接,而Stop()则意味着重置所有分配,Load是cache用于调用read-through对象的方法。
开发Write-Through Handler
当cache需要在更新缓存时写入数据库时,将调用Write-Through Handler。 通常,应用程序通过添加,插入或删除向cache发布更新。
Start()执行资源分配任务,例如建立到数据源的连接,而Stop()意味着重置所有分配, Save是缓存调用write-through对象的方法。
从应用程序调用Read-Through和Write-Through
以下示例代码展示了如何使用来自简单Windows应用程序cache的read-through/write-through功能。