通常情况下,我们在设计程序的时候,会在客户端和存储层之间加入缓存层(例如redis和memcache)。存储层一般用来持久化数据,而缓存层则是为了更快的返回所需要的的数据结果。
未加缓存层的应用程序架构大概有如下2个步骤:
1、应用程序直接访问存储层,请求数据
2、存储层面返回应用程序请求的数据
添加缓存层的应用程序架构大概有如下步骤:
1、应用程序向缓存层请求数据
2、缓存层命中数据,则直接返回给应用程序
3、缓存层没有命中数据,则像存储层请求数据
4、存储层直接将数据返回给应用程序,并更新缓存
上面的文字,为了更加容易理解,可以将缓存暂且理解为redis,将存储层理解为MySQL,如上图。
在一些开销比较大的复杂计算很多的场景下,例如(MySQL的大SQL),引入缓存在加速请求响应是必要的,总体来看,缓存带来的收益如下:
1、加速读写:缓存层面都是基于内存的,而存储层面的优点在于持久化数据,读写性能比不上缓存层面。
2、降低后端的负载:我们可以在添加了缓存层面的步骤中看到,部分应用程序请求直接在缓存层就命中了数据,直接返回给应用程序,从而减少了后端的访问量,大大降低了后端存储层的负载。
除此之外,缓存还有以下的成本和风险需要考虑:
1、缓存层面和存储层的数据不一致:在一定时间窗口内,如果存储层进行了更新,而缓存层面的数据还没有过期,则会出现缓存的数据和存储层的数据不一致的现象发生。这和我们制定的缓存更新策略有关,为了保证一致性,可以适度缩短缓存失效时间。
2、代码维护成本以及运维成本:加入缓存层面之后,需要处理缓存层和存储层的业务逻辑,代码数量会增加。也需要运维具体的缓存工具
3、缓存层面存在失效的风险,一旦缓存失效,对存储层的保护功能也就失效了,此时会有大量应用程序直接访问存储层,容易造成存储层的雪崩。对于这种情况,在设计缓存的时候,一定要配置高可用,保证缓存在一定的恶劣场景下的可用性。
一般情况下,缓存的更新策略有算法剔除旧数据、超时剔除旧数据以及主动更新旧数据三种方法,其中算法剔除一般采用LRU算法或者FIFO算法,这里其实可以发散一下,MySQL的innodb_buffer_pool也使用了改造后的LRU算法来对冷数据页进行过滤,这其实也是更新缓存的一种方案。超时剔除指的是缓存的数据设置一定的超时时间,超过时间之后,自动剔除,下次需要从存储层重新获取新的值。主动更新则是在存储层发生数值变化之后,按照一定的策略主动去更新缓存中的数值,这样保证缓存始终是变更后的值。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有