概述
云计算设计模式(一)Cache Aside模式
按照需要将数据从数据存储中加载到缓存中。这将提高访问数据的性能,也会帮助提高保存在缓存中的数据和数据存储中数据的一致性。
上下文和问题
应用使用缓存来提升重复访问保存在数据存储中数据的性能。然而,希望缓存中的数据和数据存储中的数据总是保持一致,是不现实的。因此,应用需要实现一种策略来保证缓存中的数据尽可能新,同时也可以探测和处理缓存数据过期的情况。
解决方案
很多的商业缓存系统可以提供透读(read-through),透写(write-through)和后台写(write-behind)的操作,在这些系统中,应用通过访问缓存抽取数据,系统将从数据存储中加载数据并添加到缓存中;任何对缓存中数据的修改,都将自动写回到数据存储中。
如果缓存不提供这些功能,那么,维护数据的一致性,就是使用缓存数据的应用程序的职责。
应用程序可以通过实现实现read-aside策略,来模仿read-through的功能,这个策略在需要的时候,加载数据到缓存中,下面的图标列举了如何使用Cache-Aside模式在缓存中保存数据。
如果应用更新了信息,可以遵循Write-through策略,更新数据存储中的数据,并将缓存中相应的数据项失效。
当这个数据项下次被访问的时候,使用Cache-aside模式,将导致更新后的数据被从数据存储中抽取出来,重新添加到缓存中。
问题和思考
当你决定使用Cache-aside模式时,需要考虑以下几点:
1)缓存数据的生命周期
很多缓存实现了过期策略,当缓存中的数据在一个指定的时间内没有被访问,缓存服务器会将数据失效,并将其从换出中移除。为了保证Cache-aside是有效的,就需要确保过期策略与应用程序使用的数据的访问模式想匹配。不要让缓存的过期时间太短,因为这将导致应用不断的从数据存储加载数据,并添加到缓存中。同样的,不要让过期时间太长,这样数据容易过期。记住,缓存对于相对静态的数据,或者频繁被读取的数据来说,更为有效。
2)驱逐数据
与存储原始数据的数据存储相比,缓存的大小一般都有限制,在必要的时候,需要清理数据。大部分的缓存使用最少最近使用策略来选择需要驱逐的数据。但这是可以定制的。配置缓存的全局属性和其他属性,加上每个缓存数据的过期属性,来保证缓存是具有成本效益的,因为全局的驱逐策略,对于每个数据项来说,并不总是合适的。举个例子,如果一个缓存数据项从数据存储加载数据是非常昂贵的,那么,更有效的方式是,牺牲那些频繁访问,但是开销更小的的项目,将这些数据一直留存在缓存中。
3)启动缓存
很多解决方案会预先根据应用程序经常需要的数据,预先计算缓存。并作为启动过程的一部分。在这种场景下,当数据过期,或者被驱逐的时候,Cache-Aside模式仍然是有效的。
4)一致性
Cache-Aside模式并不能保证数据存储和缓存之间的一致性。数据存储中的一个数据项,可能在任何时候被外部进程改变,这个改变无法被反射到缓存中,直到下一次数据被加载。在一个存在跨数据源的数据复制的系统中,如果同步频繁发生,问题会变得很严重。
5)本地(内存)缓存
一个缓存可以被存储到应用程序的本地内存中。在这种环境中,如果应用频繁访问相同的数据的话,Cache-Aside模式也是有效的。然而,本地缓存是私有的,因此不同的应用实例都会持有相同数据的一份缓存。这些缓存可能会很快在各个应用程序实例之间变得不一致。因此,可能需要更频繁的过期和刷新保存在私有缓存中的数据。在这种场景下,需要研究是否需要使用共享缓存或者分布式缓存。
何时使用这个模式
当符合下面的条件时,可以使用:
1)缓存不提供原生的read-through和wirte-through操作的支持
2)需要的资源是不可预测的,这个模式使得应用能够按需加载数据,不会假设应用将会需要哪些数据。
在下面的情况下,模式可能不适用:
1)缓存的数据集是静态的,如果将数据加载到可用的缓存空间,在应用程序启动的时候启动缓存数据,并且适用某种策略防止缓存失效。
2)缓存会话状态信息在web应用中,在这种环境中,你应该避免在C/S程序中额外的引入依赖关系。
最后
以上就是要减肥大叔为你收集整理的云计算设计模式(一)Cache Aside模式的全部内容,希望文章能够帮你解决云计算设计模式(一)Cache Aside模式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复