什么是缓存

缓存是为了解决速度不匹配问题而存在的一种机制。比如CPU速度远快于硬盘,为了解决硬盘速度慢的问题,我们在CPU和硬盘之间加了一层缓存(内存),将常用的数据放在内存中,减少直接读取硬盘的次数。

缓存的分类

按位置分

  • 客户端缓存:浏览器缓存、APP缓存
  • CDN缓存:内容分发网络
  • 服务端缓存:服务器本地缓存、分布式缓存
  • 数据库缓存:数据库自身的缓存机制

按类型分

  • 文件缓存:将数据序列化后存储到文件
  • 内存缓存:Memcached、Redis
  • 数据库缓存:利用数据库表存储缓存数据

缓存策略

Cache-Aside(旁路缓存)

应用程序先查询缓存,如果命中则直接返回;如果未命中,则查询数据库,并将结果写入缓存。

Read-Through(读穿透)

应用程序只与缓存交互,缓存未命中时由缓存服务去查询数据库并写入缓存。

Write-Through(写穿透)

写入数据时同时写入缓存和数据库。

Write-Behind(异步写入)

写入数据时只写入缓存,由缓存异步写入数据库。

缓存淘汰策略

  • FIFO(First In First Out):先进先出
  • LFU(Least Frequently Used):最少使用次数
  • LRU(Least Recently Used):最近最少使用

缓存常见问题

缓存穿透

查询一个不存在的数据,由于缓存不会保存空值,每次查询都会查数据库。 解决方案:将空值也缓存起来,设置较短的过期时间。

缓存雪崩

大量缓存同时失效,导致所有请求都落到数据库上。 解决方案:给缓存的过期时间加上一个随机值,避免同时失效。

缓存击穿

一个热key突然过期,大量并发请求直接打到数据库。 解决方案:使用互斥锁,只允许一个请求查数据库并更新缓存。