平时用手机刷网页或者打开APP,总感觉有的内容加载特别快,其实背后很多都是缓存的功劳。缓存就像是把常用的东西先存起来,下次要用就不用重新找一遍。但在实际应用中,不同的场景需要不同的缓存策略来提升效率、减少资源浪费。
1. 旁路缓存(Cache Aside)
这是最常见的一种方式。程序在读数据时,先查缓存,如果没找到,再去数据库里取,然后把结果写进缓存;写数据时,先更新数据库,再把缓存里的对应数据删掉。这样下次读的时候就会重新从数据库加载到缓存。
比如你经常看某个新闻APP的头条,第一次打开可能慢一点,之后就快了,就是因为数据被缓存了。当你刷新看到新内容时,旧缓存就被清掉了。
// 伪代码示例:读操作
if (cache.has(key)) {
return cache.get(key);
} else {
data = db.query(sql);
cache.set(key, data);
return data;
}
// 写操作
db.update(data);
cache.delete(key);
2. 读写穿透(Read/Write Through)
在这种模式下,应用层只和缓存打交道,缓存系统自己负责和数据库同步。读的时候,缓存发现没有就自动去数据库拿并保存;写的时候,缓存直接更新自己和数据库。
这种方式对业务代码更友好,不需要操心数据库操作。就像你往抽屉里放东西,有个助手自动帮你登记到总账本上,你不用自己跑一趟。
3. 写回缓存(Write Back)
写数据时只更新缓存,标记为“脏”,然后异步批量写入数据库。读的时候如果命中缓存就直接返回。这种策略写性能很高,但有丢数据的风险,适合对一致性要求不高的场景。
比如你在编辑文档时频繁保存草稿,系统可能不会每次点保存都立刻写硬盘,而是先存在内存里,隔几秒统一写一次。断电的话可能会丢最近的修改。
4. 缓存预热(Cache Warm-up)
系统启动或高峰期前,提前把热点数据加载到缓存中。避免刚上线时大量请求直接打到数据库,造成崩溃。
就像饭馆开门前先把常卖的菜半成品准备好,一开餐就能快速出菜,不至于手忙脚乱。
5. 多级缓存(Multi-level Caching)
结合本地缓存(如内存)和分布式缓存(如Redis),优先查本地,没有再查远程,查到后回填。能大幅降低远程调用次数,提升响应速度。
比如你查字典,先翻自己整理的小本子,没有再去图书馆查大部头,查完顺便抄一条记下来,下次就快了。
6. 过期与淘汰策略
缓存空间有限,不能一直存。常用的方式有设置过期时间(TTL),比如一小时后失效;或者用LRU(最近最少使用)算法,把长时间没人用的数据清掉。
就像冰箱里的剩菜,贴个标签写“三天内吃完”,超时就扔掉,腾地方放新的。