Redis缓存及缓存粒度

本文介绍了Redis缓存的作用,通过缓存可以提升读写速度,降低后端负载。讨论了缓存引入带来的数据不一致性和维护成本,并详细阐述了缓存粒度划分的重要性,包括通用性、空间占用和代码维护的权衡。

什么是Redis缓存?

缓存就是为了更快的获取一些东西,而把这些东西从一个地方暂时或者永久的存储到另一个方便快捷获取的地方的机制。

为什么要用缓存?

现在互联网应用(网站或App)的整体流程,大致可以概括为用户请求从界面(浏览器或App界面)到网络转发、应用服务再到存储(数据库或文件系统),然后返回到界面呈现内容。

随着互联网的普及,内容信息越来越复杂,用户数和访问量越来越大,我们的应用需要支撑更多的并发量,同时我们的应用服务器和数据库服务器所做的计算也越来越多。但是往往我们的应用服务器资源是有限的,且技术变革是缓慢的,数据库每秒能接受的请求次数也是有限的(或者文件的读写也是有限的),如何能够有效利用有限的资源来提供尽可能大的吞吐量?一个有效的办法就是引入缓存,打破标准流程,每个环节中请求可以从缓存中直接获取目标数据并返回,从而减少计算量,有效提升响应速度,让有限的资源服务更多的用户。

图左侧为客户端直接调用存储层的架构,右侧为比较典型的缓存层+存储层架构。
在这里插入图片描述

加入缓存层后,读取数据的流程就变为:

读DB前,先读缓存,如果有直接返回,如果没有再读DB,然后写入缓存层并返回。

缓存加入后带来的收益和成本

收益:

①加速读写:因为缓存(Redis)通常都是全内存的,而存储层通常读写性能不够强悍(例如MySQL),通过缓存的使用可以有效地加速读写,优化用户体验。

②降低后端负载:帮助后端减少访问量和复杂计算(例如很复杂的SQL语句),在很大程度降低了后端的负载。

成本:

①数据不一致性:缓存层(Redis)和存储层(MySQL了)的数据存在着一定时间窗口的不一致性,时间窗口跟更新策略有关。

②代码维护成本:加入缓存后,需要同时处理缓存层和存储层的逻辑,增大了开发者维护代码的成本。

③运维成本:以Redis Cluster(Redis 集群)为例,加入后无形中增加了运维成本。

缓存的使用场景基本包含如下两种:

①开销大的复杂计算:以MySQL为例子,一些复杂的操作或者计算(例如大量联表操作、一些分组计算),如果不加缓存,不但无法满足高并发量,同时也会给MySQL带来巨大的负担。

②加速请求响应:即使查询单条后端数据足够快(例如select*from tablewhere id=),那么依然可以使用缓存,以Redis为例子,每秒可以完成数万次读写,并且提供的批量操作可以优化整个IO链的响应时间。

缓存粒度划分

缓存粒度问题是一个容易被忽视的问题,如果使用不当,可能会造成很多无用空间的浪费,网络带宽的浪费,代码通用性较差等情况,需要综合数据通用性、空间占用比、代码维护性三点进行取舍。

通用性:缓存全部数据比缓存部分数据更加通用,但从实际经验来看,很长时间内应用只需要几个重要的属性。

空间占比:缓存全部数据比缓存部分数据更占空间。可能存在更多的问题。

  1. 全部数据会造成内存的浪费
  2. 全部数据可能每次传输产生的网络流量会比较大,耗时相对较大,在极端情况下会阻塞网络
  3. 全部数据进行序列化与反序列化CPU消耗很大。

代码维护:全部数据的优势更加明显,部分数据一旦要加新字段需要修改业务代码,修改后还需要更新缓存的数据。

下面是缓存全部数据与部分数据时在通用性,空间占比,代码维护上的对比,可酌情选择:

数据类型通用性空间占比代码维护
全部数据简单
部分数据复杂

参考文章一
参考文章二

<think> 嗯,用户现在询问的是Redis缓存粒度控制的含义。首先需要回顾之前的对话历史,确保这次回答的相关性。用户之前提到了MyBatis的缓存配置,但根据系统指令,这个引用只是示例,用户实际关注的是Redis缓存粒度控制。 接下来要解析用户的问题核心:缓存粒度控制的具体定义。需要明确这个概念涉及数据存储的最小单位,比如缓存整个对象还是部分字段。然后考虑如何结构化回答,可能分定义、优缺点、应用场景等方面展开。 用户可能希望了解如何选择缓存粒度,所以需要比较不同粒度的优劣。比如细粒度节省内存但增加管理复杂度,粗粒度反之。还要结合Redis的特性,比如其数据结构(哈希、字符串)如何支持不同粒度。 考虑到用户是开发者,可能需要实际应用场景的例子,比如用户信息缓存,全量存储与部分字段的对比。同时,要引用可靠的技术来源,比如官方文档或权威实践,但注意之前的引用是MyBatis的,需避免混淆,专注于Redis的相关内容。 另外,用户可能有未明说的需求,比如如何在实际项目中实施缓存粒度控制,或者常见错误。因此回答中应包含最佳实践和潜在陷阱,如缓存穿透与粒度选择的关系。最后生成的相关问题要引导深入探讨,比如粒度控制策略或性能影响分析。 </think>### Redis缓存粒度控制的定义 Redis缓存粒度控制指**在缓存数据时对存储单元精细度的管理策略**,核心是通过**选择合适的数据拆分维度**(如整对象、部分字段、集合子集等)来优化性能与资源消耗。其本质是在**空间效率**与**访问效率**间寻求平衡[^1]。以下是结构化解析: --- #### 一、核心概念解析 | 粒度类型 | 描述 | 示例场景 | |----------------|----------------------------------------------------------------------|------------------------------| | **粗粒度缓存** | 以完整对象或数据集为单位存储(如整个用户信息JSON) | 用户信息查询:`GET user:100` | | **细粒度缓存** | 拆解对象属性或数据子集独立存储(如用户名/邮箱分开缓存) | `HGET user:100 name` | | **混合粒度** | 根据访问频率动态组合(高频字段细粒度,低频字段粗粒度) | 用户基础信息细粒度,扩展信息粗粒度 | --- #### 二、技术实现原理 1. **数据结构选择** - 粗粒度:`String`类型存储序列化对象(JSON/Protobuf) ```redis SET user:100 '{"name":"Alice","email":"alice@example.com"}' ``` - 细粒度:`Hash`存储字段级数据 ```redis HSET user:100 name "Alice" email "alice@example.com" ``` 2. **访问模式适配** - 高频读字段 → 独立缓存(避免反序列化整个对象) - 强一致性要求字段 → 粗粒度(原子更新保障)[^1] --- #### 三、关键权衡维度 1. **空间效率** - 细粒度:减少冗余(如仅缓存热点字段),内存利用率更高 - 粗粒度:存在字段冗余,但元数据开销更小(单键管理) 2. **访问性能** ```mermaid graph LR A[请求] --> B{细粒度缓存} B -->|高频读| C[快速获取子字段] B -->|多字段读| D[网络开销增加] A --> E{粗粒度缓存} E -->|全量读| F[单次网络交互] E -->|低频字段| G[资源浪费] ``` 3. **维护成本** - 细粒度:更新需维护多键一致性(事务/Lua脚本) - 粗粒度:单键更新简单,但可能引发**缓存污染**(无效字段未及时清理)[^1] --- #### 四、最佳实践场景 1. **推荐细粒度** - 字段访问频率差异大(如用户画像中的常驻属性 vs 冷门属性) - 大对象且网络带宽敏感(移动端API) 2. **推荐粗粒度** - 强事务一致性场景(订单状态) - 字段总大小 < 1KB(细粒度收益低于管理成本) > 💡 **典型案例**:电商用户信息缓存 > - 细粒度:`用户基础信息`(Hash) + `购物车`(String) + `订单历史`(ZSet) 分离存储 > - 粗粒度:`用户权限配置`整体缓存(因字段少且常全量读取) --- #### 五、潜在风险 1. **缓存穿透** - 细粒度易放大未命中风险(如请求冷门字段) → 需布隆过滤器防护 2. **数据一致性** - 细粒度更新需原子操作: ```lua -- Lua脚本保证多字段更新原子性 redis.call('HSET', KEYS[1], 'field1', ARGV[1]) redis.call('HSET', KEYS[1], 'field2', ARGV[2]) ``` --- ### 总结 Redis缓存粒度控制是通过**数据存储单元的精细划分**,在`内存占用`、`访问延迟`、`维护复杂度`间取得平衡的核心设计策略[^1]。实际选择需结合: 1. 数据访问模式热力分布 2. 对象字段耦合强度 3. 一致性要求等级 最终目标是**最小化无效数据缓存,最大化资源利用率**。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值