下单时如何保证数据一致性?
原创 哪吒 哪吒编程 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核心功能
相关文章:
![](https://img-blog.csdnimg.cn/img_convert/abfc2748c59ea14b1e994b24b950f1f9.gif)
下单时如何保证数据一致性?
原创 哪吒 哪吒编程 2023-09-07 08:03 发表于辽宁 收录于合集#Redis11个 (给哪吒编程加星标,提高Java技能) 大家好,我是哪吒。 在前几篇文章中,提到了Redis实现排行榜、Redis数据缓存策略,让我们对Redis…...
![](https://img-blog.csdnimg.cn/45f932026d8e4c8dba735284a2eff7e4.gif#pic_center#pic_center)
【C++ Core Guidelines解析】深入理解现代C++的特性和原理
文章目录 👨⚖️《C Core Guidelines解析》的主要观点👨🏫《C Core Guidelines解析》的主要内容👨💻作者介绍 🌸🌸🌸🌷🌷🌷💐&a…...
![](https://www.ngui.cc/images/no-images.jpg)
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…...
![](https://img-blog.csdnimg.cn/img_convert/b3cb938780356fe7b027eed835437f18.png)
谷歌seo技术流
很多外贸企业和独立站都想从Google获得免费的流量,也就是SEO流量,但是在做SEO的过程中,总会面临这样或那样的问题。米贸搜谷歌推广将这些问题总结如下: 既然SEO看起来似乎很难,但还是有很多电商公司愿意投资SEO&#x…...
![](https://www.ngui.cc/images/no-images.jpg)
ReactiveUI MVVM框架(1)-Collections
ReactiveUI MVVM框架(1)-Collections ReactiveUI使用动态数据(DynamicData)用于集合的操作。 当对动态数据集合进行更改时,会产生更改通知,通知表示为ChangeSet,里面包含了更改信息࿰…...
![](https://img-blog.csdnimg.cn/b7c473b2755a43f9a665da03a5378262.png#pic_center)
【微服务】五. Nacos服务注册
Nacos服务注册 5.1 Nacos服务分级存储模型Nacos服务分级存储模型:服务集群属性:总结: 5.2 根据集群负载均衡总结 5.3 Nacos服务实例的权重设置总结: 5.6 环境隔离namespace总结 5.7 Nacos和Eureka的对比总结 5.1 Nacos服务分级存储…...
![](https://img-blog.csdnimg.cn/993a12f0ccef41eba0f69108c72551a6.png)
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 上 其他节…...
![](https://www.ngui.cc/images/no-images.jpg)
Python 二进制数据处理与转换
不得不说,Python能火是有原因的,物联网开发中常用的数据处理方式,Python都有内置的函数或方法,相当方便,官方文档见二进制序列类型,下面是一些示例代码 string Hello World! # 字符串转二进制数据 data …...
![](https://img-blog.csdnimg.cn/img_convert/77c5aeeb7991413b31e89bb36b445e51.jpeg)
【LeetCode】297.二叉树的序列化与反序列化
题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化…...
![](https://img-blog.csdnimg.cn/31da7fa157434557a2c01ab0514e9b31.png)
Java HashSet
HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。 HashSet 允许有 null 值。 HashSet 是无序的,即不会记录插入的顺序。 HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 您必…...
![](https://img-blog.csdnimg.cn/75364124d304403ea3e5fb2fdd7882d6.png#pic_center)
在iPhone上构建自定义数据采集完整指南
在iPhone上构建自定义数据采集工具可以帮助我们更好地满足特定需求,提高数据采集的灵活性和准确性。本文将为您提供一份完整的指南和示例代码,教您如何在iPhone上构建自定义数据采集工具。 自定义数据采集工具的核心组件 a、数据模型 数据模型是数据采…...
![](https://www.ngui.cc/images/no-images.jpg)
Android MediaRecorder录音
1. 简介 在android中录制音频有两种方式,MediaRecorder和AudioRecord。两者的区别如下: MediaRecorder 简单方便,不需要理会中间录制过程,结束录制后可以直接得到音频文件进行播放;录制的音频文件是经过压缩的&#…...
![](https://img-blog.csdnimg.cn/img_convert/99c254e197fcc765a9d7b38b609d90db.jpeg)
软件提示vcruntime140_1.dll丢失的解决方法,以及丢失的原因总结
在运行某些程序时,可能会出现“vcruntime140_1.dll 丢失”的错误提示。这是因为 vcruntime140_1.dll 是 Visual C Redistributable 的一部分,它通常被安装在 Windows 操作系统上。如果该文件丢失或无法找到,可能会导致程序无法正常运行。在我…...
![](https://img-blog.csdnimg.cn/ac28e549c3a7416dbb9cab7881db07d3.png)
Datax抽取mysql的bit类型数据
背景:使用datax抽取mysql的一张表,里面有两个bit类型的字段,抽取出来显示如下: 需要在抽取reader里面进行处理配置 最终生成的datax的json文件reader的配置会转换为具体的数值 最终查询效果:...
![](https://img-blog.csdnimg.cn/b054d2813894465da0a50c0f9063b4e4.png)
git 后悔药
前言 自上而下,撤销可以分为从远程库撤销,从本地库撤销,从暂存库撤销。 例子:代码已经提交了三个记录到远程库,分别对应了记录1,内容1,记录2,内容2,记录3,内…...
![](https://img-blog.csdnimg.cn/e774f41eadae4609879aacb910eb91b8.png#pic_center)
vue-cli搭建一个新项目及基础配置
vue-cli搭建一个新项目及基础配置 一、安装步骤二、main.js配置三、router下的index.js 一、安装步骤 1.安装node环境:下载地址:Node.js 2.安装脚手架:npm install -g vue/cli 3.创建vue项目:vue create 项目名 4.进入项目&…...
![](https://img-blog.csdnimg.cn/img_convert/a01874e9f63b0d56a1af985f9de5bb33.png)
【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.…...
![](https://img-blog.csdnimg.cn/ee8d5c39319a48b295e2573ff514174e.png)
附录1-爬虫的一些技巧
目录 1 寻找url与显示内容的关系 2 修改请求头 3 局部刷新 4 阅读返回信息 5 多尝试页面其他的使用方式 6 尝试不同类型参数 7 表单类型的post多用data发,接口类型的post多用json发 8 消除degger 9 你在浏览器上看到的html与你下载下来的html不一…...
![](https://img-blog.csdnimg.cn/ae110a5ab78548c880bebe50684d686f.png)
【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】HAL移植
一、环境介绍 RK3588主板搭载Android12操作系统,内核是Linux5.10,使用ST的六轴传感器LSM6DSR芯片。 二、芯片介绍 LSM6DSR是一款加速度和角速度(陀螺仪)六轴传感器,还内置了一个温度传感器。该芯片可以选择I2C,SPI通讯,还有可编程终端,可以后置摄像头等设备,功能是很…...
![](https://img-blog.csdnimg.cn/2c8a9a73a44744b78ae58fe46c10cda7.png)
DragGAN应运而生,未来在4G视频上都可能利用拖拽式编辑
原创 | 文 BFT机器人 2023年8月14日-15日,第七届GAIR全球人工智能与机器人大会在新加坡乌节大酒店成功举办。 在「AIGC 和生成式内容」分论坛上,南洋理工大学科学与工程学院助理教授潘新钢以《Interacitve Point-Dragging Manipulation of Visual Cont…...
![](https://img-blog.csdnimg.cn/img_convert/014abd2493880d13d9045fececc8a62d.png)
【C++技能树】多态解析
Halo,这里是Ppeua。平时主要更新C,数据结构算法,Linux与ROS…感兴趣就关注我bua! 文章目录 0.多态的概念0.1 多态的定义 1. 重写2.Final与Override3.抽象类4.多态中的内存分布.4.1虚表存在哪里? 5.多态调用原理5.1 动态绑定与静…...
![](https://img-blog.csdnimg.cn/340efc707ffd46ccb149be793f5f743c.png)
【爬虫笔记】Python爬虫简单运用爬取代理IP
一、前言 近些年来,网络上的爬虫越来越多,很多网站都针对爬虫进行了限制,封禁了一些不规则的请求。为了实现正常的网络爬虫任务,爬虫常用代理IP来隐藏自己的真实IP,避免被服务器封禁。本文将介绍如何使用Python爬虫来…...
![](https://www.ngui.cc/images/no-images.jpg)
IP协议-NAT机制(理解网络结构的关键要点)
前言 我们现在使用得最多的IP协议版本是IPv4,IPv4是4个字节,32位,也就是说我们的IP地址最多就只有2^32(42亿)个,在日常生活中,我们需要联网的设备都需要有IP地址才能进行通讯,很明显…...
![](https://img-blog.csdnimg.cn/img_convert/15e7616c8fbb4d98cdfdb094541f3ece.png)
Python UI自动化 —— 关键字+excel表格数据驱动
步骤: 1. 对selenium进行二次封装,创建关键字的库 2. 准备一个表格文件来写入所有测试用例步骤 3. 对表格内容进行读取,使用映射关系来对用例进行调用执行 4. 执行用例 1. 对selenium进行二次封装,创建关键字的库 from time imp…...
![](https://img-blog.csdnimg.cn/img_convert/f7f22b80e9e30f5077f2a2fdbe9213d6.png)
AI:06-基于OpenCV的二维码识别技术的研究
二维码作为一种广泛应用于信息传递和识别的技术,具有识别速度快、容错率高等优点。本文探讨如何利用OpenCV库实现二维码的快速、准确识别,通过多处代码实例展示技术深度。 二维码作为一种矩阵型的条码,广泛应用于各个领域,如商品追溯、移动支付、活动签到等。二维码的快速…...
![](https://www.ngui.cc/images/no-images.jpg)
Spring MVC Http Event Stream
什么是 Http Event Stream Event Stream 技术是一种实现服务器推送事件的方法,它通过在一个持续的 HTTP 连接上发送事件流来实现推送。具体来说,服务器发送一些事件到客户端,并将这些事件封装成一些指定格式的文本流。客户端通过监听这个流&…...
![](https://img-blog.csdnimg.cn/5c5bdb021ef74d06bd3bf7e38bf69966.png)
2023年亲测有效----树莓派启动时自动邮件上报ip
2023年亲测 树莓派启动时自动邮件上报ip 首先开启qq邮箱smtp服务shell文件内容启动自动执行python文件注意事项 首先开启qq邮箱smtp服务 然后点击开启就会有授权码 shell文件内容 在自己的shell里,运行echo $PATH,把内容覆盖下面的path。 功能 作用就…...
![](https://img-blog.csdnimg.cn/204c5ce72a5044a3bf5579eb4fcd8687.png)
Direct3D颜色
在Direct3D中颜色用RGB三元组来表示,RGB数据可用俩种不同的结构来保存,第一种是D3DCOLOR,它实际上与DWORD类型完全相同,共有32位,D3DCOLOR类型种的各位被分成四个8位项,每项存储了一种颜色分量的亮度值。 由…...
![](https://img-blog.csdnimg.cn/6df2bb958e2b46ab828658cc73d4b781.png)
LLM - 大模型速递 Baichuan2 快速入门
目录 一.引言 二.模型探索 1.模型下载 2.模型结构 ◆ Baichuan-1-13B 结构 ◆ Baichuan-2-13B 结构 3.模型测试 ◆ Baichuan-2-13B Chat 推理 ◆ Baichuan-2-13B 显存 4.模型量化 ◆ 在线量化 ◆ 离线量化 ◆ 量化效果 5.模型迁移 三.模型微调 …...
![](https://www.ngui.cc/images/no-images.jpg)
DB2和MYSQL的LOAD原理和比较测试
DB2 load的过程: (1)、装入阶段 装入阶段将源数据解析成物理数据页的格式,直接装入到数据页中。必要时还收集索引键和表统计信息。 (2)、构建索引阶段 根据在装入阶段收集的索引键创建表索引。 (…...
![](https://images.cnblogs.com/cnblogs_com/flyingis/updatecache1.jpg)
网站做长尾词好还是单个词好/ai智能搜索引擎
作者:Flyingis 提升ArcGIS Server访问速度最佳的方式是Cache,将所有图层切片保存在服务器,客户端请求时直接访问cache好的图片,这里分为两种情况,一是所有图层都做cache,二是部分图层做cache࿰…...
![](/images/no-images.jpg)
昆山外贸网站建设推广/网页制作与设计
cudaMalloc(void** p, intsize):分配size字节的存储器,并将其首地址赋给*p,至于参数为什么是二级指针,可在C语言中找到答案cudaMallocHost():这个方法是在主机上分配空间,可以加快传输速度&…...
![](https://img-blog.csdnimg.cn/img_convert/5a446e858d10bc798e88a98acef41116.png)
音频网站建设/网上在哪里打广告最有效
证书管理(SQL Server 配置管理器)01/12/2021本文内容适用于:SQL Server(所有支持的版本) - 仅限 Windows本主题介绍如何在 SQL Server Always On 故障转移群集或可用性组拓扑上部署和管理证书。SSL/TLS 证书广泛用于保护对 SQL Server 的访问。 对于早期版本的 SQL …...
![](/images/no-images.jpg)
织梦本地做的网站内网访问不/建网站建设
可以使用 ABAQUS 软件来模拟 NiTi 材料的人工肌肉。ABAQUS 是一款专业的有限元分析软件,能够帮助用户进行结构分析、动力学分析、热学分析等。为了模拟 NiTi 材料的人工肌肉,首先需要确定肌肉的几何形状和材料参数。然后,可以使用 ABAQUS 的有…...
![](/images/no-images.jpg)
做网站前端和平面配合/班级优化大师下载安装
一、什么是linux? Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。伴随着互联网的发展,Linux得到了来自全世界软件爱好者、组织、公司的支持。它除了在服务器操作系统方面保持着强劲的发展势头以外,…...
![](/images/no-images.jpg)
站长工具介绍/做网站的软件有哪些
有几种包, 需要编译的,目前不怎么确定在那里的 contrail-nodemgr contrail-openstack-* 需要contrail-provisioning项目的 contrail-setup 需要在本项目中编译的: contrail-heat contrail-fabric-utils 只包含脚本文件的,不…...