👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主
⛪️ 个人社区:个人社区
💞 个人主页:个人主页
🙉 专栏地址: ✅ Java 中级
🙉八股文专题:剑指大厂,手撕 Java 八股文
文章目录
- 1. 缓存策略 Write Back 是什么?
- 2. 缓存策略 Write Back 的应用场景
- 3. 缓存策略 Write Back 的优缺点
- 4. 用 Java 模拟使用 Write Back 策略
- 缓存类
- 测试类
1. 缓存策略 Write Back 是什么?
Write Back(回写) 是一种缓存策略,当数据被修改时,只在缓存中更新数据,而不是立即写回到主存储(如磁盘)。只有当缓存中的数据被替换出去时,才会将修改后的数据写回到主存储。
工作原理:
-
读取数据:
- 如果数据在缓存中存在且有效,直接从缓存中读取。
- 如果数据不在缓存中或无效,从主存储中读取数据,并将其加载到缓存中。
-
写入数据:
- 当数据被修改时,只在缓存中更新数据。
- 缓存中的数据标记为“脏”(dirty),表示该数据已被修改但尚未写回到主存储。
-
替换数据:
- 当缓存空间不足需要替换数据时,检查被替换的数据是否为“脏”。
- 如果是“脏”数据,先将其写回到主存储,然后再替换出缓存。
2. 缓存策略 Write Back 的应用场景
-
高性能要求的系统:
- 适用于对写操作性能要求较高的系统,如数据库缓存、文件系统缓存等。
- 通过减少写回主存储的次数,提高写操作的性能。
-
数据访问频率高的场景:
- 适用于数据访问频率高且写操作频繁的场景,如内存数据库、高速缓存系统等。
- 通过减少主存储的写操作,降低系统负载。
-
网络延迟敏感的系统:
- 适用于网络延迟敏感的系统,如分布式缓存、远程存储系统等。
- 通过减少网络传输次数,提高系统的响应速度。
3. 缓存策略 Write Back 的优缺点
优点:
- 写操作性能高:
- 写操作只需更新缓存,不需要立即写回到主存储,减少了写操作的开销。
- 减少主存储的写操作:
- 通过减少主存储的写操作次数,降低了系统负载,提高了整体性能。
- 适合高并发场景:
- 适用于高并发写操作的场景,能够有效提高系统的吞吐量。
缺点:
- 数据一致性问题:
- 缓存中的数据和主存储中的数据可能存在不一致,需要在数据替换时进行同步。
- 复杂性增加:
- 需要管理缓存中的“脏”数据,增加了系统的复杂性。
- 故障恢复困难:
- 如果缓存发生故障,未写回主存储的“脏”数据可能会丢失,影响数据的完整性。
4. 用 Java 模拟使用 Write Back 策略
下面是一个简单的 Java 示例,模拟使用 Write Back 策略的缓存系统。
缓存类
import java.util.HashMap;
import java.util.Map;public class WriteBackCache<K, V> {private final Map<K, CacheEntry<V>> cache;private final Map<K, V> mainStorage;public WriteBackCache() {this.cache = new HashMap<>();this.mainStorage = new HashMap<>();}public V get(K key) {CacheEntry<V> entry = cache.get(key);if (entry != null && !entry.isDirty()) {return entry.getValue();} else {V value = mainStorage.get(key);if (value != null) {cache.put(key, new CacheEntry<>(value, false));}return value;}}public void put(K key, V value) {cache.put(key, new CacheEntry<>(value, true));}public void evict(K key) {CacheEntry<V> entry = cache.remove(key);if (entry != null && entry.isDirty()) {mainStorage.put(key, entry.getValue());}}private static class CacheEntry<V> {private final V value;private boolean dirty;public CacheEntry(V value, boolean dirty) {this.value = value;this.dirty = dirty;}public V getValue() {return value;}public boolean isDirty() {return dirty;}public void setDirty(boolean dirty) {this.dirty = dirty;}}
}
测试类
public class WriteBackCacheTest {public static void main(String[] args) {WriteBackCache<String, String> cache = new WriteBackCache<>();// 初始数据cache.put("key1", "value1");cache.put("key2", "value2");// 读取数据System.out.println("Read key1: " + cache.get("key1")); // value1System.out.println("Read key2: " + cache.get("key2")); // value2// 修改数据cache.put("key1", "new_value1");System.out.println("Read key1 after update: " + cache.get("key1")); // new_value1// 替换数据cache.evict("key1");System.out.println("Read key1 after eviction: " + cache.get("key1")); // null// 重新读取数据System.out.println("Read key2: " + cache.get("key2")); // value2}
}
-
缓存类
WriteBackCache
:- 使用
HashMap
存储缓存数据和主存储数据。 CacheEntry
类用于存储缓存条目,包含数据值和脏标志。get
方法从缓存或主存储中读取数据。put
方法在缓存中更新数据,并标记为脏。evict
方法在缓存中移除数据,如果数据是脏的,则写回到主存储。
- 使用
-
测试类
WriteBackCacheTest
:- 初始化缓存并插入一些数据。
- 读取和修改数据。
- 替换数据并验证数据是否正确写回到主存储。
精彩专栏推荐订阅:在下方专栏👇🏻
✅ 2023年华为OD机试真题(A卷&B卷)+ 面试指导
✅ 精选100套 Java 项目案例
✅ 面试需要避开的坑(活动)
✅ 你找不到的核心代码
✅ 带你手撕 Spring
✅ Java 初阶