0%

Mysql--Mysql 和 内存缓存

缓存

为什么要使用缓存

缓存是走内存的,内存天然就支撑高并发。

高性能:

对于一些需要复杂操作耗时查出来的结果,且确定后面不怎么变化,但是有很多读请求,那么直接将查询出来的结果放在缓存中,后面直接读缓存就好。

比如:

  1. 字典这类几乎不会变的数据,但是经常使用到的(所有用户),使用缓存;【修改(管理员)】
  2. 终端分期录入的数据看板:查询 8000+ms,每月录入数据才会变化,故使用缓存;

高并发:

mysql 这么重的数据库,压根儿设计不是让你玩儿高并发的,虽然也可以玩儿,但是天然支持不好。mysql 单机支撑到 2000QPS 也开始容易报警了。

所以要是你有个系统,高峰期一秒钟过来的请求有 1 万,那一个 mysql 单机绝对会死掉。你这个时候就只能上缓存,把很多数据放缓存,别放 mysql。缓存功能简单,说白了就是 key-value 式操作,单机支撑的并发量轻松一秒几万十几万,支撑高并发 so easy。单机承载并发量是 mysql 单机的几十倍。

缓存不一致

  • 最初级的缓存不一致问题及解决方案

解决思路 1:先删除缓存,再更新数据库。如果数据库更新失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致。因为读的时候缓存没有,所以去读了数据库中的旧数据,然后更新到缓存中。

解决思路 2:延时双删。依旧是先更新数据库,再删除缓存,唯一不同的是,我们把这个删除的动作,在不久之后再执行一次,比如 5s 之后。

  • 复杂的数据不一致问题分析
1
存在并发问题,首选延时双删,延迟双删是一种相对简单并且收益比较高的实现最终一致性的方式。

数据发生了变更,先删除了缓存,然后要去修改数据库,此时还没修改。一个请求过来,去读缓存,发现缓存空了,去查询数据库,查到了修改前的旧数据,放到了缓存中。随后数据变更的程序完成了数据库的修改。完了,数据库和缓存中的数据不一样了…

解决思路:在删除缓存之后,间隔一个短暂的时间后再删除缓存一次。这样可以避免并发更新时,导致缓存在第一次被删除后,其他线程将读到旧的数据更新到缓存,从而出现不一致的情况。