python web开发笔记--缓存设计(一)

前言:在使用缓存之前,需要确认你的项目是否真的需要缓存。使用缓存会引入的一定的技术复杂度,本文也将会介绍一些存在的问题。

1.可以从两个方面来个是否需要使用缓存:

  • CPU占用:有某些应用需要消耗大量的cpu去计算,比如正则表达式,如果使用正则表达式比较频繁,而其又占用了很多CPU的话,那就应该使用缓存将正则表达式的结果给缓存下来。
  • 数据库IO占用:
    1. 如果发现数据库连接池比较空闲,那么不应该用缓存。
    2. 如果数据库连接池比较繁忙,甚至经常报出连接不够的报警,那么是时候应该考虑缓存了。

2.缓存方案分类

  • 实时性比较高的那块数据:比如说库存之类的这种数据,我采取的实时的缓存+数据库双写的技术方案,双写一致性保障的方案。

  • 实时性要求不高的数据:比如说物品的基本信息等等的,我采取的是一个专门的数据生产的服务,去获取整个商品详情页需要的各种数据,经过处理后,将数据放入各级缓存中。

3.缓存+数据库读写的模式

数据发生变化时:

  • 先更新缓存,然后再更新数据库。这种适用于缓存的值相对简单,和数据库的值一一对应,这样更新比较快。

  • 先删除缓存,然后再更新数据库,读数据的时候再设置缓存。这种适用于缓存的值比较复杂的场景(我常用这个模式,能降低缓存开销,比较稳)。

并发导致数据库与缓存双写不一致问题的解决方案:

  • 双写不一致问题:并发请求的时候,数据发生了变更,先删除了缓存,然后要去修改数据库,此时还没修改。另一个请求过来,去读缓存,发现缓存空了,去查询数据库,查到了修改前的旧数据,放到了缓存中。

解决方案:数据库与缓存更新与读取操作进行异步串行化。(引入队列):
队列消费者串行拿到对应的操作,然后一条一条的执行。这样的话,一个数据变更的操作,先执行删除缓存,然后再去更新数据库,但是还没完成更新。此时如果一个读请求过来,读到了空的缓存,那么可以先将缓存更新的请求发送到队列中,此时会在队列中积压,然后同步等待缓存更新完成。

下一篇:python web开发笔记–缓存设计(二)
如有侵权,请联系我!!!

你可能感兴趣的:(数据库,优化,缓存,数据库,缓存,优化)