【缓存策略】你知道 Cache Aside(缓存旁路)这个缓存策略吗

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

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

在这里插入图片描述

文章目录

      • 1. 缓存策略 Cache Aside 是什么?
      • 2. 缓存策略 Cache Aside 的应用场景
      • 3. 缓存策略 Cache Aside 的优缺点
      • 4. 用 Java 模拟使用 Cache Aside 策略
        • 1. 引入依赖
        • 2. 配置 Redis
        • 3. 创建缓存服务
        • 4. 创建用户服务
        • 5. 创建控制器
        • 6. 启动类

1. 缓存策略 Cache Aside 是什么?

Cache Aside(缓存旁路) 是一种常见的缓存策略,其核心思想是在读取数据时,先从缓存中读取,如果缓存中没有数据,则从数据库中读取,并将数据写入缓存;在写入数据时,直接更新数据库,并从缓存中移除该数据。

具体步骤:

  1. 读取数据

    • 尝试从缓存中读取数据。
    • 如果缓存中存在数据,直接返回。
    • 如果缓存中不存在数据,从数据库中读取数据。
    • 将从数据库中读取的数据写入缓存,然后返回数据。
  2. 写入数据

    • 直接更新数据库。
    • 从缓存中移除该数据,以避免缓存中的数据与数据库中的数据不一致。

2. 缓存策略 Cache Aside 的应用场景

Cache Aside 适用于以下场景:

  1. 读多写少:适用于读取操作远多于写入操作的场景,如新闻网站的文章阅读。
  2. 数据更新不频繁:适用于数据更新不频繁,但读取非常频繁的场景。
  3. 数据一致性要求不高:适用于对数据一致性要求不高的场景,可以容忍短暂的数据不一致。
  4. 高并发读取:适用于高并发读取的场景,可以显著减轻数据库的负载。

3. 缓存策略 Cache Aside 的优缺点

优点:

  1. 性能提升:通过缓存减少对数据库的访问次数,提高读取性能。
  2. 减轻数据库压力:减少数据库的读取请求,减轻数据库的负载。
  3. 灵活性:可以在不修改业务逻辑的情况下,通过缓存策略提升系统性能。

缺点:

  1. 数据不一致:在写入数据后,缓存中的数据可能已经过期,导致短暂的数据不一致。
  2. 缓存击穿:如果大量请求同时访问同一个缓存键,而该键在缓存中不存在,会导致大量请求直接打到数据库,造成数据库压力。
  3. 缓存雪崩:如果缓存中的数据在同一时间过期,大量请求会同时打到数据库,造成数据库压力。

4. 用 Java 模拟使用 Cache Aside 策略

下面是一个简单的 Java 示例,模拟使用 Cache Aside 策略。

1. 引入依赖

pom.xml 中添加 Redis 依赖(假设使用 Redis 作为缓存):

<dependencies><!-- Spring Boot Starter Data Redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot Starter Test --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>
2. 配置 Redis

application.properties 中配置 Redis:

spring.redis.host=localhost
spring.redis.port=6379
3. 创建缓存服务

创建一个服务类来实现 Cache Aside 策略:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;@Service
public class CacheService {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@Autowiredprivate UserService userService;public String getUserById(String userId) {// 尝试从缓存中读取数据String cachedUser = redisTemplate.opsForValue().get(userId);if (cachedUser != null) {return cachedUser;}// 如果缓存中没有数据,从数据库中读取String user = userService.getUserById(userId);if (user != null) {// 将数据写入缓存redisTemplate.opsForValue().set(userId, user);}return user;}public void updateUser(String userId, String userName) {// 直接更新数据库userService.updateUser(userId, userName);// 从缓存中移除该数据redisTemplate.delete(userId);}
}
4. 创建用户服务

创建一个简单的用户服务类,模拟数据库操作:

import org.springframework.stereotype.Service;@Service
public class UserService {public String getUserById(String userId) {// 模拟从数据库中读取用户数据// 实际应用中,这里应该是数据库查询操作return "User: " + userId;}public void updateUser(String userId, String userName) {// 模拟更新数据库中的用户数据// 实际应用中,这里应该是数据库更新操作System.out.println("Updating user: " + userId + " to " + userName);}
}
5. 创建控制器

创建一个控制器类,提供 RESTful API 接口:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@Autowiredprivate CacheService cacheService;@GetMapping("/user")public String getUser(@RequestParam String id) {return cacheService.getUserById(id);}@PostMapping("/user")public String updateUser(@RequestParam String id, @RequestParam String name) {cacheService.updateUser(id, name);return "User updated: " + id + " to " + name;}
}
6. 启动类

创建一个启动类来启动 Spring Boot 应用:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class CacheAsideApplication {public static void main(String[] args) {SpringApplication.run(CacheAsideApplication.class, args);}
}

运行项目

  1. 启动 Redis 服务器

    • 确保 Redis 服务器正在运行,可以通过命令 redis-server 启动。
  2. 启动 Spring Boot 应用

    • 运行 CacheAsideApplication 类的 main 方法,启动 Spring Boot 应用。
  3. 测试接口

    • 使用 Postman 或浏览器测试接口:
      • GET http://localhost:8080/user?id=1:读取用户数据。
      • POST http://localhost:8080/user?id=1&name=JohnDoe:更新用户数据。

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

在这里插入图片描述

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

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

相关文章

稀疏视角CBCT重建的几何感知衰减学习|文献速递-基于深度学习的病灶分割与数据超分辨率

Title 题目 Geometry-Aware Attenuation Learning forSparse-View CBCT Reconstruction 稀疏视角CBCT重建的几何感知衰减学习 01 文献速递介绍 稀疏视角锥形束计算机断层扫描&#xff08;CBCT&#xff09;重建的几何感知学习方法 锥形束计算机断层扫描&#xff08;CBCT&a…

电子应用产品设计方案-3:插座式自动温控器设计

一、设计 插座式自动温控器作为一种便捷的温度控制设备&#xff0c;在日常生活和工业应用中发挥着重要作用。它能够根据环境温度的变化自动控制连接设备的电源通断&#xff0c;实现对温度的精确调节和节能控制。本设计旨在提供一种功能强大、易于使用、安全可靠的插座式自动温控…

机器学习—神经网络的Softmax输出

为了建立一个能进行多类分类的神经网络&#xff0c;将采用Softmax回归模型&#xff0c;把它放入神经网络的输出层&#xff0c;如何实现&#xff1f; 当我们用两门课做手写数字识别的时候&#xff0c;我们使用这种架构的神经网络&#xff0c;如果你现在想用十个类进行手写数字分…

web——sqliabs靶场——第五关——报错注入和布尔盲注

这一关开始上强度了&#xff0c;不回显东西了&#xff0c;又要学到新的东西了 发现它没有正确的回显&#xff0c;学到了新知识&#xff0c;报错注入 报错注入 什么是报错注入&#xff1a; MySQL提供了一个 updatexml() 函数&#xff0c;当第二个参数包含特殊符号时会报错&am…

【JavaScript】LeetCode:86-90

文章目录 86 只出现一次的数字87 颜色分类88 下一个排列89 寻找重复数90 前K个高频元素 86 只出现一次的数字 异或x ^ x 0&#xff0c;x ^ 0 x&#xff0c;相同为0&#xff0c;相异为1&#xff0c;且满足交换律。例如&#xff1a;[4, 1, 2, 1, 2] > 1 ^ 1 ^ 2 ^ 2 ^ 4 0 …

CSS回顾-基础知识详解

一、引言 在前端开发领域&#xff0c;CSS 曾是构建网页视觉效果的关键&#xff0c;与 HTML、JavaScript 一起打造精彩的网络世界。但随着组件库的大量涌现&#xff0c;我们亲手书写 CSS 样式的情况越来越少&#xff0c;CSS 基础知识也逐渐被我们遗忘。 现在&#xff0c;这种遗…

Spring Boot编程训练系统:构建可扩展的应用

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了编程训练系统的开发全过程。通过分析编程训练系统管理的不足&#xff0c;创建了一个计算机管理编程训练系统的方案。文章介绍了编程训练系统的系统分析部分&…

点云论文阅读-1-pointnet++

pointnet局限性&#xff1a;不能获取局部结构信息 作者提出pointnet需要解决的问题&#xff1a; 如何生成点云的分区&#xff08;需要保证每一个分区具有相似的结构&#xff0c;使学习算法的参数在局部共享&#xff09;如何通过一个局部特征学习算法抽象点云或局部特征 解决…

Summaries 总结

Goto Data Grid 数据网格 Summaries 摘要 Summary Types 摘要类型 Total Summary 总摘要 汇总总数 &#xff08;GridSummaryItem&#xff09; 将针对所有数据网格记录进行计算&#xff0c;并显示在视图页脚中。启用 View 的 OptionsView.ShowFooter 设置以显示视图页脚。 …

MySQL技巧之跨服务器数据查询:基础篇-如何获取查询语句中的参数

MySQL技巧之跨服务器数据查询&#xff1a;基础篇-如何获取查询语句中的参数 上一篇已经描述&#xff1a;借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的连接名: MY_ODBC_MYSQL 以…

unity3d————协程练习题

1.计秒器&#xff1a; void Start(){StartCoroutine(MyCoroutine());}IEnumerator MyCoroutine(){int time 0;while(true){print(time "秒");time;yield return new WaitForSeconds(1);}} 结果&#xff1a; 2.生成多个cude &#xff08;不卡顿&#xff09;&#x…

Go开发指南- Gorouting

目录&#xff1a; (1)Go开发指南-Hello World (2)Go开发指南-Gin与Web开发 (3)Go开发指南-Gorouting Goroutine 在java中我们要实现并发编程的时候&#xff0c;通常要自己维护一个线程池&#xff0c;并且需要去包装任务、调度任务和维护上下文切换。这个过程需要消耗大量的精…

R语言机器学习与临床预测模型69--机器学习模型解释利器:SHAP

R小盐准备介绍R语言机器学习与预测模型的学习笔记&#xff0c; 快来收藏关注【科研私家菜】 01 机器学习的可解释性 对于集成学习方法&#xff0c;效果虽好&#xff0c;但一直无法解决可解释性的问题。我们知道一个xgboost或lightgbm模型&#xff0c;是由N棵树组成&#xff0c;…

Docker部署青龙面板,实现京东自动签到刷京东,提供脚本

项目简介 青龙面板是一个基于Docker的可视化任务管理系统&#xff0c;用于执行定时任务&#xff0c;如自动签到。 部署安装 安装Docker curl -sSL https://get.docker.com/ | sh 安装Docker-compose 下载 Docker-Compose 二进制包 curl -L https://github.com/docker/compo…

路径穿越浅析

当使用 RouterFunctions 来处理静态资源且资源处理通过 FileSystemResource 进行配置时&#xff0c;攻击者可以通过构造恶意 HTTP 请求&#xff0c;利用路径遍历漏洞获取相关受影响版本文件系统中的任意文件。 主要影响范围&#xff1a; Spring Framework 5.3.0 - 5.3.39 6.…

【网络安全渗透测试零基础入门】之Vulnhub靶场PWNOS: 2.0 多种渗透方法,收藏这一篇就够了!

前言 这是小强给粉丝盆友们整理的网络安全渗透测试入门阶段Vulnhub靶场实战教程 喜欢的朋友们&#xff0c;记得给我点赞支持和收藏一下&#xff0c;关注我&#xff0c;学习黑客技术。 本文介绍靶机PWNOS: 2.0 的渗透方法&#xff0c;由于靶机系统比较老&#xff0c;尝试了几种…

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

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

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; 重启即可。