Java 连接并操作 Redis 万字详解:从 Jedis 直连到 RedisTemplate 封装,5 种方式全解析
引言
在分布式系统和高并发场景中,Redis 作为高性能内存数据库的地位举足轻重。对于 Java 开发者而言,掌握 Redis 的连接与操作是进阶必备技能。然而,从基础的 Jedis 原生客户端到 Spring 封装的 RedisTemplate,不同连接方式的原理与适用场景常让初学者困惑。如何选择合适的连接方式?序列化配置背后的逻辑是什么?生产环境中又该如何优化?
本文从 Java 操作 Redis 的核心需求出发,通过完整代码示例与逐行解析,系统讲解 Jedis 直接连接、连接池、RedisTemplate 及 StringRedisTemplate 的使用方法,深入剖析连接原理、序列化机制与性能优化策略。无论你是刚接触 Redis 的小白,还是需要规范项目实践的开发者,都能从代码细节与原理分析中获得启发,掌握从基础连接到高级应用的全流程实战技巧。
1. Redis 基础概念与 Java 生态概览
1.1 Redis 是什么?
Redis(Remote Dictionary Server)是一个基于内存的高性能键值对存储系统,具有以下核心特性:
-
数据结构丰富:支持 String、Hash、List、Set、Sorted Set 等 8 种数据结构
-
内存级性能:读写速度可达 10 万 + 次 / 秒(String 类型)
-
持久化支持:提供 RDB(快照)和 AOF(日志)两种持久化方式
-
集群能力:支持主从复制、哨兵模式、Cluster 集群
-
多语言支持:提供 Java、Python、Node.js 等多语言客户端
在 Java 生态中,主流的 Redis 客户端包括:
-
Jedis:官方提供的原生 Java 客户端,支持同步阻塞式 IO
-
Lettuce:基于 Netty 的异步非阻塞客户端,支持响应式编程
-
Spring Data Redis:Spring 封装的高层抽象,支持 Jedis/Lettuce 作为底层连接
1.2 Java 操作 Redis 的核心场景
-
缓存系统:降低数据库压力(如商品详情页缓存)
-
分布式会话:解决集群环境下的 Session 共享问题
-
计数器:实现点赞计数、接口限流等功能(利用 INCR 命令)
-
消息队列:基于 List 的 LPUSH/RPOP 实现简单队列
-
分布式锁:通过 SETNX 命令实现分布式锁机制
2.Jedis 原生客户端:从直接连接到连接池
2.0 Maven依赖
<!-- Jedis--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version></dependency>
2.1 Jedis 直接连接(非池化方式)
2.1.1 核心代码解析
@Slf4j
@SpringBootTest
public class JedisDirect {private Jedis jedis;@BeforeEachpublic void setUp(){//建立连接jedis = new Jedis("x.x.x.x",6379);//设置密码jedis.auth("xxxx");//选择库jedis.select(0);}@Testpublic void testString(){jedis.set("namePool","zhangsanPool");String value = jedis.get("name");log.info("value:"+value);}@Testpublic void testHash(){jedis.hset("user:2","name","lisiPool");jedis.hset("user:2","age","21");Map<String,String> map = jedis.hgetAll("user:1");log.info("map:"+ map.toString());}@AfterEachpublic void tearDown(){if(jedis != null){jedis.close();}}}
代码的执行结果:
结果1:
结果2:
2.1.2 核心类与对象
-
Jedis:核心客户端类,封装了所有 Redis 命令
-
构造方法:
Jedis(String host, int port)
初始化连接 -
常用方法:
-
set(String key, String value)
:存储字符串 -
get(String key)
:获取字符串 -
hset(String key, String field, String value)
:存储 Hash 字段 -
hgetAll(String key)
:获取 Hash 所有字段
-
-
-
@BeforeEach/@AfterEach:JUnit5 生命周期注解,分别用于初始化和销毁资源
2.1.3 原理分析
- 连接过程:
-
创建 Jedis 实例时建立 TCP 连接(三次握手)
-
通过 auth 命令进行密码验证(如果配置了密码)
-
select 命令选择操作的数据库(默认 0 号库)
- 命令执行:
-
客户端将命令序列化为字节流发送到 Redis 服务器
-
服务器执行命令后返回结果,客户端解析响应
2.1.4 优缺点
-
优点:简单直观,适合学习和小规模测试
-
缺点:
-
每次测试都创建新连接,性能低下(TCP 连接创建开销大)
-
并发场景下可能导致连接风暴
-
没有连接复用机制,资源利用率低
-
2.2 Jedis 连接池(池化连接)
2.2.1 连接池配置类
public class JedisConnectionFactory {private static final JedisPool jedisPool;static{JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();//最大连接jedisPoolConfig.setMaxTotal(10);//最大空闲连接jedisPoolConfig.setMaxIdle(10);//最小空闲连接jedisPoolConfig.setMinIdle(5);//设置最长等待时间jedisPoolConfig.setMaxWaitMillis(200);jedisPool = new JedisPool(jedisPoolConfig,"x.x.x.x",6379,1000,"xxxx");}//获取jedis对象public static Jedis getJedis(){return jedisPool.getResource();}
}
说明:
-
JedisPool:连接池核心类,管理连接的创建和回收
getResource()
:从连接池获取可用连接(可能从空闲队列获取或新建)
-
JedisPoolConfig:连接池配置类,常用参数:
-
maxTotal
:最大连接数(控制并发量) -
maxIdle
:最大空闲连接数(避免空闲连接过多) -
minIdle
:最小空闲连接数(保证基础可用连接) -
maxWaitMillis
:获取连接超时时间(避免无限阻塞)
-
2.2.2 连接池工作原理
- 初始化阶段:
- 启动时创建
minIdle
数量的空闲连接
- 获取连接:
-
优先从空闲队列中获取连接
-
若空闲队列为空,且当前连接数小于
maxTotal
,则新建连接 -
若连接数已达
maxTotal
,则等待maxWaitMillis
时间
- 归还连接:
-
调用
close()
方法时,连接不会真正关闭,而是放回空闲队列 -
空闲连接数超过
maxIdle
时,多余连接会被销毁
2.2.3 使用示例
@Slf4j
@SpringBootTest
public class JedisPool {private Jedis jedis;@BeforeEachpublic void setUp(){//建立连接jedis = JedisConnectionFactory.getJedis();//设置密码jedis.auth("dhj20030916.");//选择库jedis.select(0);}@Testpublic void testString(){jedis.set("name","zhangsan");String value = jedis.get("name");log.info("value:"+value);}@Testpublic void testHash(){jedis.hset("user:1","name","lisi");jedis.hset("user:1","age","21");Map<String,String> map = jedis.hgetAll("user:1");log.info("map:"+ map.toString());}@AfterEachpublic void tearDown(){if(jedis != null){jedis.close();}}
}
运行结果:
结果1:
结果2:
2.2.5 优势对比
特性 | 直接连接 | 连接池方式 |
---|---|---|
连接创建 | 每次新建 | 复用已有连接 |
并发支持 | 差 | 好(控制连接数) |
资源利用率 | 低 | 高 |
性能 | 差(连接开销) | 好(减少握手) |
适用场景 | 单线程测试 | 高并发生产环境 |
3. Spring Data Redis:高层抽象与模板化操作
3.1 核心依赖与配置
3.1.1 Maven 依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
3.1.2 YAML 配置
spring:redis:host: x.x.x.xport: 6379password: xxxxlettuce:pool:max-active: 10 #最大连接max-idle: 10 #最大空闲连接min-idle: 0 #最小空闲连接max-wait: 100 #连接等待时间
3.2 RedisTemplate 核心类解析
3.2.1 基础操作示例
@SpringBootTest
@Slf4j
public class RedisTem {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void test(){//插入一条String类型的数据redisTemplate.opsForValue().set("nameTem","赵六");Object s = redisTemplate.opsForValue().get("nameTem");log.info("nameTem:"+ s);}
}
运行结果:
3.2.2 核心类结构
-
RedisTemplate:
-
泛型参数:
<K, V>
分别表示键和值的类型 -
核心方法:
-
opsForValue()
:获取字符串操作对象(对应 String 类型) -
opsForHash()
:获取 Hash 操作对象(对应 Hash 类型) -
opsForList()
:获取列表操作对象(对应 List 类型) -
opsForSet()
:获取集合操作对象(对应 Set 类型) -
opsForZSet()
:获取有序集合操作对象(对应 Sorted Set 类型)
-
-
-
RedisConnectionFactory:
-
连接工厂接口,支持 Jedis/Lettuce 等多种实现
-
Spring 自动根据依赖加载对应的实现(如引入 jedis 依赖则使用 JedisConnectionFactory)
-
3.3 序列化机制详解
3.3.1 默认序列化问题
-
Spring Data Redis 默认使用
JdkSerializationRedisSerializer
:- 序列化后数据冗余(包含类名、版本号等信息)
- 依赖类必须实现
Serializable
接口 - 跨语言不兼容(如 Python 无法解析 JDK 序列化数据)
3.3.2 JSON 序列化配置
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {// 创建redisTemplate对象RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();//设置连接工厂redisTemplate.setConnectionFactory(connectionFactory);// 创建json序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();//设置Key的序列化redisTemplate.setKeySerializer(RedisSerializer.string());redisTemplate.setHashKeySerializer(RedisSerializer.string());//设置value的序列化redisTemplate.setValueSerializer(jsonRedisSerializer);redisTemplate.setHashValueSerializer(jsonRedisSerializer);return redisTemplate;}
}
3.3.3 序列化流程
- 存储数据:
-
值对象(如 User 对象)通过 JSON 序列化工具转为 JSON 字符串
-
键和 Hash 键通过 String 序列化转为字节数组
- 读取数据:
-
从 Redis 获取字节数组后,键反序列化为 String
-
值反序列化为对应的对象(通过 Jackson 的类型推断)
3.4 对象存储实战(序列化配置后)
3.4.1 User 实体类
@Data
public class User {private Integer id;private String name;private Integer age;
}
3.4.2 测试代码
@SpringBootTest
@Slf4j
public class RedisTemSer {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testString(){redisTemplate.opsForValue().set("nameTemSer","test");String value = (String)redisTemplate.opsForValue().get("nameTemSer");log.info("value"+ value);}@Testpublic void testHash(){redisTemplate.opsForHash().put("user:3","name","hash");redisTemplate.opsForHash().put("user:3","age","22");Map<String,Object> map = (Map<String,Object>)redisTemplate.opsForHash().entries("user:3");log.info("map"+ map);}@Testpublic void testObject(){User user = new User();user.setId(1);user.setName("object");user.setAge(20);redisTemplate.opsForValue().set("User",user);Object object = redisTemplate.opsForValue().get("User");log.info("object"+ object);}}
运行结果:
结果1:
结果2:
结果3:
3.4.3 关键细节
-
类型转换:
opsForValue().set(key, value)
支持任意对象,内部自动序列化opsForValue().get(key)
返回 Object 类型,需手动强转(依赖序列化配置)
-
Hash 操作:
opsForHash().put(key, field, value)
存储 Hash 字段,value 自动序列化entries()
方法返回 Map<String, Object>,字段值已反序列化
4. StringRedisTemplate:专注字符串场景
4.1 基本概念
-
StringRedisTemplate 是
RedisTemplate<String, String>
的子类 -
默认配置:
-
键序列化:
StringRedisSerializer
(等同于RedisSerializer.string()
) -
值序列化:
StringRedisSerializer
(直接存储字符串)
-
4.2 对象操作实战
4.2.1 测试代码
@Slf4j
@SpringBootTest
public class StringRedisTem {@Autowiredprivate StringRedisTemplate stringRedisTemplate;private static final ObjectMapper mapper = new ObjectMapper();@Testpublic void testObject() throws JsonProcessingException {User user = new User();user.setId(2);user.setName("StringRedisTem");user.setAge(20);// 手动序列化valueString json = mapper.writeValueAsString(user);stringRedisTemplate.opsForValue().set("UserRedis", json);// 获取数据String val = stringRedisTemplate.opsForValue().get("UserRedis");// 手动反序列化User userValue = mapper.readValue(val,User.class);log.info(userValue.toString());}}
运行结果:
4.2.2 核心步骤解析
- 序列化:
-
使用 Jackson 的
ObjectMapper
将 User 对象转为 JSON 字符串 -
解决
StringRedisTemplate
只能存储字符串的限制
- 存储与获取:
-
opsForValue().set(key, value)
直接存储字符串 -
opsForValue().get(key)
直接获取字符串
- 反序列化:
-
将获取的 JSON 字符串转为 User 对象
-
需要处理可能的
JsonProcessingException
异常
4.3 与 RedisTemplate 的对比
特性 | RedisTemplate | StringRedisTemplate |
---|---|---|
泛型参数 | <K, V> 任意类型 | <String, String> |
序列化 | 支持自定义序列化 | 固定 String 序列化 |
对象操作 | 自动序列化 / 反序列化 | 需手动序列化 / 反序列化 |
键类型 | 任意类型(需序列化) | 只能是 String 类型 |
适用场景 | 复杂数据类型(对象、Hash 等) | 纯字符串场景(如缓存文本) |
5. 连接方式深度对比与选型建议
5.1 技术维度对比
维度 | Jedis 直接连接 | Jedis 连接池 | RedisTemplate | StringRedisTemplate |
---|---|---|---|---|
连接管理 | 手动创建 | 连接池管理 | 框架管理 | 框架管理 |
序列化支持 | 无(需手动) | 无 | 支持自定义 | 仅 String 序列化 |
Spring 集成 | 弱 | 弱 | 强(自动装配) | 强(自动装配) |
学习成本 | 低 | 中 | 中 | 低 |
并发性能 | 差 | 优 | 优 | 优 |
5.2 场景化选型建议
5.2.1 学习阶段
-
推荐使用 Jedis 直接连接:
-
代码简单,便于理解 Redis 基本操作
-
适合单个命令测试(如 GET/SET/HSET 等)
-
5.2.2 小型项目(非 Spring)
-
推荐 Jedis 连接池:
-
避免频繁创建连接,提升性能
-
手动管理连接,适合轻量级项目
-
5.2.3 Spring Boot 项目
-
优先使用 RedisTemplate:
-
与 Spring 生态无缝集成(依赖注入、配置管理)
-
支持复杂数据类型和自定义序列化
-
推荐配置 JSON 序列化,兼容对象存储
-
5.2.4 纯字符串场景
-
使用 StringRedisTemplate:
- 简化字符串操作(避免泛型转换)
- 性能略优(减少序列化层开销)
5.3 生产环境最佳实践
- 连接池配置:
-
maxTotal
设置为系统并发量的 1.5-2 倍 -
maxWaitMillis
不超过 200ms(避免过长阻塞) -
minIdle
设置为 5-10(保证基础连接可用性)
- 序列化选择:
-
统一使用 JSON 序列化(
GenericJackson2JsonRedisSerializer
) -
键使用 String 序列化(保证可读性和可维护性)
- 异常处理:
-
添加
try-catch-finally
块,确保连接归还 -
处理
JedisConnectionException
等网络异常
- 监控与调优:
-
监控连接池的空闲连接数、活跃连接数
-
使用 Redis 的
INFO connection
命令查看服务器连接状态
6. 常见问题与解决方案
6.1 连接失败问题
现象:
- 抛出
JedisConnectionException: ``java.net``.ConnectException: Connection refused
可能原因:
-
Redis 服务器未启动
-
IP 地址或端口错误(检查配置中的 host 和 port)
-
防火墙阻止连接(需开放 6379 端口)
-
Redis 密码错误(auth 命令失败)
解决方案: -
确保 Redis 服务器正常运行(
redis-cli ping
检查连通性) -
核对配置中的连接参数(IP、端口、密码)
-
检查服务器防火墙设置(如 Linux 的
firewall-cmd
)
6.2 数据乱码问题
现象:
- Redis 存储的字符串在 Java 中获取时出现乱码
可能原因:
-
未正确设置字符编码(Jedis 默认使用 UTF-8)
-
序列化方式不匹配(如 RedisTemplate 使用 JDK 序列化,手动使用字符串读取)
解决方案:
- Jedis 中指定编码:
jedis.get("key", StandardCharsets.UTF\_8); // 显式指定编码
- RedisTemplate 统一使用 String 序列化:
template.setKeySerializer(RedisSerializer.string());
6.3 对象反序列化失败
现象:
- 从 Redis 获取对象时抛出
ClassNotFoundException
可能原因:
-
使用 JDK 序列化时,类路径不一致(如部署环境类缺失)
-
JSON 序列化时,对象缺少无参构造函数(Jackson 需要)
解决方案:
- 改用 JSON 序列化(避免类路径问题)
- 确保实体类包含无参构造函数(Lombok 的
@Data
默认生成)
7. 扩展知识:异步客户端 Lettuce
7.1 Lettuce 简介
-
基于 Netty 的异步非阻塞客户端
-
支持响应式编程(Reactor 模式)
-
适合高并发、高吞吐量场景
7.2 核心差异
特性 | Jedis | Lettuce |
---|---|---|
IO 模型 | 同步阻塞 | 异步非阻塞 |
连接方式 | 每个线程一个连接 | 单个连接处理多个请求 |
线程安全 | 非线程安全 | 线程安全 |
适用场景 | 简单同步场景 | 异步 / 反应式场景 |
7.3 配置示例
spring:redis:host: 1.94.22.150port: 6379password: dhj20030916.lettuce:pool:max-active: 10 #最大连接max-idle: 10 #最大空闲连接min-idle: 0 #最小空闲连接max-wait: 100 #连接等待时间
8. 总结:从入门到实战的成长路径
8.1 学习阶段建议
-
基础操作:掌握 Jedis 直接连接,理解 Redis 基本命令(SET/GET/HSET 等)
-
性能优化:学习连接池原理,掌握 JedisPool 配置与使用
-
框架集成:深入 Spring Data Redis,学会配置 RedisTemplate 和序列化
-
实战提升:在项目中应用缓存、分布式锁等场景,处理实际问题
8.2 核心知识图谱
8.3 结语
通过本文的系统学习,读者应能熟练掌握 Java 操作 Redis 的主流方式,理解不同连接方式的适用场景和底层原理,并能够在实际项目中根据需求选择合适的技术方案。记住,实践是最好的老师,建议通过实际项目练习加深理解,遇到问题时结合官方文档和源码进行分析,逐步提升 Redis 开发与运维能力。
相关文章:

Java 连接并操作 Redis 万字详解:从 Jedis 直连到 RedisTemplate 封装,5 种方式全解析
引言 在分布式系统和高并发场景中,Redis 作为高性能内存数据库的地位举足轻重。对于 Java 开发者而言,掌握 Redis 的连接与操作是进阶必备技能。然而,从基础的 Jedis 原生客户端到 Spring 封装的 RedisTemplate,不同连接方式的原…...

python web 开发-Flask-Login使用详解
Flask-Login使用详解:轻松实现Flask用户认证 1. Flask-Login简介 Flask-Login是Flask框架的一个扩展,专门用于处理用户认证相关的功能。它提供了用户会话管理、登录/注销视图、记住我功能等常见认证需求,让开发者能够快速实现安全的用户认证…...

快速排序算法的C++和C语言对比
快速排序算法简介: 快速排序(Quick Sort)是一种高效的排序算法,采用分治法策略。它的基本思想是: 1. 从数列中挑出一个元素作为"基准" 2. 重新排序数列,所有比基准值小的元素放在基准前面,所有比基准值大的…...

分布式事务知识点整理
目录 分布式事务问题?问题场景引入分布式事务的理论标准BASE理论附CAP理论 Two-phase Commit,2PC2PC系统组件两阶段执行过程2PC缺点 Three-Phase Commit,3PC三阶段执行过程 TTC(Try-Confirm-Cancel)seata项目以及原理how to define a Distrib…...
微信小程序数据接收
1.微信小程序蓝牙模块中的 wx.onBLECharacteristicValueChange 回调函数有时候一个数据包会分多个数据包回调,有时候多个数据包会合并成一个数据包回调,如果接收到数据包就处理业务,分拆的和合并的数据都会因为解析失败,导致业…...

鸿蒙UI开发——badge角标的使用
1、概 述 badge小红点角标是我们项目开发中常见的需求,信息标记组件,可以附加在单个组件上用于信息提醒的容器组件。效果如下: 2、Badge 接口定义如下: 👉🏻 根据数字创建标记组件; Badge(v…...

批量打印的趣事
前言 PC端网页打印大量数据的时候,比如批量打印100个标签,会出现打印样式混乱的问题 问题 数据可以设定100~自定义阈值 {data.map((_, idx) > {return <Tag qrCode啊程是个大帅逼 code{AB-${idx1}} title雷猴 key{idx} />})} 打印预览到第3…...

车载中央域控制器测试【BCM模块介绍-外灯3】
文章目录 1 摘要2 倒车灯2.1 倒车灯的作用与功能2.2 控制实现方案2.3 需求分析2.3.1系统需求2.3.2 功能安全需求(ISO 26262 ASIL B)*2.3.3 关联功能需求 3 角灯3.1 角灯(Cornering Lamp)核心作用与功能3.2 控制实现方案3.3 需求分…...

Linux系统基础——是什么、适用在哪里、如何选
一、Linux是什么 Linux最初是由林纳斯托瓦兹(Linus Torvalds)基于个人兴趣爱好开发的个人项目,他编写了最核心的内核;后面为了发展壮大Linux系统他将整个项目开源到GitHub上,可以让全世界的人都参与到项目的开发维护中…...
MySQL与Oracle六大方面之比较
MySQL与Oracle作为两大主流关系型数据库,在功能、性能、适用场景等方面存在显著差异。以下是综合多个来源的全面对比分析: 1. 事务与并发控制 - 事务提交方式: - **MySQL**:默认自动提交(可通过参数修改)&…...
二层和三层交换机的概念
前言 交换机,和它最相关的莫过于Mac地址和在osi的数据链路层。本章的重点还是有请我们的小动物们出场,来一段小故事。 在交换机森林里,二层交换机🐆是独来独往的猎豹,靠MAC地址闪电般传递消息。一天,管理员…...
计算机网络学习20250524
协议 格式—语法:数据结构或格式(怎么做)次序—时序:事件实现的顺序(做的顺序)行为动作—语义:发出什么控制信息,完成何种动作、做出何种应答 网络结构 网络边缘:主机…...
无损图片压缩 本地处理 批量处理提升效率 无需联网+无广告
各位爱图人士们!今天咱来聊聊速图压缩器,这可是个专注无损图片压缩的本地处理小能手!它核心功能超牛,能在减少图片体积时还保持画质杠杠清晰。下面咱就详细说说它的主要功能和使用特点。 首先是无损压缩技术。它用高效压缩算法&a…...

C++标准库中 std::string 类提供的 insert 成员函数的不同重载版本
下图是C标准库中 std::string 类提供的 insert 成员函数的不同重载版本,可点击C标准库获取 以下是std::string::insert各重载版本的功能及参数解释: 1. 插入完整字符串 string& insert(size_t pos, const string& str); 功能:在字…...

Qt window frame + windowTitle + windowIcon属性(3)
文章目录 window frame属性window frame的概念1. window frame的影响2. 图片演示3. 代码演示 API接口widget.cpp(测试代码) windowTitle属性API接口问题 注意点widget.cpp(属性用法) windowIcon属性API接口啥是窗口图标玩法1. 先…...
解决:VMware 虚拟机 Ubuntu 系统共享文件夹无法访问问题
以下是解决 VMware 虚拟机 Ubuntu 系统共享文件夹无法访问 问题的完整过程总结,按关键步骤和逻辑顺序梳理: 系统版本:Ubuntu 22.04.5 1. 确认 VMware Tools 已安装 验证方法:通过 ps -ef | grep vmtoolsd 检查是否存在 vmtools…...

Dify源码学习
文章目录 1 大模型基本原理1.1 model_context_tokens、max_tokens和prompt_tokens1.1.1 三者之间的关系1.1.2 总结对比 2 Dify源代码2.0 前后端代码跑起来【0】准备开发环境【1】下载代码【2】运行后端(1)Start the docker-compose stack(2&a…...

静态网站部署:如何通过GitHub免费部署一个静态网站
GitHub提供的免费静态网站托管服务可以无需担心昂贵的服务器费用和复杂的设置步骤,本篇文章中将一步步解如何通过GitHub免费部署一个静态网站,帮助大家将创意和作品快速展现给世界。 目录 了解基础情况 创建基础站点 在线调试站点 前端项目部署 部署…...

【拯救小狗】2022-1-3
缘由c学校练习试题,求解决-编程语言-CSDN问答 void 拯救小狗() {//缘由https://ask.csdn.net/questions/7622294?spm1005.2025.3001.5141int d 0, g 0, tfh[100][3]{}, x 0, c 10, dd d;std::cin >> d >> g; dd d;while (x < g && d…...

PS2025 v26.7 Photoshop2025+AI生图扩充版,支持AI画图
软件下载 【名称】:PS2025 v26.7 Photoshop2025AI生图扩充版 【大小】:4.9G 【语言】:简体中文 【安装环境】:Win10/Win11 【网盘下载链接】(务必手机注册): https://pan.quark.cn/s/51f5…...

怎么开发一个网络协议模块(C语言框架)之(三) 全局实例
1. gVrrpInstance 是什么? 这是 VRRP 全局控制结构体,命名为 vrrpGlbInstance_t,定义了整个协议运行时的 内核资源、全局状态、各类对象池、AVL 树、计时器、套接字等。 它本质上是一个单例(singleton),用于全局访问 VRRP 实例、资源、统计、socket 等。 vrrpGlbInsta…...

ShenNiusModularity项目源码学习(30:ShenNius.Admin.Mvc项目分析-15)
广告管理页面用于新建、维护及删除系统CMS管理模块的广告信息,其后台控制器类AdvListController位于ShenNius.Admin.Mvc项目的Areas\Cms\Controllers内,页面文件位于同项目的Areas\Cms\Views\AdvList内,其中Index.cshtml页面为主页面…...

香港维尔利健康科技集团全面推进AI医疗落地,构建智慧健康管理新模式
在人工智能重塑全球医疗格局的新浪潮中,香港维尔利健康科技集团再次抢占技术高地,宣布正式启动“AI医疗健康场景融合工程”,将人工智能深度嵌入健康管理的全链条服务之中。该计划不仅涵盖设备智能化、诊疗辅助算法、用户健康行为建模等核心环…...
在 .NET 环境下实现跨进程高频率读写数据
目录 ✅ 技术选型说明 📦 示例场景 🧩 数据结构定义 🚦 核心同步机制 🧑💻 消费者实现 ⚡ 性能优化技巧 🛠 部署注意事项 📈 性能基准(理论值) 在 .NET 环境下…...
Arduino和STM32的区别详解
在嵌入式开发领域,Arduino和STM32是两类非常常见的微控制器平台。它们各有优缺点,适用于不同的开发需求。本文将从硬件架构、开发环境、易用性、性能、应用场景等方面对比两者的区别。 ## 一、硬件架构 ### Arduino - **核心芯片**:大多数Ar…...

选择合适的Azure数据库监控工具
Azure云为组织提供了众多服务,使其能够无缝运行应用程序、Web服务和服务器部署,其中包括云端数据库部署。Azure数据库能够与云应用程序实现无缝集成,具备可靠、易扩展和易管理的特性,不仅能提升数据库可用性与性能,同时…...

bi软件是什么?bi软件是做什么用的?
目录 一、BI 软件是什么 1. 基本概念 2. 工作原理 二、BI 软件是做什么用的? 1. 精准洞察市场趋势 2. 优化企业战略规划 3. 辅助投资决策 三、如何选择合适的 BI 软件 1.功能匹配度 2.易用性和可扩展性 3.数据安全和稳定性 4.技术支持和服务 总结 生产…...
DeepSeek 赋能智能电网:从技术革新到全场景应用实践
目录 一、智能电网的发展现状与挑战二、DeepSeek 技术解析2.1 DeepSeek 技术原理2.2 DeepSeek 技术优势 三、DeepSeek 在智能电网中的具体应用3.1 设备管理智能化3.2 电网运行优化3.3 客户服务提升3.4 规划建设智能化3.5 经营管理高效化3.6 办公辅助便捷化 四、DeepSeek 在智能…...
xdvipdfmx:fatal: File ended prematurely. No output PDF file written.
今天忽然遇到:使用xelatex或lualatex编译,一直卡住,不报错,也无法生成PDF,主动停止编译后就报错 xdvipdfmx:fatal: File ended prematurely. No output PDF file written. 然后,之前能正常编译的一些文件…...
python进行while遍历的常见错误解析
Python中使用while循环进行遍历时,常见的错误类型及解析如下: 一、循环条件错误 错误示例: i 0 lst [1,2,3] while i < len(lst): # 实际索引范围应为[0,2]print(lst[i])i 1错误分析: 当 i 3 i3 i3时,条件 …...