什么是Redis缓存?
缓存就是为了更快的获取一些东西,而把这些东西从一个地方暂时或者永久的存储到另一个方便快捷获取的地方的机制。
为什么要用缓存?
现在互联网应用(网站或App)的整体流程,大致可以概括为用户请求从界面(浏览器或App界面)到网络转发、应用服务再到存储(数据库或文件系统),然后返回到界面呈现内容。
随着互联网的普及,内容信息越来越复杂,用户数和访问量越来越大,我们的应用需要支撑更多的并发量,同时我们的应用服务器和数据库服务器所做的计算也越来越多。但是往往我们的应用服务器资源是有限的,且技术变革是缓慢的,数据库每秒能接受的请求次数也是有限的(或者文件的读写也是有限的),如何能够有效利用有限的资源来提供尽可能大的吞吐量?一个有效的办法就是引入缓存,打破标准流程,每个环节中请求可以从缓存中直接获取目标数据并返回,从而减少计算量,有效提升响应速度,让有限的资源服务更多的用户。
图左侧为客户端直接调用存储层的架构,右侧为比较典型的缓存层+存储层架构。

加入缓存层后,读取数据的流程就变为:
读DB前,先读缓存,如果有直接返回,如果没有再读DB,然后写入缓存层并返回。
缓存加入后带来的收益和成本
收益:
①加速读写:因为缓存(Redis)通常都是全内存的,而存储层通常读写性能不够强悍(例如MySQL),通过缓存的使用可以有效地加速读写,优化用户体验。
②降低后端负载:帮助后端减少访问量和复杂计算(例如很复杂的SQL语句),在很大程度降低了后端的负载。
成本:
①数据不一致性:缓存层(Redis)和存储层(MySQL了)的数据存在着一定时间窗口的不一致性,时间窗口跟更新策略有关。
②代码维护成本:加入缓存后,需要同时处理缓存层和存储层的逻辑,增大了开发者维护代码的成本。
③运维成本:以Redis Cluster(Redis 集群)为例,加入后无形中增加了运维成本。
缓存的使用场景基本包含如下两种:
①开销大的复杂计算:以MySQL为例子,一些复杂的操作或者计算(例如大量联表操作、一些分组计算),如果不加缓存,不但无法满足高并发量,同时也会给MySQL带来巨大的负担。
②加速请求响应:即使查询单条后端数据足够快(例如select*from tablewhere id=),那么依然可以使用缓存,以Redis为例子,每秒可以完成数万次读写,并且提供的批量操作可以优化整个IO链的响应时间。
缓存粒度划分
缓存粒度问题是一个容易被忽视的问题,如果使用不当,可能会造成很多无用空间的浪费,网络带宽的浪费,代码通用性较差等情况,需要综合数据通用性、空间占用比、代码维护性三点进行取舍。
通用性:缓存全部数据比缓存部分数据更加通用,但从实际经验来看,很长时间内应用只需要几个重要的属性。
空间占比:缓存全部数据比缓存部分数据更占空间。可能存在更多的问题。
- 全部数据会造成内存的浪费
- 全部数据可能每次传输产生的网络流量会比较大,耗时相对较大,在极端情况下会阻塞网络
- 全部数据进行序列化与反序列化CPU消耗很大。
代码维护:全部数据的优势更加明显,部分数据一旦要加新字段需要修改业务代码,修改后还需要更新缓存的数据。
下面是缓存全部数据与部分数据时在通用性,空间占比,代码维护上的对比,可酌情选择:
| 数据类型 | 通用性 | 空间占比 | 代码维护 |
|---|---|---|---|
| 全部数据 | 高 | 大 | 简单 |
| 部分数据 | 低 | 小 | 复杂 |
本文介绍了Redis缓存的作用,通过缓存可以提升读写速度,降低后端负载。讨论了缓存引入带来的数据不一致性和维护成本,并详细阐述了缓存粒度划分的重要性,包括通用性、空间占用和代码维护的权衡。
1278

被折叠的 条评论
为什么被折叠?



