缓存粒度控制
下图是很多项目关于缓存比价常用的选型,缓存层选用Redis,存储层选用MySQL。
例如现在需要将MySQL的用户信息使用Redis缓存,可以执行如下操作:
从MySQL获取用户信息:
select * from user where id={id}
将用户信息缓存到Redis中:
set user:{id} 'select * from user where id={id}
假设用户表有100个列,需要缓存到什么维度呢?
-
缓存全部列:
set user:{id} 'select * from user where id={id}
-
缓存部分重要列:
set user:{id} 'select {importantColumn1}, {important Column2} ... {importantColumnN} from user where id={id}
上述这个问题就是缓存粒度问题,究竟是缓存全部属性还是只缓存部分重要属性呢?下面将从通用性、空间占用、代码维护三个角度进行说明。
通用性。缓存全部数据比部分数据更加通用,但从实际经验看,很长时间内应用只需要几个重要的属性。
空间占用。缓存全部数据要比部分数据占用更多的空间,可能存在以下问题:
代码维护。全部数据的优势更加明显,而部分数据一旦要加新字段需要修改业务代码,而且修改后通常还需要刷新缓存数据。
下表给出缓存全部数据和部分数据在通用性、空间占用、diamante维护上的对比,开发人员酌情选择。
数据类型 |
通用性 |
空间占用(内存空间+网络宽带) |
代码维护 |
全部数据 |
高 |
大 |
简单 |
部分数据 |
低 |
小 |
较为复杂 |
缓存粒度问题是一个容易被忽视的问题,如果使用不当,可能会造成很多无用空间的浪费,网络带宽的浪费,代码通用性较差等情况,需要综合数据通用性、空间占用比、代码维护性三点进行取舍。