下单时如何保证数据一致性?
原创 哪吒 哪吒编程 2023-09-07 08:03 发表于辽宁
收录于合集#Redis11个
(给哪吒编程加星标,提高Java技能)
大家好,我是哪吒。
在前几篇文章中,提到了Redis实现排行榜、Redis数据缓存策略,让我们对Redis有了进一步的认识,今天继续进修,了解一下Redis在下单时是如何保证数据一致性的?
例如,在高并发访问下,可能会有多个请求同时读取同一份缓存数据,然后进行写操作,这就容易产生数据竞争的情况。同时,读写操作并不是原子性操作,可能在读取数据的时候,缓存已经被其他请求更新掉,从而导致数据不一致。
为了解决Redis缓存的数据一致性问题,我们需要做到以下两点:
-
保证所有请求都是读取最新的数据;
-
保证所有更新操作都是互斥的并且按照请求的顺序执行。

在一个在线商城系统中,面临一个重要的问题:如何在订单支付过程中保证数据的一致性,并且如何优化支付操作的性能。
1、订单支付需求
在用户下单后,需要执行订单支付操作,确保支付和订单状态的一致性。
2、数据一致性要求
支付成功后,必须将订单状态更新为已支付,以保持数据的一致性。
3、高并发支付
在高并发的情况下,需要确保订单支付的性能和数据一致性。
为了解决以上问题,我们可以使用Redis提供的事务和管道机制。
一、Redis事务
1、什么是Redis事务

在Redis中,事务是一组命令的集合,可以在一个单独的流程中执行,以保证这些命令的原子性、一致性、隔离性和持久性。
(1)事务概述
Redis事务由以下四个关键命令进行管理:
| 命令 | 描述 |
|---|---|
| MULTI | 开启事务,标记事务块的开始。 |
| EXEC | 执行事务中的所有命令。 |
| DISCARD | 取消事务,放弃所有已经入队的命令。 |
| WATCH | 监视一个或多个键,用于乐观锁。 |
(2)Redis的事务特性
Redis事务具有以下关键特性:
| 事务特性 | 描述 |
|---|---|
| 原子性 | 事务中的所有命令要么全部执行,要么全部不执行。这确保了在事务执行期间,不会发生部分命令执行成功而部分命令执行失败的情况。 |
| 一致性 | 事务中的命令会按照被添加的顺序执行,不会被其他客户端的命令打断。这保证了事务中的操作按照期望的顺序执行,不会受到并发操作的影响。 |
| 隔离性 | 在事务执行期间,事务会被隔离,不会受到其他事务的影响。即使有其他并发事务在执行,事务中的操作也不会被其他事务看到,直到事务被执行提交。 |
| 持久性 | 事务执行结束后对数据库的修改将被持久化到磁盘上。这确保了事务中的操作不会因为系统故障而丢失,从而保证了数据的持久性。 |
以上是Redis事务的基本概念和特性,它们保证了在Redis中执行的事务是可靠的、具备一致性的操作集合。

上图形表示了Redis事务的关键特性之间的相互关系。这些特性相互支持,共同确保了Redis事务的可靠性和一致性。
-
原子性保证了事务中的操作要么全部成功,要么全部失败。
-
一致性保证了事务中的操作按照特定的顺序执行,不会受到其他操作的干扰。
-
隔离性确保了事务在执行期间与其他事务相互隔离,互不干扰。
-
持久性确保了事务执行后的修改会被持久保存,不会因系统故障而丢失。这些特性一起构成了Redis事务的可靠性和稳定性的基础。
2、使用Redis事务
(1)开始和提交事务
在Redis中,使用事务需要遵循以下步骤:
-
使用
MULTI命令开启事务。 -
执行需要在事务中执行的命令。
-
使用
EXEC命令提交事务,执行事务中的所有命令。
下面是一个使用Java代码示例的详细步骤:
// 创建与Redis服务器的连接
Jedis jedis = new Jedis("localhost", 6379);// 开启事务
Transaction transaction = jedis.multi();// 执行事务中的命令
transaction.set("key1", "value1");
transaction.set("key2", "value2");// 提交事务并获取执行结果
List<Object> results = transaction.exec();
在上面的示例中,transaction.set("key1", "value1") 和 transaction.set("key2", "value2") 这两个命令会被添加到事务队列中,当transaction.exec()被调用时,事务中的所有命令会被一起执行。如果在MULTI和EXEC之间有错误发生,事务会被取消,命令不会执行。
(2)事务命令
在事务中,您可以使用常规的Redis命令,例如SET、GET、HSET、ZADD等等。这些命令会被添加到事务队列中,直到执行EXEC命令。
(3)事务示例
以下是使用Java代码示例来演示在事务中执行常见的Redis命令:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;public class RedisTransactionCommandsExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost", 6379);// 开启事务Transaction transaction = jedis.multi();// 执行事务中的命令transaction.set("name", "Alice");transaction.hset("user:1", "name", "Bob");transaction.zadd("scores", 100, "Alice");transaction.zadd("scores", 200, "Bob");// 提交事务并获取执行结果List<Object> results = transaction.exec();// 打印执行结果for (Object result : results) {System.out.println("Result: " + result);}// 关闭连接jedis.close();}
}
在上述示例中,使用了SET、HSET和ZADD命令,这些命令被添加到了事务队列中。当执行transaction.exec()时,事务中的所有命令会被一起执行。这里的示例是简单的演示,您可以根据需要添加更多的命令来构建更复杂的事务。

二、Redis管道
1、什么是Redis管道
Redis管道(Pipeline)是一种优化Redis操作的技术,它允许在单次通信中发送多个命令到Redis服务器,从而显著减少了通信开销,提高了性能。
管道可以将多个命令一次性发送给服务器,而不需要等待每个命令的响应,这使得Redis能够更高效地处理批量操作和大规模数据的读写。
下图展示了Redis管道的工作原理:

在上图中,客户端(Client)向Redis服务器(Server)发送多个命令,每个命令用Command 1、Command 2等表示。这些命令被一次性发送到服务器,而不需要等待每个命令的响应。服务器在执行所有命令后,一次性将结果响应给客户端。同时说明了Redis管道的工作方式:通过将多个命令打包成一次通信,减少了每个命令的通信开销,提高了系统的性能。
使用Redis管道时,客户端通过创建一个管道对象,将多个命令添加到管道中,然后一次性执行管道中的命令。最后,客户端可以收集所有命令的执行结果。
(1)管道概述
在Redis中,管道是通过以下命令进行管理:
| 命令 | 描述 |
|---|---|
PIPELINE | 开启管道模式,用于一次性发送多个命令。 |
MULTI | 开启事务模式,用于在管道中执行一系列命令。 |
EXEC | 提交管道中的事务,执行并返回结果。 |
使用管道,您可以将多个命令一次性发送给服务器,然后通过一次通信获得所有命令的执行结果,从而减少了每个命令的通信开销,提高了系统的性能。
(2)Redis的管道特性
使用Redis管道可以获得以下优势:
-
减少通信开销: 在普通的命令传输中,每个命令都需要来回的网络通信,而管道可以将多个命令打包一次性发送给服务器,从而大大减少了通信开销。这对于网络延迟较高的场景尤为重要,有效提高了性能。
-
提高吞吐量: 管道允许在一次通信中执行多个命令,从而在单位时间内处理更多的命令。这对于需要处理大量命令的场景,如批量数据处理、并发请求处理等,能够有效提高Redis的吞吐量和响应能力。
2、使用Redis管道
(1)管道命令
以下是一个实际案例,展示如何使用Redis管道来执行多个命令并提高性能:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import java.util.List;public class RedisPipelineExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost", 6379);// 创建管道Pipeline pipeline = jedis.pipelined();// 向管道中添加命令for (int i = 0; i < 10000; i++) {pipeline.set("key" + i, "value" + i);}// 执行管道中的命令List<Object> results = pipeline.syncAndReturnAll();// 关闭连接jedis.close();}
}
在上述案例中,使用了一个循环来向管道中添加10000个SET命令。通过使用管道,可以在一次通信中将所有命令发送到服务器,而不是逐个发送,从而减少了通信开销,提高了性能。
(2)管道优化性能
使用Redis管道可以提高性能,特别是在需要批量处理多个命令的情况下。管道的原理是一次性将多个命令发送给服务器,然后一次性获取结果,这减少了通信的往返次数,从而显著提高了吞吐量。
然而,需要注意以下几点:
-
管道不支持事务,不能保证多个命令的原子性执行。
-
使用管道时,命令的执行顺序可能与添加顺序不一致,这需要根据业务需求进行考虑。
-
管道并非在所有场景下都能带来性能提升,需要根据实际情况进行评估。
通过合理使用管道,可以最大限度地发挥Redis在高性能数据处理中的优势。

三、事务 vs 管道:何时使用何种
1、事务的适用场景
事务在某些场景下可以保证原子性和一致性的操作,特别适用于强一致性要求的业务操作,例如支付操作。
(1)强一致性操作
事务是一种适用于需要强一致性操作的机制。当多个命令需要在一个操作序列中原子性地执行时,事务可以确保这些命令要么全部执行,要么全部不执行,以保持数据的一致性。
在以下示例中,模拟一个银行转账操作,其中需要同时扣减一个账户的余额并增加另一个账户的余额:
Jedis jedis = new Jedis("localhost", 6379);// 开启事务
Transaction transaction = jedis.multi();// 扣减账户1余额
transaction.decrBy("account1", 100);// 增加账户2余额
transaction.incrBy("account2", 100);// 提交事务并获取执行结果
List<Object> results = transaction.exec();// 关闭连接
jedis.close();
(2)原子性要求高
当业务要求多个操作要么全部成功,要么全部失败时,事务是更好的选择。事务确保了事务中的一系列命令以原子操作方式执行,从而维护了数据的一致性。
2、管道的适用场景
管道适用于需要批量操作和吞吐量要求较高的场景。通过一次性发送多个命令到服务器,可以减少通信开销,提高性能。
(1)批量操作
使用管道可以有效地执行批量操作。例如,当您需要向数据库中添加大量数据时,使用管道可以减少每个命令的通信成本,从而大大提高操作的效率。
以下示例演示了如何使用管道进行批量设置操作:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import java.util.List;public class RedisPipelineBatchExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost", 6379);Pipeline pipeline = jedis.pipelined();// 向管道中添加一批设置操作for (int i = 0; i < 1000; i++) {pipeline.set("key" + i, "value" + i);}// 执行管道中的命令List<Object> results = pipeline.syncAndReturnAll();// 关闭连接jedis.close();}
}
(2)吞吐量要求高
在需要高吞吐量的场景下,管道可以显著提升性能。当多个命令需要在短时间内执行时,使用管道可以将这些命令打包发送,减少了通信的往返次数。
使用管道来进行大规模数据处理时,尤其可以在高负载的情况下提高系统的处理能力。

四、案例研究:保证订单支付的数据一致性与性能优化
1、场景描述
在一个在线商城系统中,面临一个重要的问题:如何在订单支付过程中保证数据的一致性,并且如何优化支付操作的性能。
(1)订单支付需求
在用户下单后,需要执行订单支付操作,确保支付和订单状态的一致性。
(2)数据一致性要求
支付成功后,必须将订单状态更新为已支付,以保持数据的一致性。
(3)高并发支付
在高并发的情况下,需要确保订单支付的性能和数据一致性。
2、使用Redis事务解决数据一致性问题
(1)事务实现订单支付
Jedis jedis = new Jedis("localhost", 6379);
Transaction transaction = jedis.multi();// 扣除用户余额
transaction.decrBy("user:balance:1", orderAmount);// 更新订单状态为已支付
transaction.hset("order:1", "status", "paid");List<Object> results = transaction.exec();
以上示例中,使用了Redis事务来确保在一个操作序列中,用户余额的扣除和订单状态的更新同时发生。如果事务中的任何一步操作失败,整个事务都会被回滚,保证了数据的一致性。
(2)事务的一致性保证
使用事务可以保证用户余额和订单状态的一致性,要么同时成功,要么同时失败。这样,可以确保支付和订单状态的正确性,避免了潜在的数据不一致问题。
3、使用Redis管道优化支付性能
(1)管道批量支付
Jedis jedis = new Jedis("localhost", 6379);
Pipeline pipeline = jedis.pipelined();for (Order order : orders) {pipeline.decrBy("user:balance:" + order.getUserId(), order.getAmount());pipeline.hset("order:" + order.getId(), "status", "paid");
}List<Object> results = pipeline.syncAndReturnAll();
在这个示例中,使用了Redis管道来批量处理多个订单的支付。通过将多个命令一次性发送给服务器,可以减少通信开销,从而显著提高支付操作的性能。
(2)管道的性能提升
通过使用管道,可以将多个支付操作打包在一次通信中进行,减少了通信往返次数,从而提高了支付的性能。
尤其在高并发支付的场景下,管道可以显著减少服务器负载,提高系统的响应能力。

五、事务和管道的限制与注意事项
1、事务的限制
事务在使用过程中需要注意以下限制,其中包括WATCH命令和乐观锁的使用。
(1)WATCH命令
在事务中使用WATCH命令可以监视一个或多个键,如果被监视的键在事务执行过程中被其他客户端修改,事务会被中断。这是为了保证事务的一致性和避免竞态条件。
正面例子:
Jedis jedis = new Jedis("localhost", 6379);
Transaction transaction = jedis.multi();// 监视键"balance"
transaction.watch("balance");// ... 在此期间可能有其他客户端修改了"balance"键的值 ...// 执行事务
List<Object> results = transaction.exec();
反面例子:
Jedis jedis = new Jedis("localhost", 6379);
Transaction transaction = jedis.multi();// 监视键"balance"
transaction.watch("balance");// ... 在此期间其他客户端修改了"balance"键的值 ...// 尝试执行事务,但由于"balance"键被修改,事务会被中断
List<Object> results = transaction.exec();
(2)乐观锁
在处理并发更新时,可以使用乐观锁的方式。通过使用版本号或时间戳等机制,在执行命令前先检查数据是否被其他客户端修改过,从而避免并发冲突。
正面例子:
Jedis jedis = new Jedis("localhost", 6379);// 获取当前版本号
long currentVersion = Long.parseLong(jedis.get("version"));// 更新数据前检查版本号
if (currentVersion == Long.parseLong(jedis.get("version"))) {Transaction transaction = jedis.multi();transaction.set("data", "new value");transaction.incr("version");List<Object> results = transaction.exec();
} else {// 数据已被其他客户端修改,需要处理冲突
}
2、管道的注意事项
使用管道时需要注意以下事项,包括管道的串行性和慎重使用。
(1)不支持事务
管道不支持事务,因此无法通过管道实现事务的原子性和一致性。如果需要事务支持,应该使用Redis的事务机制。
(2)慎用管道
管道虽然可以提高性能,但并不是在所有场景下都能带来性能提升。在某些情况下,由于管道的串行性,某些命令可能会阻塞其他命令的执行,反而降低了性能。
正面例子:
Jedis jedis = new Jedis("localhost", 6379);
Pipeline pipeline = jedis.pipelined();for (int i = 0; i < 1000; i++) {pipeline.set("key" + i, "value" + i);
}// 执行管道中的命令并获取结果
List<Object> results = pipeline.syncAndReturnAll();
反面例子:
Jedis jedis = new Jedis("localhost", 6379);
Pipeline pipeline = jedis.pipelined();for (int i = 0; i < 1000; i++) {// 注意:此处执行了耗时的命令,可能阻塞其他命令的执行pipeline.get("key" + i);
}// 执行管道中的命令并获取结果
List<Object> results = pipeline.syncAndReturnAll();
六、总结
本篇博客深入探讨了Redis中的事务和管道机制,以及它们在保证数据一致性和优化性能方面的应用。
通过详细的讲解和代码示例,我们了解了事务和管道的基本概念、特性、使用方法以及适用场景。以下是本篇博客的主要内容总结:
在Redis事务部分,我们了解了事务的概念和特性。事务可以确保一系列命令的原子性、一致性、隔离性和持久性。
通过MULTI、EXEC、DISCARD和WATCH命令,我们可以管理事务的开始、提交、回滚以及监视键变化。事务适用于需要保证原子性和一致性的操作,特别是在强一致性要求的场景下。
在Redis管道部分,我们深入了解了管道的概念和优势。管道允许一次性发送多个命令到服务器,减少通信开销,提高性能。
通过PIPELINE、MULTI和EXEC命令,我们可以创建管道、添加命令,并执行管道中的命令。管道适用于批量操作和吞吐量要求较高的场景,可以显著提高Redis的性能。
在事务 vs 管道:何时使用何种部分,我们对比了事务和管道的适用场景。
-
事务适用于保证强一致性操作和原子性要求高的场景;
-
管道适用于批量操作和高吞吐量的场景。
通过示例,我们说明了如何根据业务需求选择合适的机制来满足一致性和性能的需求。
在案例研究:保证订单支付的数据一致性与性能优化部分,我们应用之前的知识解决了一个实际问题。我们展示了如何使用事务保证订单支付的数据一致性,同时如何使用管道优化支付操作的性能。这个案例充分体现了事务和管道在实际业务中的应用。
在事务和管道的限制与注意事项部分,我们指出了事务和管道的一些限制和注意事项。事务受到WATCH命令和乐观锁的限制,而管道不支持事务,并且需要在使用时慎重考虑性能影响。
通过本篇博客,我们详细探讨了Redis中的事务和管道机制,了解了它们如何在实际应用中保证数据一致性和优化性能。无论是强调一致性还是追求性能,都可以根据业务需求选择合适的机制来达到最佳效果。
![]()
兄弟,王者荣耀的段位排行榜是通过Redis实现的?
离谱!面试为啥都问Redis缓存?赶紧补一下
图解Dubbo,Dubbo服务治理详解
2023年再不会K8S,就要被淘汰了,手把手带你飞
10000字,图解分布式系统限流平台Sentinel
图解Nginx,系统架构演变 + Nginx反向代理与负载均衡
图解Nacos,注册中心演变 + Nacos核心功能
相关文章:
下单时如何保证数据一致性?
原创 哪吒 哪吒编程 2023-09-07 08:03 发表于辽宁 收录于合集#Redis11个 (给哪吒编程加星标,提高Java技能) 大家好,我是哪吒。 在前几篇文章中,提到了Redis实现排行榜、Redis数据缓存策略,让我们对Redis…...
【C++ Core Guidelines解析】深入理解现代C++的特性和原理
文章目录 👨⚖️《C Core Guidelines解析》的主要观点👨🏫《C Core Guidelines解析》的主要内容👨💻作者介绍 🌸🌸🌸🌷🌷🌷💐&a…...
Go语言高阶:Reflection反射与Files操作 详细示例教程
目录标题 一、Reflection反射1. What is reflection? 什么是反射2. Inspect a variable and find its type 检查变量并找到它的类型3. Reflect.Type and reflect.Value 反射类型和值4. Reflect.Kind 查看底层种类5. NumField() and Field() methods 字段数量和索引值方法6. In…...
谷歌seo技术流
很多外贸企业和独立站都想从Google获得免费的流量,也就是SEO流量,但是在做SEO的过程中,总会面临这样或那样的问题。米贸搜谷歌推广将这些问题总结如下: 既然SEO看起来似乎很难,但还是有很多电商公司愿意投资SEO&#x…...
ReactiveUI MVVM框架(1)-Collections
ReactiveUI MVVM框架(1)-Collections ReactiveUI使用动态数据(DynamicData)用于集合的操作。 当对动态数据集合进行更改时,会产生更改通知,通知表示为ChangeSet,里面包含了更改信息࿰…...
【微服务】五. Nacos服务注册
Nacos服务注册 5.1 Nacos服务分级存储模型Nacos服务分级存储模型:服务集群属性:总结: 5.2 根据集群负载均衡总结 5.3 Nacos服务实例的权重设置总结: 5.6 环境隔离namespace总结 5.7 Nacos和Eureka的对比总结 5.1 Nacos服务分级存储…...
Lnmp架构-Redis
网站:www.redis.cn redis 部署 make的时候需要gcc和make 如果在纯净的环境下需要执行此命令 [rootserver3 redis-6.2.4]# yum install make gcc -y 注释一下这几行 vim /etc/redis/6739.conf 2.Redis主从复制 设置 11 是master 12 13 是slave 在12 上 其他节…...
Python 二进制数据处理与转换
不得不说,Python能火是有原因的,物联网开发中常用的数据处理方式,Python都有内置的函数或方法,相当方便,官方文档见二进制序列类型,下面是一些示例代码 string Hello World! # 字符串转二进制数据 data …...
【LeetCode】297.二叉树的序列化与反序列化
题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化…...
Java HashSet
HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。 HashSet 允许有 null 值。 HashSet 是无序的,即不会记录插入的顺序。 HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 您必…...
在iPhone上构建自定义数据采集完整指南
在iPhone上构建自定义数据采集工具可以帮助我们更好地满足特定需求,提高数据采集的灵活性和准确性。本文将为您提供一份完整的指南和示例代码,教您如何在iPhone上构建自定义数据采集工具。 自定义数据采集工具的核心组件 a、数据模型 数据模型是数据采…...
Android MediaRecorder录音
1. 简介 在android中录制音频有两种方式,MediaRecorder和AudioRecord。两者的区别如下: MediaRecorder 简单方便,不需要理会中间录制过程,结束录制后可以直接得到音频文件进行播放;录制的音频文件是经过压缩的&#…...
软件提示vcruntime140_1.dll丢失的解决方法,以及丢失的原因总结
在运行某些程序时,可能会出现“vcruntime140_1.dll 丢失”的错误提示。这是因为 vcruntime140_1.dll 是 Visual C Redistributable 的一部分,它通常被安装在 Windows 操作系统上。如果该文件丢失或无法找到,可能会导致程序无法正常运行。在我…...
Datax抽取mysql的bit类型数据
背景:使用datax抽取mysql的一张表,里面有两个bit类型的字段,抽取出来显示如下: 需要在抽取reader里面进行处理配置 最终生成的datax的json文件reader的配置会转换为具体的数值 最终查询效果:...
git 后悔药
前言 自上而下,撤销可以分为从远程库撤销,从本地库撤销,从暂存库撤销。 例子:代码已经提交了三个记录到远程库,分别对应了记录1,内容1,记录2,内容2,记录3,内…...
vue-cli搭建一个新项目及基础配置
vue-cli搭建一个新项目及基础配置 一、安装步骤二、main.js配置三、router下的index.js 一、安装步骤 1.安装node环境:下载地址:Node.js 2.安装脚手架:npm install -g vue/cli 3.创建vue项目:vue create 项目名 4.进入项目&…...
【C++】 C++11(右值引用,移动语义,bind,包装器,lambda,线程库)
文章目录 1. C11简介2. 统一的列表初始化2.1 {}初始化2.2 std::initializer_list 3. 声明3.1 auto3.2 decltype3.3 auto与decltype区别3.4 nullptr 4. 右值引用和移动语义4.1 左值引用和右值引用4.2 左值引用与右值引用比较4.3 右值引用使用场景和意义4.…...
附录1-爬虫的一些技巧
目录 1 寻找url与显示内容的关系 2 修改请求头 3 局部刷新 4 阅读返回信息 5 多尝试页面其他的使用方式 6 尝试不同类型参数 7 表单类型的post多用data发,接口类型的post多用json发 8 消除degger 9 你在浏览器上看到的html与你下载下来的html不一…...
【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】HAL移植
一、环境介绍 RK3588主板搭载Android12操作系统,内核是Linux5.10,使用ST的六轴传感器LSM6DSR芯片。 二、芯片介绍 LSM6DSR是一款加速度和角速度(陀螺仪)六轴传感器,还内置了一个温度传感器。该芯片可以选择I2C,SPI通讯,还有可编程终端,可以后置摄像头等设备,功能是很…...
DragGAN应运而生,未来在4G视频上都可能利用拖拽式编辑
原创 | 文 BFT机器人 2023年8月14日-15日,第七届GAIR全球人工智能与机器人大会在新加坡乌节大酒店成功举办。 在「AIGC 和生成式内容」分论坛上,南洋理工大学科学与工程学院助理教授潘新钢以《Interacitve Point-Dragging Manipulation of Visual Cont…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
