zoukankan      html  css  js  c++  java
  • 系统架构设计中缓存的重要性

      在分布式网络系统中,缓存更是无处不在:(1)对静态页面的缓存;(2)服务端对某些请求数据的缓存(包括本地缓存和分布式缓存);(3)客户端对服务器端数据的缓存,例如我们的头像等信息;

    使用缓存带来的问题:
    缓存何时写入?
    缓存如何失效?
    缓存和DB的一致性如何保证?
    多级缓存有什么最佳实践?
    如何避免缓存穿透问题?

    缓存穿透:

    我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回。这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,这样缓存就失去了意义,在流量大时,可能DB就挂掉了。

    那这种问题有什么好办法解决呢?

    要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。
    有一个比较巧妙的作法是,可以将这个不存在的key预先设定一个值。
    比如,”key” , “&&”。
    在返回这个&&值的时候,我们的应用就可以认为这是不存在的key,那我们的应用就可以决定是否继续等待继续访问,还是放弃掉这次操作。如果继续等待访问,过一个时间轮询点后,再次请求这个key,如果取到的值不再是&&,则可以认为这时候key有值了,从而避免了透传到数据库,从而把大量的类似请求挡在了缓存之中。

    缓存并发

    有时候如果网站并发访问高,一个缓存如果失效,可能出现多个进程同时查询DB,同时设置缓存的情况,如果并发确实很大,这也可能造成DB压力过大,还有缓存频繁更新的问题。

    我现在的想法是对缓存查询加锁,如果KEY不存在,就加锁,然后查DB入缓存,然后解锁;其他进程如果发现有锁就等待,然后等解锁后返回数据或者进入DB查询。

    这种情况和刚才说的预先设定值问题有些类似,只不过利用锁的方式,会造成部分请求等待。

    缓存失效

    引起这个问题的主要原因还是高并发的时候,平时我们设定一个缓存的过期时间时,可能有一些会设置1分钟啊,5分钟这些,并发很高时可能会出在某一个时间同时生成了很多的缓存,并且过期时间都一样,这个时候就可能引发一当过期时间到后,这些缓存同时失效,请求全部转发到DB,DB可能会压力过重。

    那如何解决这些问题呢?
    其中的一个简单方案就时讲缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

    我们讨论的第二个问题时针对同一个缓存,第三个问题时针对很多缓存。

    参考:http://www.spring4all.com/question/177

  • 相关阅读:
    解释机器学习模型的一些方法(一)——数据可视化
    机器学习模型解释工具-Lime
    Hive SQL 语法学习与实践
    LeetCode 198. 打家劫舍(House Robber)LeetCode 213. 打家劫舍 II(House Robber II)
    LeetCode 148. 排序链表(Sort List)
    LeetCode 18. 四数之和(4Sum)
    LeetCode 12. 整数转罗马数字(Integer to Roman)
    LeetCode 31. 下一个排列(Next Permutation)
    LeetCode 168. Excel表列名称(Excel Sheet Column Title)
    论FPGA建模,与面向对象编程的相似性
  • 原文地址:https://www.cnblogs.com/stanljj/p/8494461.html
Copyright © 2011-2022 走看看