【缓存策略】你知道 Write Around(缓存绕过写)这个缓存策略吗?

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主

⛪️ 个人社区:个人社区

💞 个人主页:个人主页

🙉 专栏地址: ✅ Java 中级

🙉八股文专题:剑指大厂,手撕 Java 八股文

文章目录

      • [1. 缓存策略 Write Around 是什么?](#1. 缓存策略 Write Around 是什么?)
      • [2. 缓存策略 Write Around 的应用场景](#2. 缓存策略 Write Around 的应用场景)
      • [3. 缓存策略 Write Around 的优缺点](#3. 缓存策略 Write Around 的优缺点)
      • [4. 用 Java 模拟使用 Write Around 策略](#4. 用 Java 模拟使用 Write Around 策略)
        • [1. 创建缓存类](#1. 创建缓存类)
        • [2. 创建后端存储类](#2. 创建后端存储类)
        • [3. 使用缓存](#3. 使用缓存)

1. 缓存策略 Write Around 是什么?

Write Around 是一种缓存策略,它在写操作时绕过缓存,直接将数据写入后端存储(如数据库)。只有在读取数据时,才会将数据加载到缓存中。这种策略的主要目的是避免缓存污染,确保缓存中存储的是最常用的数据。

2. 缓存策略 Write Around 的应用场景

Write Around 适用于以下场景:

  1. 写密集型应用:当写操作远多于读操作时,使用 Write Around 可以避免缓存被频繁更新,减少缓存污染。
  2. 大数据量写入:当需要写入大量数据时,直接写入后端存储可以避免缓存空间不足的问题。
  3. 数据一致性要求不高:当对数据一致性要求不是特别高时,可以使用 Write Around 策略,因为写操作不会立即反映在缓存中。

3. 缓存策略 Write Around 的优缺点

优点:

  1. 避免缓存污染:写操作不更新缓存,避免了缓存中存储大量不常用的数据。
  2. 节省缓存空间:缓存中只存储最常用的数据,提高了缓存的利用率。
  3. 减少缓存更新开销:写操作不需要更新缓存,减少了缓存更新的开销。

缺点:

  1. 读性能下降:由于写操作不更新缓存,读操作时需要从后端存储中加载数据,增加了读取延迟。
  2. 数据一致性问题:写操作不更新缓存,可能导致缓存中的数据与后端存储中的数据不一致。
  3. 复杂性增加:需要额外的逻辑来处理读操作时的数据加载和缓存更新。

4. 用 Java 模拟使用 Write Around 策略

下面是一个简单的 Java 示例,模拟使用 Write Around 策略的缓存系统。

1. 创建缓存类
java 复制代码
import java.util.HashMap;
import java.util.Map;

public class WriteAroundCache<K, V> {
    private final Map<K, V> cache;
    private final BackendStorage<K, V> backendStorage;

    public WriteAroundCache(BackendStorage<K, V> backendStorage) {
        this.cache = new HashMap<>();
        this.backendStorage = backendStorage;
    }

    public V get(K key) {
        V value = cache.get(key);
        if (value == null) {
            value = backendStorage.read(key);
            if (value != null) {
                cache.put(key, value); // 将数据加载到缓存中
            }
        }
        return value;
    }

    public void put(K key, V value) {
        backendStorage.write(key, value); // 直接写入后端存储
    }

    public void remove(K key) {
        cache.remove(key);
        backendStorage.delete(key);
    }
}
2. 创建后端存储类
java 复制代码
public interface BackendStorage<K, V> {
    V read(K key);
    void write(K key, V value);
    void delete(K key);
}

public class InMemoryBackendStorage<K, V> implements BackendStorage<K, V> {
    private final Map<K, V> storage = new HashMap<>();

    @Override
    public V read(K key) {
        return storage.get(key);
    }

    @Override
    public void write(K key, V value) {
        storage.put(key, value);
    }

    @Override
    public void delete(K key) {
        storage.remove(key);
    }
}
3. 使用缓存
java 复制代码
public class Main {
    public static void main(String[] args) {
        BackendStorage<String, String> backendStorage = new InMemoryBackendStorage<>();
        WriteAroundCache<String, String> cache = new WriteAroundCache<>(backendStorage);

        // 写操作
        cache.put("key1", "value1");
        cache.put("key2", "value2");

        // 读操作
        System.out.println("Read key1: " + cache.get("key1")); // 输出: Read key1: value1
        System.out.println("Read key2: " + cache.get("key2")); // 输出: Read key2: value2

        // 删除操作
        cache.remove("key1");
        System.out.println("Read key1 after delete: " + cache.get("key1")); // 输出: Read key1 after delete: null
    }
}
  • Write Around:写操作时绕过缓存,直接写入后端存储,读操作时将数据加载到缓存中。
  • 应用场景:写密集型应用、大数据量写入、数据一致性要求不高的场景。
  • 优缺点
    • 优点:避免缓存污染、节省缓存空间、减少缓存更新开销。
    • 缺点:读性能下降、数据一致性问题、复杂性增加。
  • Java 模拟:通过创建缓存类和后端存储类,模拟 Write Around 策略的缓存系统。

精彩专栏推荐订阅:在下方专栏👇🏻
2023年华为OD机试真题(A卷&B卷)+ 面试指导
精选100套 Java 项目案例
面试需要避开的坑(活动)
你找不到的核心代码
带你手撕 Spring
Java 初阶

相关推荐
开心工作室_kaic12 分钟前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王14 分钟前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康19 分钟前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神1 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
qq_327342731 小时前
Java实现离线身份证号码OCR识别
java·开发语言
Oak Zhang2 小时前
sharding-jdbc自定义分片算法,表对应关系存储在mysql中,缓存到redis或者本地
redis·mysql·缓存
门牙咬脆骨2 小时前
【Redis】redis缓存击穿,缓存雪崩,缓存穿透
数据库·redis·缓存
门牙咬脆骨2 小时前
【Redis】GEO数据结构
数据库·redis·缓存
阿龟在奔跑2 小时前
引用类型的局部变量线程安全问题分析——以多线程对方法局部变量List类型对象实例的add、remove操作为例
java·jvm·安全·list
飞滕人生TYF2 小时前
m个数 生成n个数的所有组合 详解
java·递归