1.假设数据库有个商品表,前台通过【条件A】查询取得【结果A】,是不是应该把【条件A】当作KEY,【结果A】当作VALUE,第二次有人用【条件A】查询则直接返回【结果A】。那吗问题来了,数据库商品表通过增删改变化了,那吗应该怎样去处理缓存中的数据那?缓存中可能有很多条件和结果,而结果可能涉及很多关联表,关联表变化了,那缓存中数据又怎吗处理? |
|
10分 |
不是所有数据都应当做缓存的……
|
30分 |
缓存技术的关键,正是你所说的“如何尽快清理脏数据”的技术。没有这个技术,有些人随便把“内存中保存数据”就叫做缓存,就会产生“脏的”的结果。
拿 .net 的 Cache 类的机制来看(https://msdn.microsoft.com/zh-cn/library/05kd8d77(v=vs.100).aspx),你可以设置 slidingExpiration、absoluteExpiration时间窗口,你也可以设置dependencies。 其中的 .net 框架已经内置支持CacheDependency,至少有这样几种:可以自动捕获文件更新(例如某个配置文件改变了或者图片文件改变了),可以根据其它自定义缓存单元联动(例如每当发生事件A,你就把Cache[“A”]重新设置,于是依赖于此缓存单元的其它成百上千个缓存单元就自动清空了),可以支持 SqlCacheDependency来捕获Sql Server数据表修改。实际上你可以从CacheDependency类继承其控制机制而自定义你自己的缓存依赖组件(例如当前用户收到了一条“新工作”通知时,它的日程列表缓存就被清空了)。同时n个CacheDependency可以组合起来,作为一个新的、单独的CacheDepnency对象而赋给非上面的Cache.Insert方法的第三个参数。 总之,重要的技术都在于“缓存依赖项”的控制技术。而且.net框架中现有的都比较低级、简单,需要程序设计人员根据自己的业务场景而设计十几种自定义的CacheDependency扩展类型。 这才是去掉了“脏”的缓存。 |
为什么许多人只能理解“脏的”缓存呢?因为没有好的环境,现在各种开源小框架中号称为“分布式缓存”的标题党太多了,那些技术大牛开放出来的流行框架尚且不过是那样的技术,让各路编程粉丝到处传播得好像缓存是没有什么技术的、只要下载一个“分布式内存数据库”用来进行 k-v 存储就行了似地。
|
|
缓存应该就像是水管,而不是水库。
缓存中的数据总的来说,生命期并不长。比如你把一个sql查询结果缓存起来,可能通常也就是1分钟或者几分钟就自动清除了。 缓存的价值就在于大量的“流动性”的数据块的存在,就好像自来水塔的管道一样,而不是一滩不怎么清除的死水。 |
|
谢谢,很高兴,有思路了,非常感谢!
|