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

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

⛪️ 个人社区:个人社区
💞 个人主页:个人主页
🙉 专栏地址: ✅ Java 中级
🙉八股文专题:剑指大厂,手撕 Java 八股文

在这里插入图片描述

文章目录

      • 1. 缓存策略 Write Around 是什么?
      • 2. 缓存策略 Write Around 的应用场景
      • 3. 缓存策略 Write Around 的优缺点
      • 4. 用 Java 模拟使用 Write Around 策略
        • 1. 创建缓存类
        • 2. 创建后端存储类
        • 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. 创建缓存类
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. 创建后端存储类
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<>();@Overridepublic V read(K key) {return storage.get(key);}@Overridepublic void write(K key, V value) {storage.put(key, value);}@Overridepublic void delete(K key) {storage.remove(key);}
}
3. 使用缓存
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: value1System.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 初阶

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/13476.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript入门笔记

目录 JavaScript 介绍 1.JavaScript书写位置 1.1内部 js 1.2外部 js 2.输入和输出语法 变量 1.变量是什么 2.变量基本使用 2.1变量的声明 2.2变量的赋值 3.数组 常量 数据类型 1.数据类型 1.1基本数据类型 1.1.1.number: 数字型 1.1.2.string: 字符串型 1.1.…

游戏引擎学习第七天

视频参考:https://www.bilibili.com/video/BV1QFmhYcE69 ERROR_DEVICE_NOT_CONNECTED 是一个错误代码&#xff0c;通常在调用 XInputGetState 或 XInputSetState 函数时返回&#xff0c;表示指定的设备未连接。通常会出现以下几种情况&#xff1a; 未连接控制器&#xff1a;如…

IDE内存不足,这可能会影响性能。请考虑增加堆大小。

警告信息&#xff1a;Low Memory The IDE is running low on memory and this might affect performance. Please consider increasing available heap. 解决方案&#xff1a; 重启即可。

Element plus使用menu时候如何在折叠时候隐藏掉组件自带的小箭头

记录一下工作中使用element plus时候遇到的一个小bug 就是这个小箭头太折磨人了&#xff0c;因为我需要根据路由动态加载menu&#xff0c;所以对这个menu组件进行了一些处理&#xff0c;然后可能是因为破坏了它原来的层级关系吧导致折叠菜单的时候这个小箭头还在&#xff08;官…

语义通信论文略读(七)Contrastive Learning-Based Semantic Communications

Contrastive Learning-Based Semantic Communications 基于对比学习的语义通信 作者: Shunpu Tang, Qianqian Yang, Lisheng Fan, Xianfu Lei, Arumugam Nallanathan, George K. Karagiannidis 所属机构: 广州大学计算机科学与网络安全学院&#xff0c;浙江大学信息科学与电…

windows下QT5.12.11使用MSVC编译器编译mysql驱动并使用详解

1、下载mysql开发库,后面驱动编译的时候需要引用到,下载地址:mysql开发库下载 2、使用everything搜索:msvc-version.conf,用记事本打开,添加:QMAKE_MSC_VER=1909。不然msvc下的mysql源码加载不上。

技术栈2:Git分布式版本控制工具

目录 1.版本控制器 2.Git概述 3.Git常用命令 4.获取本地仓库 5.基础操作指令 6.gitignore文件 7.分支与合并 8.远程仓库 1.版本控制器 1.1集中式版本控制器 集中式版本控制工具&#xff0c;版本库是集中存放在中央服务器的&#xff0c;team里每个人work时…

【ARM Coresight OpenOCD 系列 5 -- arp_examine 使用介绍】

文章目录 OpenOCD arp_examine 使用 OpenOCD arp_examine 使用 因为我们很多时候运行 Openocd 的时候有些 core 还没有启动, 所以最好在配置脚本中添加 -defer-examine这个参数, 如下&#xff1a; #cortex-m33 target create ${_CHIPNAME}.m33 cortex_m -dap ${_CHIPNAME}.da…

计算机毕业设计Python+大模型斗鱼直播可视化 直播预测 直播爬虫 直播数据分析 直播大数据 大数据毕业设计 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

CAN总线位同步的使用以及总线仲裁规则详解

目录 1. 位同步 1.1 位时序 1.2 硬同步 1.3 再同步 1.4 波特率计算 2. 仲裁 2.1 先占先得 2.2 非破坏性仲裁 1. 位同步 CAN总线没有时钟线&#xff0c;总线上的所有设备通过约定波特率的方式确定每一个数据位的时长&#xff0c;发送方以约定的位时长每隔固定时…

Python爬虫开发中的分析与方案制定

网站分析作为获取数据的重要手段&#xff0c;其重要性不言而喻。Python作为一种强大的编程语言&#xff0c;因其简洁的语法和强大的库支持&#xff0c;成为开发爬虫的首选工具。本文将深入探讨Python爬虫开发中的分析与方案制定&#xff0c;并在代码中加入代理信息&#xff0c;…

深入理解接口测试:实用指南与最佳实践5.0(一)

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

基于Matlab 火焰识别技术

课题介绍 森林承担着为人类提供氧气以及回收二氧化碳等废弃气体的作用&#xff0c;森林保护显得尤其重要。但是每年由于火灾引起的事故不计其数&#xff0c;造成重大的损失。如果有一款监测软件&#xff0c;从硬件处获得的图像中监测是否有火焰&#xff0c;从而报警&#xff0…

Python酷库之旅-第三方库Pandas(209)

目录 一、用法精讲 976、pandas.MultiIndex.set_codes方法 976-1、语法 976-2、参数 976-3、功能 976-4、返回值 976-5、说明 976-6、用法 976-6-1、数据准备 976-6-2、代码示例 976-6-3、结果输出 977、pandas.MultiIndex.to_frame方法 977-1、语法 977-2、参数…

SQL 窗口函数

窗口函数用于在不改变查询结果集行数的情况下&#xff0c;对每一行执行聚合计算或其他复杂的计算&#xff0c;可以跨行计算。 随着窗口函数的出现&#xff0c;无须再使用关联子查询。窗口函数的可读性很好&#xff0c;代码也很简洁。 1 实践 1.1 营业额年度变化 需求&#…

36.Redis核心设计原理

本文针对前面的讲解做一次总结 1.Redis基本特性 1.非关系型的键值对数据库&#xff0c;可以根据键以O(1)的时间复杂度取出或插入关联值 2.Redis的数据是存在内存中的 3.键值对中键的类型可以是字符串&#xff0c;整型&#xff0c;浮点型等&#xff0c;且键是唯一的 4.键值对中…

《人工智能网络安全现状(2024)》深度解读:机遇、挑战与应对策略

在当今数字化浪潮汹涌澎湃的时代&#xff0c;人工智能&#xff08;AI&#xff09;与网络安全已然深度交融&#xff0c;二者相互作用所塑造的发展态势正深刻重塑着我们的信息安全格局。《人工智能网络安全现状&#xff08;2024&#xff09;》这份报告恰似一盏明灯&#xff0c;为…

光控资本 :股票支撑位是什么?股票支撑位怎么找?

股票支撑位是指在股票价格的前史K线走势有两次或者两次以上&#xff0c;出现下跌到某一方位&#xff0c;股票就出现反弹的走势&#xff0c;则投资者可以把这个方位称为支撑位&#xff0c;支撑位阐明下方托单较多&#xff0c;个股无法持续下跌&#xff0c;在托单的影响下&#x…

网站小程序app怎么查有没有备案?

网站小程序app怎么查有没有备案&#xff1f;只需要官方一个网址就可以&#xff0c;工信部备案查询官网地址有且只有一个&#xff0c;百度搜索 "ICP备案查询" 找到官方gov.cn网站即可查询&#xff01; 注&#xff1a;网站小程序app备案查询&#xff0c;可通过输入单位…

STM32+AI语音识别智能家居系统

基于 STM32 和 AI 语音识别的智能家居系统的详细硬件和软件设计&#xff0c;包括各个模块的详细描述和代码示例。 一、硬件设计 1. 微控制器&#xff08;STM32&#xff09;&#xff1a; 选择 STM32F7 系列或更高性能的芯片&#xff0c;如 STM32F767ZIT6&#xff0c;以满足处理…