这里暂且把memcached作为缓存的具体实现方便讨论.
我想到的是两种方案, 但各自都存在一些缺点.
1. 对单表进行缓存
优点:
a:对于key的维护简单. key与表对应, value与表数据对应. 表数据发生变化时, 能够主动对对应的缓存数据进行增量更新.
b: 内存中不会有重复数据, 空间利用率高
缺点:
a, 开发难度增加. 因为绝大多数的取数据都是带条件查询甚至多表关联查询, 这样就需要把使用的单表数据先取出来, 然后在程序中进行条件过滤. 业务逻辑处理相对会复杂很多.
b, 系统负担加大. 在每次查询都需要先取出对应的单表或多表数据进行遍历过滤, 加大了系统负担, 甚至这个过程比直接用SQL查询数据库花的时间更长.
----------------------------------------------------------------
2. 直接缓存查询后的结果集数据块, 通常以对应的查询SQL做为KEY
优点:
a, 查找效率高, 通过KEY找到的value就是我们所要的数据, 无需进行额外的数据处理.
b, 开发效率高. 相对来说缓存层甚至可以实现透明化
缺点:
a, 内存利用率差. 同一条数据库记录会在多个KEY中重复.
b, 管理缓存中数据块的更新困难. 当key对应的查询条件的数据内容在数据库端发生变化时, 比如新增了一条纪录或删除了一条纪录, 却无法更新相关联的缓存. 因为无法知道这条发生变化的纪录是与哪些key有关系的. 只能等待缓存过期后, 被动地去数据库端重新查询数据再缓存. 如果这个查询比较复杂的话, 那对应用来说是有很危险的, 实际上缓存就不能起到预期的作用.
从使用上觉得第二种方式相对来说应该更合适些, 但是对应的缺点却是很头疼的问题, 尤其是缺点b. 如果缓存数据不能主动更新, 很可能会导致展现的BUG.
不知道大家在实际使用过程中采用的是什么方式? 有没有办法能够解决第二种方式的缺点呢? 欢迎大家一起来探讨.