电商总结(七)缓存系统

  前段时间,在和朋友讨论和研究缓存的使用,一直对缓存的使用搞的不太清楚,因此此次把和朋友讨论过缓存系统的设计的相关问题总结总结。数据库

 

  对于一个电商系统,缓存是重要组成部分,提高系统性能的主要方式之一就是缓存。它能够挡掉大部分的数据库访问的冲击,若是没有它,系统极可能会由于数据库不可用致使整个系统崩溃。缓存

 

  可是缓存带来了另一些棘手的问题: 数据的一致性和实时性。服务器

  例如,数据库中的数据状态已经改变,可是在页面上看到的仍然是缓存的旧值,直到缓冲时间失效以后,才能从新更新缓存。这个问题怎么解决?架构

  还有就是,缓存数据若是没有失效的话,是会一直保持在内存中的,因此对服务器的内存也是负担,那么什么数据能够放缓存,什么数据不能够,这是系统设计之初必须考虑的问题。性能

 

  什么数据能够放缓存?网站

    1,不须要实时更新可是又极其消耗数据库的数据。好比网站首页的商品销售的排行榜,热搜商品等等,这些数据基本上都是一天统计一次,用户不会关注其是不是实时的。spa

    2,须要实时更新,可是数据更新的频率不高的数据。设计

    3,每次获取这些数据都通过复杂的处理逻辑,好比生成报表。blog

 

  什么数据不该该使用缓存?队列

    实际上,在电商系统中,大部分数据都是能够缓存的,不能使用缓存的数据不多。这类数据包括好比涉及到钱、密钥、业务关键性核心数据等。总之,若是你发现,系统里面的大部分数据都不能使用缓存,这说明架构自己出了问题。

 

  如何解决一致性和实时性的问题?

    保证一致性和实时性的办法就是:一旦数据库更新了,就必须把原来的缓存更新。

 

  说一说咱们的缓存方案:

    咱们目前的缓存系统:Redis(主从)+ RabbitMQ + 缓存清理服务组成,具体以下图:

    缓存清理做业订阅 RabbitMQ消息队列,一有数据更新进入队列,就将数据从新更新到Redis缓存服务器。

   

 

 

    固然,有些朋友的方案,是数据库更新完成以后,立马去更新相关缓存数据。这样就不须要MQ 和 缓存清理做业。不过,这同时也增长了系统的耦合性。具体得看本身的业务场景和平台大小。