关于缓存我的理解

为什么要用缓存

缓存主要是为了支持高性能/高并发的处理逻辑,以及缓解数据库的压力

不考虑持久化的情况,缓存中的数据基本上都是存在于内存中,相比于查询数据库,程序读取内存的速度要快的多

假设没有缓存,程序直接读取数据库,在高并发的情况下,很容易导致数据库宕机

什么是数据库缓存读写一致性

所谓的数据库缓存一致性主要指的是最终一致性,因为数据库和缓存本来就属于两个个体,所以要让他俩时时刻刻保持数据一致基本上是很难实现的

工作中常见的保证数据库一致性的基本流程如下:

  • 查询:如果在缓存中查到了,直接返回查询结果;如果在缓存中没有查到,就去查数据库,然后将结果写入缓存,然后返回

  • 更新:直接更新数据库,如果更新成功,使缓存失效;这样再下一次查询时就会将查询结果写入缓存

为什么不能写完数据库之后更新缓存

写数据库和写缓存是两次写入,存在时间差,假设两个线程同时操作一条数据,A 线程先写入数据库,B 线程后写入数据库,但是 B 线程先更新完缓存,之后 A 线程才更新缓存,就会导致数据库缓存不一致

而且我认为,在更新完数据库之后,数据并不一定马上就需要被用到,可能很久以后才会查询到,那么更新完数据库就放进缓存,属于浪费资源

其他保证数据库缓存一致性的思路

  • Read Through Pattern

缓存失效之后缓存自己从数据库中加载数据

  • Write Through Pattern

当有数据更新的时候,如果没有命中缓存,直接更新数据库,然后返回;如果命中了缓存,则更新缓存,然后再由 Cache 自己更新数据库(这是一个同步操作)

  • Write Behind Caching Pattern

在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库

推荐

酷壳 缓存更新的套路