今天看啥  ›  专栏  ›  linuxzw

11.3、缓存粒度控制

linuxzw  · 简书  ·  · 2019-05-17 22:12

缓存粒度控制

下图是很多项目关于缓存比价常用的选型,缓存层选用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}

上述这个问题就是缓存粒度问题,究竟是缓存全部属性还是只缓存部分重要属性呢?下面将从通用性、空间占用、代码维护三个角度进行说明。

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

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

  • 全部是数据会造成内存的浪费。

  • 全部数据可能每次传输产生的网络流量会比较大,耗时相对较大,在极端情况下会阻塞网络。

  • 全部数据的序列化和反序列化的CPU开销更大。

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

下表给出缓存全部数据和部分数据在通用性、空间占用、diamante维护上的对比,开发人员酌情选择。

数据类型 通用性 空间占用(内存空间+网络宽带) 代码维护
全部数据 简单
部分数据 较为复杂

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




原文地址:访问原文地址
快照地址: 访问文章快照