谷粒商城实战笔记-151-缓存-缓存使用-本地缓存与分布式缓存

news/2024/10/20 17:30:55/

文章目录

  • 一,本地缓存
      • 1,定义
    • 2,优点
    • 3,代码示例(Java)
    • 4,缺点
  • 二,分布式缓存
    • 1,定义
    • 2,优点
    • 3,缺点
    • 4,代码示例
  • 三,本地缓存分布式缓存的适用场景
  • 四,缓存一致性的挑战与解决方案

前面的课程通过压测发现了很多问题,并进行了多次优化,包括一下方案:

  • 动静分离,把静态资源存储在nginx,缩短资源请求链路
  • 开启thymeleaf缓存
  • 调整jvm参数,扩大对内存及Eden区内存占比
  • 优化业务代码,减少查询数据库的次数

经过了这些优化措施之后,压测性能有了显著的提升,但距离压测通过标准还有不小差距。

对于三级分类数据,因为其改动较少,变化不大,数据一致性要求也不高,所以还可以通过缓存的方式尽量避免从数据库中读取数据,这会大幅提升性能。

缓存分为两种:

一,本地缓存

1,定义

本地缓存(Local Cache)通常指的是在单个应用实例的内存中存储的缓存数据。这种缓存方式简单直接,通常使用编程语言内置的数据结构如哈希表(HashMap)来实现。

2,优点

  1. 访问速度快:由于数据存储在本地内存中,访问本地缓存几乎无网络延迟,可以快速响应数据请求。
  2. 简单易实现:大多数编程语言都提供了易于使用的集合类,如Java中的HashMap,Python中的dict,可以快速实现本地缓存

3,代码示例(Java)

以下是一个简单的本地缓存实现示例,使用Java中的HashMap:

import java.util.HashMap;
import java.util.Map;public class LocalCacheExample {private Map<String, Object> cache = new HashMap<>();public Object getFromCache(String key) {// 尝试从本地缓存获取数据return cache.get(key);}public void addToCache(String key, Object value) {// 将数据放入本地缓存cache.put(key, value);}public static void main(String[] args) {LocalCacheExample localCache = new LocalCacheExample();// 假设我们缓存一个商品信息String productId = "123";Product product = getProductFromDatabase(productId); // 从数据库获取商品信息localCache.addToCache(productId, product);// 后续请求可以直接从缓存获取product = (Product) localCache.getFromCache(productId);if (product != null) {System.out.println("Product found in local cache.");} else {System.out.println("Product not found in local cache, fetching from DB.");}}private Product getProductFromDatabase(String id) {// 模拟数据库查询return new Product(id, "Sample Product");}
}class Product {private String id;private String name;public Product(String id, String name) {this.id = id;this.name = name;}// Getters and Setters
}

4,缺点

  1. 数据不一致:在多实例部署的情况下,每个实例可能拥有不同的本地缓存副本,导致数据不一致。
  2. 容量有限缓存容量受限于单台服务器的内存大小,不适合存储大量数据。
  3. 扩展性差:本地缓存难以水平扩展,当系统负载增加时,可能需要更复杂的解决方案。
    ,

二,分布式缓存

分布式系统中,数据的快速访问和一致性是至关重要的,这正是分布式缓存发挥作用的地方。以下是对分布式缓存的概述,包括其定义、优点、缺点以及代码示例。

1,定义

分布式缓存是一种将缓存数据分布在多个服务器或节点上的机制,这些服务器可以是物理机或虚拟机。它允许系统通过多个缓存节点共享数据,从而提高数据访问速度和系统扩展性。

2,优点

  1. 数据一致性:所有应用实例共享同一份缓存数据,确保了数据的一致性。
  2. 高可用性:通过冗余和故障转移机制,即使部分节点失败,缓存服务仍可继续提供服务。
  3. 扩展性强:可以通过增加更多的缓存节点来水平扩展,以应对不断增长的数据量和访问压力。
  4. 负载均衡分布式缓存系统通常内置或支持负载均衡机制,可以均匀分配请求到各个节点。

3,缺点

  1. 访问速度相对较慢:与本地缓存相比,分布式缓存可能因为网络延迟而稍慢。
  2. 实现复杂:需要处理网络通信、数据分片、一致性协议等复杂问题。
  3. 成本较高:需要投资更多的硬件资源,以及维护分布式系统的复杂性。

4,代码示例

以下是使用Redis作为分布式缓存的一个简单示例。Redis是一个开源的内存数据结构存储系统,常用作分布式缓存解决方案。

import redis.clients.jedis.Jedis;public class RedisCacheExample {private static final String CACHE_HOST = "localhost";private static final int CACHE_PORT = 6379;public static void main(String[] args) {// 连接到Redis缓存服务器try (Jedis jedis = new Jedis(CACHE_HOST, CACHE_PORT)) {// 将数据放入缓存jedis.set("product:123", "Product Name");// 从缓存中获取数据String productName = jedis.get("product:123");System.out.println("Cached Product Name: " + productName);// 如果需要更新缓存中的数据jedis.set("product:123", "Updated Product Name");}}
}

在这个示例中,我使用Java的Jedis客户端连接到本地运行的Redis服务器,并将一个产品名称作为字符串存储在缓存中。之后,从缓存中检索并打印这个名称。如果产品信息更新了,也可以简单地更新缓存中的值。

三,本地缓存分布式缓存的适用场景

  • 本地缓存:适用于单实例部署,或者对缓存数据一致性要求不高的场景。
  • 分布式缓存:适用于多实例部署,对数据一致性和高可用性有较高要求的场景。

四,缓存一致性的挑战与解决方案

  • 缓存穿透:通过设置合理的超时策略和使用布隆过滤器来防止。
  • 缓存雪崩:通过缓存数据的分布式过期策略来避免大量缓存同时过期。
  • 缓存击穿:对于热点数据,使用互斥锁或分布式锁来保证更新操作的原子性。

http://www.ppmy.cn/news/1506121.html

相关文章

C语言 ——— 学习并使用字符分类函数

目录 学习isupper函数 学习isdigit函数 学习tolower函数 将输入的字符串中把大写字母转换为小写字母并输出 学习isupper函数 参数部分&#xff1a; 形参需要传递的是一个字母&#xff0c;字符在ASCII码表上是以整型存储的&#xff0c;所以实参部分用(int c)没有问题 返回…

Go 临界资源 安全问题

临界资源安全的问题&#xff1a; 临界资源&#xff1a; 指并发环境中多个 进程/线程/协程 可以共享&#xff08;都可以调用&#xff09;的资源/变量&#xff0c;如果在并发环境中处理不当&#xff0c;就会造成一些 严重、问题 func main() {//临界资源a : 10go func() {a 100f…

LLM金融文本分类文档说明

Python注意事项&#xff1a; 1&#xff0c;创建虚拟环境&#xff1a; conda create --prefixD:\software\Anaconda3\envs\finance_analysis python3.10.4 conda create -p D:/software/anaconda3/envs/finance_analysis python3.10.4 注释&#xff1a; D:\software\anaconda3\e…

redolog和binlog的两阶段提交和区别

redolog和binlog区别 redo log 是 InnoDB 引擎特有的&#xff1b;binlog 是 MySQL 的 Server 层实现的&#xff0c;所有引擎都可以使用。redo log 是物理日志&#xff0c;记录的是“在某个数据页上做了什么修改”&#xff1b;binlog 是逻辑日志&#xff0c;记录的是这个语句的…

<数据集>柑橘缺陷识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1290张 标注数量(xml文件个数)&#xff1a;1290 标注数量(txt文件个数)&#xff1a;1290 标注类别数&#xff1a;4 标注类别名称&#xff1a;[Orange-Green-Black-Spot, Orange-Black-Spot, Orange-Canker, Orange…

java基础I/O

1,I/O流的概念&#xff1a; IO流代表的是一个数据输入的源或者输出的目标地址&#xff0c;可以是硬盘&#xff0c;内存&#xff0c;网络或者什么其他的电子设备&#xff0c;而IO流的类型也很多比如最简单的字节或者字符&#xff0c;或者其他更高级的对象。 不管它有多少特性&am…

AI10-PaddleDetection2.7安装测试

1、下载PaddleDetect-release-2.7开源项目 https://github.com/PaddlePaddle/PaddleDetection https://github.com/PaddlePaddle/PaddleDetection/releases PaddleDetection: PaddleDetection的目的是为工业界和学术界提供丰富、易用的目标检测模型 2、安装 环境要求 * Paddl…

学习笔记 韩顺平 零基础30天学会Java(2024.8.7)

P481 Math方法 利用random返回一个[2,7]之间的随机数&#xff1a; 因为random只能返回[0,1)之间的随机数&#xff0c;因此做一下处理&#xff1a;[(int)(a), (int) (aMath.random()*(b-a1))]&#xff0c;对于Math.random()*(b-a1)&#xff0c;其中b-a1&#xff0c;它乘上[0,1)相…