• 缓存虽好,可不要乱用哦!
  • 银色镜架 发表于 2015/9/23 23:39:00 | 分类标签: 缓存 缓存系统 Memcached
  • 缓存是提高网站性能非常重要的一件法宝,现在许多语言都内置了缓存系统解决方案,当然也有诸如Memcached,Redis这样专业的分布式缓存系统,但是,任何东西都不是绝对的,有好的一面当然也就会有不足的一面,缓存虽是个好东西,但是在使用时可千万要注意一些细节哦

    缓存是个好工具。许多有用的数据都适合放在内存中。那样可以降低延迟,减轻数据库负载,减少硬件成本。但实际上,缓存的成本很高,只是软件开发人员往往低估了缓存带来的问题和复杂度提升。

    近日,来自Twitter的软件工程师Mike Solomon发表了一篇博文,从以下几个方面分析了实现缓存的困难之处:


    缓存数据更难以推断:缓存意味着不从真实数据源读取数据。因此,每次读或写缓存数据都可能与真实数据源不匹配。在问题追踪时必须经常考虑这种情况。
    缓存数据可能导致“视角(perspective)”Bug:比如,一个新闻站点上有个“最佳文章”列表,其中的内容可能会随登录用户的不同而变化。一个常犯的缓存错误是缓存的数据独立于视角,具有不同视角的用户看到了相同的内容。这会导致严重的隐私甚或安全问题。
    涉及缓存的行为难以重现:当引入缓存,就引入了一个新的层,其上的行为可能同预期不符。缓存对象依赖访问模式,会随时间或其它因素变化。一旦出现问题,很难通过重现行为来帮助问题修复。
    访问模式变化可能会损害性能:访问模式变化可能会莫名其妙地导致缓存命中率降低,延迟增加,吞吐量减少。但流量水平可能会保持不变,这屏蔽了问题原因,潜在地增加了底层数据源的负载及问题处理的难度。
    进程内缓存可能会增加GC压力:在具有垃圾收集功能的语言中,大量长寿命的缓存对象会增加垃圾收集的时间和次数。
    缓存失败恢复困难:缓存机器故障,存储在内存中的数据就会丢失,无法简单地重新上线。在缓存重新创建的过程中,吞吐量可能会下降。
    尽管缓存有着这些困难,但还是需要它,比如,Facebook、Twitter、Instagram及Reddit都将缓存视为一个关键的基础设施。Facebook基础设施工程师已经构建了一个名为mcrouter的工具用于管理缓存。该工具开源不到一年,就获得了1000多颗星,缓存的重要性可见一斑。只是,在考虑使用缓存的时候需要注意上述问题。

  • 请您注意

    ·自觉遵守:爱国、守法、自律、真实、文明的原则

    ·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规

    ·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品

    ·承担一切因您的行为而直接或间接导致的民事或刑事法律责任

    ·您在编程中国社区新闻评论发表的作品,本网站有权在网站内保留、转载、引用或者删除

    ·参与本评论即表明您已经阅读并接受上述条款

  • 感谢本文作者
  • 作者头像
  • 昵称:银色镜架
  • 加入时间:2013/7/30 0:00:00
  • TA的签名
  • 这家伙很懒,虾米都没写
  • +进入TA的空间
  • 以下内容也很赞哦
分享按钮