前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >缓存的收益和成本

缓存的收益和成本

作者头像
AsiaYe
发布2020-07-16 09:52:53
8230
发布2020-07-16 09:52:53
举报
文章被收录于专栏:DBA随笔

通常情况下,我们在设计程序的时候,会在客户端和存储层之间加入缓存层(例如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算法来对冷数据页进行过滤,这其实也是更新缓存的一种方案。超时剔除指的是缓存的数据设置一定的超时时间,超过时间之后,自动剔除,下次需要从存储层重新获取新的值。主动更新则是在存储层发生数值变化之后,按照一定的策略主动去更新缓存中的数值,这样保证缓存始终是变更后的值。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档