当前位置: 首页 > news >正文

SpringBoot——整合Redis

目录

Redis

创建Commodity表

启动MySQL和Redis

新建一个SpringBoot项目

pom.xml

application.properties

Commodity实体类

 ComMapper接口

ComService业务层接口

ComServiceImpl业务接口的实现类

ComController控制器

RedisConfig配置类

SpringbootRdisApplication启动类

启动项目,进行测试 


Redis

  • Redis是一个高性能的 key-value 数据库,支持多种数据结构,常用作缓存、消息代理和配置中心
  • 用途:
    • 1、缓存热点数据
      • 由于Redis的访问速度快、支持的数据类型很丰富,所以很适合用来存储热点数据,其内置的expire可以对缓存的数据设置过期时间,在缓存的数据过期后再设置新的缓存数据
    • 2、计数器
      • Redis的incrby命令是原子性地递增,因此可以运用于商城系统的高并发的秒杀活动、分布式序列号的生成等场景
    • 3、排行榜
      • 可以使用Redis的SortedSet进行热点数据的排序
    • 4、分布式锁
      • Redis的setnx命令的作用是,如果当前的缓存数据,不存在则设置缓存成功并返回1,否则设置缓存失败并返回0。可以利用这个特性在Redis集群中检测锁的有效时间,如果超时,那么等待的进程将有机会获得锁,从而防止项目出现死锁
  • 在SpringBoot中要存储和访问Redis中的数据,可以使用 RedisTemplate 和 StringRedisTemplate 模板类,用模板操作Redis实际就是通过set()/get()方法存取数据
    • StringRedisTemplate 是 RedisTemplate 的子类
    • StringRedisTemplate 只针对键值都是字符串类型的数据,而 RedisTemplate 可以操作对象类型的数据
    • StringRedisTemplate 默认使用 StringRedisSerializer 序列化器,而 RedisTemplate 默认使用 JdkSerializationRedisSerializer 序列化器
    • RedisTemplate 提供了5种数据结构的操作方法
      • opsForValue:操作字符串类型
      • opsForHash:操作哈希类型
      • opsForList:操作列表类型
      • opsForSet:操作集合类型
      • opsForZSet:操作有序集合类型
  • 当数据存储到 Redis中时,键和值都是通过SpringBoot提供的序列化器(Serializer)序列化到内存数据库中

项目总结

  1.  引入依赖:首先,在 pom.xml 文件中引入 Spring Boot Starter Data Redis 依赖,以便使用 Spring Boot 提供的 Redis 支持。
  2. 配置 Redis 连接信息:在 Spring Boot 项目的配置文件(如 application.properties 或 application.yml)中配置 Redis 的连接信息,包括主机地址、端口、密码等。
  3. 编写 Redis 配置类:如果需要自定义 RedisTemplate 的配置,可以创建一个 Redis 配置类,在其中配置 RedisTemplate。你可以自定义键值的序列化器、连接工厂等配置。
  4. 使用 RedisTemplate 进行操作:通过在需要使用 Redis 的地方注入 RedisTemplate,即可使用它来进行 Redis 的操作,包括存储、读取、删除等操作。
    1. 比如本项目中就是在ComServiceImpl业务接口的实现类中编写业务逻辑代码时,使用到了Redis进行数据的存取 
  5. 测试:编写单元测试或集成测试来验证 Redis 的功能是否正常。
  6. 这就是整合 Spring Boot 与 Redis 的基本工作流程和思路。通过这些步骤,你可以在 Spring Boot 项目中方便地使用 Redis 来实现缓存、分布式锁等功能。

创建Commodity表

CREATE DATABASE netshop;
USE netshop;
CREATE TABLE commodity(Pid INT(8) NOT NULL PRIMARY KEY,TCode CHAR(3) NOT NULL,SCode CHAR(8) NOT NULL,PName VARCHAR(32) NOT NULL,PPrice DECIMAL(7,2) NOT NULL,Stocks INT UNSIGNED DEFAULT 0
);
INSERT INTO commodity(Pid,TCode,SCode,PName,PPrice,Stocks) VALUES(1,'11A','SXLC001A','洛川红富士苹果冰糖心10斤箱装',44.80,3601);
INSERT INTO commodity(Pid,TCode,SCode,PName,PPrice,Stocks) VALUES(2,'11A','SXLC002A','烟台红富士苹果10斤箱装',29.80,5698);
INSERT INTO commodity(Pid,TCode,SCode,PName,PPrice,Stocks) VALUES(3,'11A','SXLC003A','库尔勒香梨10斤箱装',69.80,8902);

启动MySQL和Redis

命令行启动MySQL,不要关闭小黑窗

双击redis-server.exe,启动redis服务器

新建一个SpringBoot项目

  • 添加Spring Boot基本框架:Spring Web
  • Lombok模型简化组件:Lombok
  • MyBatis框架:MyBatis Framework
  • MySQL的驱动:MySQL Driver
  • Redis框架:Spring Data Redis(Access+Driver)

项目结构:

pom.xml

  • 常见报错的解决办法:加个版本号<version>,或者降一下版本号
  • 推荐使用spring-boot-starter-data-redis,我查了很多办法也解决不了这个依赖的报错,所以在此用了spring-data-redis,需要手动配置Redis 相关的 bean 和属性。这可能导致配置错误或遗漏,从而导致应用无法正确连接到 Redis。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.study</groupId><artifactId>springboot_redis</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot_redis</name><description>Demo project for Spring Boot</description><properties><java.version>8</java.version></properties><dependencies><!--推荐使用spring-boot-starter-data-redis,免去手动配置--><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>2.4.1</version></dependency><!--SpringBoot默认使用Lettuce客户端,相比于Jedis,线程安全且可支持并发访问--><dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter-test</artifactId><version>2.2.2</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

application.properties配置文件

# 连接MySQL数据库
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/netshop?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
spring.datasource.username=root
spring.datasource.password=admin
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# 连接Redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
# Redis数据库索引(默认为0)
spring.redis.database=0

Commodity实体类

package com.study.springboot_redis.model;import lombok.Data;
import java.io.Serializable;@Data //该注解包含了getter,setter,toString()等方法
public class Commodity implements Serializable {//序列化private int pid;//商品号private String tcode;//商品分类编码private String scode;//商家编码private String pname;//商品名称private float pprice;//商品价格private int stocks;//商品库存
}

 ComMapper接口

package com.study.springboot_redis.mapper;import com.study.springboot_redis.model.Commodity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;/*** 这是一个公共接口,定义了与commodity表进行交互的方法*/
@Mapper //这个注解表示该接口是一个Mapper接口,用于与数据库进行交互
public interface ComMapper {//@Param("pid")注解用于将方法参数与SQL语句中的pid参数进行映射@Select("SELECT * FROM commodity WHERE Pid = #{pid}")Commodity queryByPid(@Param("pid") int pid);
}

ComService业务层接口

package com.study.springboot_redis.service;import com.study.springboot_redis.model.Commodity;/*** 业务层*/
public interface ComService {public String getPNameFromRedis(int pid);//从Redis获取商品名称public Commodity getComFromRedis(int pid);//从Redis获取商品记录对象
}

ComServiceImpl业务接口的实现类

package com.study.springboot_redis.service;import com.study.springboot_redis.mapper.ComMapper;
import com.study.springboot_redis.model.Commodity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.data.redis.core.StringRedisTemplate;/*** 业务接口的实现类* 用模板操作Redis实际就是通过set()/get()方法存取数据*/
@Service //将一个类标识为服务层组件
public class ComServiceImpl implements ComService{@AutowiredComMapper comMapper;@AutowiredStringRedisTemplate stringRedisTemplate;//StringRedisTemplate模板用于从Redis存取字符串,注入该模板@AutowiredRedisTemplate<String,Object> redisTemplate;//RedisTemplate模板用于从Redis存取对象,注入该模板@Overridepublic String getPNameFromRedis(int pid) {Commodity commodity = comMapper.queryByPid(pid);//从MyBatis接口读取商品记录stringRedisTemplate.opsForValue().set("pname",commodity.getPname());//使用set()方法存入Redisreturn stringRedisTemplate.opsForValue().get("pname");//使用get()方法从Redis中获取}@Overridepublic Commodity getComFromRedis(int pid) {Commodity commodity = comMapper.queryByPid(pid);redisTemplate.opsForValue().set(String.valueOf(commodity.getPid()),commodity);return (Commodity) redisTemplate.opsForValue().get(String.valueOf(pid));}
}

ComController控制器

package com.study.springboot_redis.controller;import com.study.springboot_redis.model.Commodity;
import com.study.springboot_redis.service.ComServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("com")
public class ComController {@Autowired //注入业务层操作Redis的服务实体ComServiceImpl comService;@RequestMapping("getpname")//从Redis获取商品名称public String getPNameByPid(int pid){return comService.getPNameFromRedis(pid);}@RequestMapping("getcom")//从Redis获取商品记录对象public Commodity getComByPid(int pid){return comService.getComFromRedis(pid);}
}

RedisConfig配置类

package com.study.springboot_redis.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration //声明该类为配置类
public class RedisConfig {/*** RedisTemplate使用JdkSeriallizationRedisSerializer来序列化数据,以二进制的形式存储,不便可视化,所以在此自定义序列化器* 在此自定义一个JSON格式的序列化类*/@Beanpublic RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setKeySerializer(new StringRedisSerializer());//GenericJackson2JsonRedisSerializer这个序列化器是一个通用的 JSON 序列化器,// 它可以序列化和反序列化任意类型的对象,而不需要指定对象的类型redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setConnectionFactory(connectionFactory);return redisTemplate;}
}

SpringbootRdisApplication启动类

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

启动项目,进行测试 

  • 访问网址:http://localhost:8080/com/getpname?pid=1
  • 取出pid=1的商品名称,页面返回一个字符串

  • 访问网址:http://localhost:8080/com/getcom?pid=1 
  • 取出pid=1的商品对象

相关文章:

SpringBoot——整合Redis

目录 Redis 创建Commodity表 启动MySQL和Redis 新建一个SpringBoot项目 pom.xml application.properties Commodity实体类 ComMapper接口 ComService业务层接口 ComServiceImpl业务接口的实现类 ComController控制器 RedisConfig配置类 SpringbootRdisApplication启…...

2024全新Langchain大模型AI应用与多智能体实战开发

2024全新Langchain大模型AI应用与多智能体实战开发 LangChain 就是一个 LLM 编程框架&#xff0c;你想开发一个基于 LLM 应用&#xff0c;需要什么组件它都有&#xff0c;直接使用就行&#xff1b;甚至针对常规的应用流程&#xff0c;它利用链(LangChain中Chain的由来)这个概念…...

【JavaEE 初阶(十)】JVM

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多进阶知识 目录 1.前言2.JVM内存区域划分3.类加载3.1双亲委派模型 4.垃圾回收&#xff08;GC&#xff0…...

【Flutter】AspectRatio组件Card组件按钮组件Wrap组件

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Flutter学习 &#x1f320; 首发时间&#xff1a;2024年5月25日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e; 目…...

【IDEA软件应用篇】IDEA基础开发设置和开发快捷键

IDEA是一种集成开发环境&#xff0c;可以运行java代码。 本篇文章你将收获到下面的知识&#xff1a; &#xff08;1&#xff09;IDEA如何设置字体大小快捷键 &#xff08;2&#xff09;如何解决每次进IDEA时&#xff0c;进去的页面都是上次使用完时的那个页面 &#xff08;3&am…...

机器学习--数学部分笔记

前言 因为周三要考试,所以数学部分写一下笔记 正文 随机事件和随机实验 条件概率 • 在已知事件 &#x1d435; 发生的条件下&#xff0c;事件&#x1d434;发生的概率称为事件 &#x1d434; 的条件概率&#xff0c;记为&#x1d443;(&#x1d434;|&#x1d435;) 全概率…...

基于springboot的在线宠物用品交易网站源码数据库

基于springboot的在线宠物用品交易网站源码数据库 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了在线宠物用品交易网站的开发全过程。通过分析在线宠物用品交易网站管理的不足&#xff0c;创建了一个计算机管理在…...

【Pytorch】13.搭建完整的CIFAR10模型

项目源码 已上传至githubCIFAR10Model&#xff0c;如果有帮助可以点个star 简介 在前文【Pytorch】10.CIFAR10模型搭建我们学习了用Module来模拟搭建CIFAR10的训练流程 本节将会加入损失函数&#xff0c;梯度下降&#xff0c;TensorBoard来完整搭建一个训练的模型 基本步骤 搭建…...

护目镜佩戴自动识别预警摄像机

护目镜佩戴自动识别预警摄像机是一种智能监测设备&#xff0c;专门用于佩戴护目镜的工人进行作业时&#xff0c;能够自动识别有潜在风险的场景&#xff0c;并及时发出预警信号。该摄像机配备人脸识别和智能预警系统&#xff0c;可以检测危险情况并为工人提供实时安全保护&#…...

keep-alive的使用

Vue中的<keep-alive>组件是前端开发中的一个宝藏功能&#xff0c;它如同时光胶囊般保留组件的状态&#xff0c;让组件在切换时仿佛按下暂停键&#xff0c;再次回来时还能继续播放&#xff0c;极大地优化了用户体验和性能。&#x1f680;✨ 作用 状态保留&#xff1a;当包…...

【Linux】中的常见的重要指令(中)

目录 一、man指令 二、cp指令 三、cat指令 四、mv指令 五、more指令 六、less指令 七、head指令 八、tail指令 一、man指令 Linux的命令有很多参数&#xff0c;我们不可能全记住&#xff0c;我们可以通过查看联机手册获取帮助。访问Linux手册页的命令是 man 语法: m…...

营收净利双降、股东减持,大降价也救不了良品铺子

号称“高端零食第一股”的良品铺子(603719.SH)&#xff0c;正遭遇部分股东的“用脚投票”。 5月17日晚间&#xff0c;良品铺子连发两份减持公告&#xff0c;其控股股东宁波汉意创业投资合伙企业、持股5%以上股东达永有限公司&#xff0c;两者均计划减持。 其中&#xff0c;宁…...

【设计模式】设计模式的分类

通常设计模式的分类有创建型、行为型和结构型。 创建型 常用的有&#xff1a;单例模式、工厂模式&#xff08;工厂方法和抽象工厂&#xff09;、建造者模式。 不常用的有&#xff1a;原型模式。 创建型模式涉及到将对象实例化&#xff0c;这类模式都提供一个方法&#xff0c;将…...

TCP/UDP的连接机制

TCP/UDP的连接机制 TCP的连接机制 TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的协议&#xff0c;提供可靠的、按顺序的数据传输服务。TCP的连接机制包括连接建立、数据传输和连接终止。 1. 连接建立&#xff08;三次握手&#xff09; TCP通过…...

供应链金融模式学习资料

目录 产生背景 供应链金融的诞生 供应链金额的六大特征...

代码随想录-算法训练营day50【动态规划12:最佳买卖股票时机含冷冻期、买卖股票的最佳时机含手续费、股票问题总结】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第九章 动态规划part12● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费 ●总结309.最佳买卖股票时机含冷冻期 本题加了一个冷冻期,状态就多了,有点难度,大家要把各个状态分清,思路才能清晰…...

Dilworth 定理

这是一个关于偏序集的定理&#xff0c;事实上它也可以扩展到图论&#xff0c;dp等中&#xff0c;是一个很有意思的东西 偏序集 偏序集是由集合 S S S以及其上的一个偏序关系 R R R定义的&#xff0c;记为 ( S , R ) (S,R) (S,R) 偏序关系&#xff1a; 对于一个二元关系 R ⊂…...

BUUCTF---web---[BJDCTF2020]ZJCTF,不过如此

1、点开连接&#xff0c;页面出现了提示 传入一个参数text&#xff0c;里面的内容要包括I have a dream。 构造&#xff1a;?/textI have a dream。发现页面没有显示。这里推测可能得使用伪协议 在文件包含那一行&#xff0c;我们看到了next.php的提示&#xff0c;我们尝试读取…...

力扣刷题---2206. 将数组划分成相等数对【简单】

题目描述&#x1f357; 给你一个整数数组 nums &#xff0c;它包含 2 * n 个整数。 你需要将 nums 划分成 n 个数对&#xff0c;满足&#xff1a; 每个元素 只属于一个 数对。 同一数对中的元素 相等 。 如果可以将 nums 划分成 n 个数对&#xff0c;请你返回 true &#xf…...

2461. 长度为 K 子数组中的最大和(c++)

给你一个整数数组 nums 和一个整数 k 。请你从 nums 中满足下述条件的全部子数组中找出最大子数组和&#xff1a; 子数组的长度是 k&#xff0c;且子数组中的所有元素 各不相同 。 返回满足题面要求的最大子数组和。如果不存在子数组满足这些条件&#xff0c;返回 0 。 子数…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...