V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
arzon
V2EX  ›  程序员

如何管理项目中的缓存应用

  •  
  •   arzon · 2012-04-05 15:35:08 +08:00 · 3467 次点击
    这是一个创建于 4608 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这里暂且把memcached作为缓存的具体实现方便讨论.

    我想到的是两种方案, 但各自都存在一些缺点.

    1. 对单表进行缓存
    优点:
    a:对于key的维护简单. key与表对应, value与表数据对应. 表数据发生变化时, 能够主动对对应的缓存数据进行增量更新.
    b: 内存中不会有重复数据, 空间利用率高

    缺点:
    a, 开发难度增加. 因为绝大多数的取数据都是带条件查询甚至多表关联查询, 这样就需要把使用的单表数据先取出来, 然后在程序中进行条件过滤. 业务逻辑处理相对会复杂很多.
    b, 系统负担加大. 在每次查询都需要先取出对应的单表或多表数据进行遍历过滤, 加大了系统负担, 甚至这个过程比直接用SQL查询数据库花的时间更长.

    ----------------------------------------------------------------

    2. 直接缓存查询后的结果集数据块, 通常以对应的查询SQL做为KEY
    优点:
    a, 查找效率高, 通过KEY找到的value就是我们所要的数据, 无需进行额外的数据处理.

    b, 开发效率高. 相对来说缓存层甚至可以实现透明化

    缺点:
    a, 内存利用率差. 同一条数据库记录会在多个KEY中重复.

    b, 管理缓存中数据块的更新困难. 当key对应的查询条件的数据内容在数据库端发生变化时, 比如新增了一条纪录或删除了一条纪录, 却无法更新相关联的缓存. 因为无法知道这条发生变化的纪录是与哪些key有关系的. 只能等待缓存过期后, 被动地去数据库端重新查询数据再缓存. 如果这个查询比较复杂的话, 那对应用来说是有很危险的, 实际上缓存就不能起到预期的作用.

    从使用上觉得第二种方式相对来说应该更合适些, 但是对应的缺点却是很头疼的问题, 尤其是缺点b. 如果缓存数据不能主动更新, 很可能会导致展现的BUG.

    不知道大家在实际使用过程中采用的是什么方式? 有没有办法能够解决第二种方式的缺点呢? 欢迎大家一起来探讨.
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2706 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 06:22 · PVG 14:22 · LAX 22:22 · JFK 01:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.