Springboot高并发乐观锁
Spring Boot分布式锁的主要缺点包括但不限于以下几点:
-
性能开销:使用分布式锁通常涉及到网络通信,这会引入额外的延迟和性能开销。例如,当使用Redis或Zookeeper实现分布式锁时,每次获取或释放锁都需要与这些服务进行交互。
-
单点故障风险:如果依赖于某个特定的服务(如Redis)来管理锁,那么该服务可能会成为单点故障。如果这个服务不可用,所有依赖它的锁机制都会失效,可能导致系统不稳定或者数据不一致的问题。
-
死锁风险:在某些情况下,如果没有正确处理异常情况或者客户端突然崩溃,可能会导致死锁现象。例如,如果一个持有锁的进程未能正确释放锁,则其他等待该锁的进程将永远处于等待状态。
-
复杂性增加:引入分布式锁增加了系统的复杂性。开发人员需要理解如何正确地使用锁,并且要考虑到各种边界条件,比如超时、重试逻辑等。此外,还需要考虑不同类型的锁(如公平锁、非公平锁)以及它们对应用行为的影响。
-
资源竞争:在高并发场景下,多个实例尝试同时获取同一把锁会导致大量的资源竞争,从而影响整体性能。特别是对于一些频繁读写的热点数据来说,这种竞争可能会成为一个瓶颈。
-
实现差异:不同的分布式锁实现之间存在差异,这意味着迁移到另一种解决方案可能需要更改代码甚至重新设计架构。而且,不是所有的实现都提供了相同的特性和保障。
-
租约管理和心跳检测:一些分布式锁实现依赖于租约(Lease)和心跳来确保锁的有效性。这要求客户端定期向锁服务发送心跳信号以保持其持有的锁。如果网络分区发生或客户端出现故障,可能会导致锁提前被释放,进而引发数据一致性问题。
-
不适合长时间持有锁:由于网络延迟和其他因素,长时间持有分布式锁不是一个好的实践,因为它可能会阻塞其他请求过久,尤其是在高并发环境中。
Redis与Lua
使用Redis与Lua脚本结合的方式虽然有很多优点,比如减少网络开销、提供原子性操作以及可复用等特性,但也存在一些缺点:
-
脚本大小和执行时间限制:
- Lua脚本的大小受到一定的限制,过大的脚本可能无法成功加载到Redis中。
- Redis对Lua脚本的执行时间也有一定限制,以防止单个脚本占用过多资源或导致服务器阻塞。如果脚本执行时间过长,可能会触发客户端配置的时间限制,进而中断脚本执行。
-
编写复杂度:
- 编写Lua脚本需要一定的编程经验,对于不熟悉Lua语言或者编程概念的开发者来说,可能存在较高的学习曲线。
- 如果Lua脚本逻辑复杂,调试和维护也会变得更加困难。
-
阻塞风险:
- 在Redis中,Lua脚本是按照顺序串行执行的,并且在执行期间会阻止其他命令的处理。因此,长时间运行的脚本可能会造成Redis服务器的阻塞,影响系统的响应速度和其他客户端的操作。
- 不应该在Lua脚本中使用阻塞命令(如BLPOP, BRPOP等),因为这会导致Redis服务器在执行脚本时被阻塞,无法处理其他请求。
-
错误处理机制有限:
- 如果Lua脚本在执行过程中出现错误,Redis不会回滚已经执行的部分,这可能导致数据处于不一致状态。
- 错误发生后,通常只能通过日志来追踪问题所在,缺乏更高级别的错误恢复机制。
-
内存消耗:
- Lua脚本一旦执行就会被缓存起来供后续调用使用,这可以提高性能但同时也增加了内存使用量。如果脚本数量庞大或每个脚本占用较多内存,可能会给Redis带来额外的压力。
-
版本兼容性:
- 随着Redis版本的更新,Lua解释器的版本也可能发生变化,这可能会导致旧版本脚本在新版本Redis上不能正常工作的问题。
-
安全性考虑:
- 使用Lua脚本时需要注意安全性,避免恶意用户利用脚本执行攻击。例如,应避免直接将用户输入作为脚本的一部分执行,以防代码注入风险。
package com.cokerlk.redisclientside;import jakarta.annotation.Resource;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.*;@RestController
public class LuaController {@Resourceprivate StringRedisTemplate stringRedisTemplate;private static final String LUA_SCRIPT = """if tonumber(redis.call('exists', KEYS[1])) == 0 thenredis.call('set', KEYS[1],'10')endif tonumber(redis.call('exists', KEYS[2])) == 0 thenredis.call('sadd', KEYS[2],'-1')endif tonumber(redis.call('get', KEYS[1])) > 0 and tonumber(redis.call('sismember', KEYS[2] , ARGV[1])) == 0 then redis.call('incrby', KEYS[1],'-1') redis.call('sadd',KEYS[2],ARGV[1])return 1else return 0 end""";@GetMapping("/sk")public Map<String,Object> secKill(String pid){Map<String,Object> resp = new HashMap<>();String uid = String.valueOf(new Random().nextInt(100000000));List<String> keys = new ArrayList<>();keys.add("P" + pid); //P1010 String类型 用于保存产品库存量keys.add("U" + pid);//U1010 SET类型 用于保存秒杀确权的UIDDefaultRedisScript<Long> redisScript = new DefaultRedisScript<>(LUA_SCRIPT,Long.class);Long result = stringRedisTemplate.execute(redisScript, keys,uid);resp.put("uid", uid);resp.put("result", result);return resp;}
}
Spring Retry + Redis Watch实现乐观锁
Spring Retry 和 Redis 的 WATCH
命令可以结合使用来实现乐观锁,尤其是在处理分布式环境下的并发控制时。这种组合可以有效地减少锁的开销,并提供一种非阻塞的方式来处理并发更新。
实现步骤
-
使用 WATCH 监视键: 在开始事务之前,使用
WATCH
命令监视一个或多个键。这告诉Redis在这些键上设置一个“观察点”,如果这些键在事务执行过程中被其他客户端修改,则当前事务将失败。 -
发起 MULTI 开始事务: 当所有需要监视的键都已确定后,使用
MULTI
命令开启一个事务。从这一刻起,所有后续命令都会被收集起来,直到EXEC
被调用。 -
尝试执行命令: 在事务中执行所需的命令(例如
GET
、SET
等),最后通过EXEC
提交事务。如果自WATCH
以来没有键被修改,那么事务将成功提交;否则,EXEC
将返回null
表示事务失败。 -
使用 Spring Retry 进行重试: 如果由于其他客户端修改了受监视的键而导致事务失败,可以通过 Spring Retry 来自动重试整个过程。这样,应用程序可以在不增加复杂性的情况下处理并发冲突。
-
定义重试逻辑: 需要为 Spring Retry 配置适当的重试策略,包括最大重试次数、等待间隔等参数。同时,应该考虑何时停止重试,比如当达到最大重试次数或者超过某个时间限制时。
添加依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.5</version></dependency>--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId></dependency><dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><version>2.0.0</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>
业务逻辑
package com.cokerlk.redisclientside;import jakarta.annotation.Resource;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SessionCallback;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.util.List;
import java.util.Objects;@Service
public class SampleService {@Resourceprivate RedisTemplate<String,Object> redisTemplate;@Retryable(retryFor = IllegalStateException.class, maxAttempts = 2)@Transactionalpublic String saWatch(){System.out.println("executing sa()");List<Object> execute = redisTemplate.execute(new SessionCallback<>() {public List<Object> execute(RedisOperations operations) throws DataAccessException {redisTemplate.watch("sa001");redisTemplate.multi();redisTemplate.opsForValue().set("pri001", -100);try {Thread.sleep(5000);} catch (InterruptedException e) {throw new RuntimeException(e);}redisTemplate.opsForValue().set("sa001", 100);return redisTemplate.exec();}});if(Objects.isNull(execute)){System.out.println("发现并发冲突:" + execute);throw new IllegalStateException("Retry");}else{System.out.println("exec执行成功:" + execute);}return "success";}
}
-
redisTemplate.execute(SessionCallback)
:- 使用
SessionCallback
来定义一个Redis会话,其中包含了一系列命令,这些命令将在一个单独的事务中执行。
- 使用
-
redisTemplate.watch("sa001")
:- 开始监视键
"sa001"
,确保在接下来的事务期间如果该键被其他客户端修改,则当前事务将失败。
- 开始监视键
-
redisTemplate.multi()
:- 启动一个Redis事务,之后的所有命令都会被收集起来,直到调用
exec()
。
- 启动一个Redis事务,之后的所有命令都会被收集起来,直到调用
控制器
package com.cokerlk.redisclientside;import jakarta.annotation.Resource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class SampleController {@Resourceprivate RedisTemplate<String,Object> redisTemplate;@Resourceprivate SampleService sampleService;@GetMapping("/test")public String testWatch(){sampleService.saWatch();return "success";}@GetMapping("/setSA")public String setSA(){redisTemplate.opsForValue().set("sa001",300);return "success";}}
Application
package com.cokerlk.redisclientside;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.retry.annotation.EnableRetry;@SpringBootApplication
@EnableRetry
public class RedisClientSideApplication {public static void main(String[] args) {SpringApplication.run(RedisClientSideApplication.class, args);}}
测试
###
GET http://localhost:8080/test###
GET http://localhost:8080/setSAexecuting sa()
exec执行成功:[true, true]
executing sa()
exec执行成功:[]
相关文章:
Springboot高并发乐观锁
Spring Boot分布式锁的主要缺点包括但不限于以下几点: 性能开销:使用分布式锁通常涉及到网络通信,这会引入额外的延迟和性能开销。例如,当使用Redis或Zookeeper实现分布式锁时,每次获取或释放锁都需要与这些服务进行交…...
编译原理复习---正则表达式+有穷自动机
适用于电子科技大学编译原理期末考试复习。 1. 正则表达式 正则表达式(Regular Expression,简称regex或regexp)是一种用于描述、匹配和操作文本模式的强大工具。它由一系列字符和特殊符号组成,这些字符和符号定义了一种搜索模式…...
如何使用ChatGPT辅助文献综述,以及如何进行优化?一篇说清楚
目录 1.写在开头 2.ChatGPT 3.提示词研究 4.第一轮研究 5.第二轮研究 6.生成文献综述 嘿宝子们!今天我们要聊的,可是个让学术圈都为之振奋的话题——ChatGPT辅助文献综述。这个教育界的新宠儿,已经不满足于仅仅在学习和教学中露两手了&…...
ZZNUOJ 1601:字母序号(C/C++/Java)
题目描述 我们把字母 A-Z 分别编号为 1-26, 现在给你一个大写字母, 输出这个大写字母的序号。 输入 输入一个大写字母 输出 输出这个大写字母的序号 样例输入 C 样例输出 3 常见的ASCII值 ASCII表中可以记下部分特殊的值(十进制)(字母从A到Z,从a到z,ASCII值依次递增)...
[CISCN 2021初赛]rsa
[CISCN 2021初赛]rsa 源代码: from flag import text,flag import md5 from Crypto.Util.number import long_to_bytes,bytes_to_long,getPrimeassert md5.new(text).hexdigest() flag[6:-1]msg1 text[:xx] msg2 text[xx:yy] msg3 text[yy:]msg1 bytes_to_lo…...
Electron -- Electron Fiddle(一)
Electron Fiddle 是一个由 Electron 团队开发的开源工具,它允许开发者快速创建、运行和调试 Electron 应用。这个工具提供了一个简洁的界面,使用户无需配置复杂的开发环境,就能快速体验和学习 Electron。强烈建议将其安装为学习工具。 学习它…...
java 实现排序的几种方式
冒泡排序(Bubble Sort) 基本原理: 它重复地走访要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 示例代码如下: 登…...
【机器学习与数据挖掘实战】案例06:基于Apriori算法的餐饮企业菜品关联分析
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支,专注于让计算机系统通过数据学习和改进。它利用统计和计算方法,使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数据集中发现模式、关联…...
陀螺仪选型
瑞芬官网 datasheet 陀螺仪、IMU姿态仪、陀螺转角仪、三轴姿态仪、三轴陀螺仪 mid360 imu ICM-40609-D TDK InvenSense | Mouser https://product.tdk.com/system/files/dam/doc/product/sensor/mortion-inertial/imu/data_sheet/ds-000330_icm-40609-d_v1.2.pdf...
【超详细实操内容】django的身份验证系统之限制用户访问的三种方式
目录 1、使用request.user.is_authenticated属性 2、装饰器login_required 3、LoginRequiredMixin类 通常情况下,网站都会对用户限制访问,例如,未登录的用户不可访问用户中心页面。Django框架中使用request.user.isauthenticated属性、装饰器loginrequired和LoginRequire…...
Pika Labs技术浅析(六):自动化技术
Pika Labs 的自动化技术旨在通过工作流引擎和自动化警报系统,帮助用户实现业务流程的自动化和实时监控。 一、自动化技术模块概述 Pika Labs 的自动化技术模块旨在通过以下两个核心组件,实现业务流程的自动化和实时监控: 1.工作流引擎&…...
springboot471基于协同过滤算法商品推荐系统(论文+源码)_kaic
摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装协同过滤算法商品推荐系统软件来发挥其高效地信息处理的作用…...
【YashanDB知识库】jdbc查询st_geometry类型的数据时抛出YAS-00101错误
本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7802956.html?templateId1718516 问题现象 某客户的业务在通过YashanDB jdbc驱动查询含有st_geometry列的数据时,报如下异常:YAS-00101 cannot allocate 0 byte…...
ajax中get和post的区别,datatype返回的数据类型有哪些?web开发中数据提交的几种方式,有什么区别。
在 Web 开发中,GET 和 POST 是两种常见的 HTTP 请求方法,它们有一些显著的区别。此外,datatype 参数在 jQuery 的 ajax() 请求中指定了预期的响应数据类型。接下来,我会详细解释这些问题。 1. GET 和 POST 请求的区别 GET 请求 和…...
EKF异常状态自检
https://wenku.csdn.net/column/25p1jkf4vz https://www.zhihu.com/question/293038308/answers/updated https://zhuanlan.zhihu.com/p/12011086094 常用数据分析方法:方差分析及实现!-腾讯云开发者社区-腾讯云 方差分析的七种类型_双因素方差分析 自变…...
《解析 MXNet 的 C++版本在分布式训练中的机遇与挑战》
在深度学习的广袤领域中,分布式训练已成为应对大规模数据和复杂模型训练需求的关键手段。MXNet 作为一款备受瞩目的深度学习框架,其 C版本在分布式训练方面展现出独特的魅力,同时也面临着诸多挑战。深入探究这些优势与挑战,对于推…...
UVM学习总结
问题1:同时出现几个相同的uvm_config_de()哪个有效? UVM中的配置对象是通过uvm_config_db类实现的。uvm_config_db类使用一对名称和值来存储配置信息。当多个uvm_config_db.call()调用同时提供相同名称的配置时,最后一个调用将覆盖之前的调用…...
TCP/IP 介绍:网络通信的基石
TCP/IP 介绍:网络通信的基石 计算机通信协议概述 在数字时代,计算机之间的通信变得至关重要。计算机通信协议(Computer Communication Protocol)是一套规则,定义了计算机如何相互交流信息。这些协议确保了不同制造商…...
华为IPD流程6大阶段370个流程活动详解_第二阶段:计划阶段 — 86个活动
华为IPD流程涵盖了产品从概念到上市的完整过程,各阶段活动明确且相互衔接。在概念启动阶段,产品经理和项目经理分析可行性,PAC评审后成立PDT。概念阶段则包括产品描述、市场定位、投资期望等内容的确定,同时组建PDT核心组并准备项目环境。团队培训涵盖团队建设、流程、业务…...
基于Spring Boot的建材租赁系统
一、系统背景与目的 随着建筑行业的快速发展,建材租赁需求日益增加。传统的建材租赁管理方式大多依赖于纸质文档或简单的电子表格,不仅效率低下,还容易出现信息遗漏和错误。为了解决这些问题,基于Spring Boot的建材租赁系统应运而…...
YOLO v5 Series - MQTT
MQTT...
uni-app开发订单列表页面
目录 一:功能描述 二:功能实现 一:功能描述 订单列表页面包含三个部分,最上面显示订单的状态信息,可以根据订单进行切换,中间显示订单的商品和价格信息,最下面显示订单的操作按钮,可以根据不同的状态操作订单。 二:功能实现 1:状态切换 <view class="nav-…...
14,攻防世界Web_php_unserialize
进入场景 看见代码,解析一下 这段PHP代码定义了一个名为Demo的类,并演示了如何通过URL参数进行反序列化和文件高亮显示的功能,同时也包含了一些安全措施以防止对象注入攻击。下面是对这段代码的逐行解释: 1.<php 开始PHP代码…...
基于单片机的电梯声控系统设计(论文+源码)
1.系统设计 在目前的高楼住宅,商业大厦中电梯是不可或缺的,而传统的电梯控制器系统,通常需要用户用手去按下按键进行控制,但是这种方式在有些情况下,并不完善,比如在本次新冠疫情期间,由于新冠…...
宠物用品电子商务系统|Java|SSM|VUE| 前后端分离
【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…...
每日一题 341. 扁平化嵌套列表迭代器
341. 扁平化嵌套列表迭代器 展开成数组来解题 class NestedIterator {vector<int> nums;int idx;void flattened(vector<NestedInteger> &nestedList){for(int i0;i<nestedList.size();i){if(nestedList[i].isInteger()){nums.push_back(nestedList[i].get…...
小程序 - 模拟时钟
微信小程序常用API练习 - 模拟时钟小程序开发笔记 模拟时钟 “模拟时钟”微信小程序是一个简约风格的动态时钟,该时钟时间与系统时间一致,且时针、分针、秒针会与系统时间同步更新,用户可以很方便地查看时间。下面将对“模拟时钟”微信小程序…...
UDP的报文结构和特点
1.UDP传输协议的特点 使用UDP传输协议进行通信,过程类似于寄信,它的特点如下: 无连接:知道对端的IP号和端口号就直接进行传输,不需要建立连接;不可靠:没有可靠机制,发送数据包以后&a…...
如何在服务器上克隆、pull、push GitHub私有项目
诸神缄默不语-个人CSDN博文目录 情况是这样的,我直接用git clone命令后,会提示让我输入GitHub账号密码,我输入后它还是显示克隆失败,并显示: Cloning into folder_name... Username for https://github.com: user_na…...
mybatis 动态 SQL
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底…...
LeetCode 1661. 每台机器的进程平均运行时间
LeetCode 1661. 每台机器的进程平均运行时间 表: Activity ----------------------- | Column Name | Type | ----------------------- | machine_id | int | | process_id | int | | activity_type | enum | | timestamp | float | ----------------------- 该表展示了一家工厂…...
【RabbitMQ】RabbitMQ保证消息不丢失的N种策略的思想总结
文章目录 生产者端(消息发布端)保证机制RabbitMQ服务器端保证机制消费者端(消息接收端)保证机制除了MQ自带的机制,还能做的操作持久化的原理ACK思想 更多相关内容可查看 消息从发送,到消费者接收࿰…...
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
人无完人,持之以恒,方能见真我!!! 共同进步!! 文章目录 一、翻译环境和运行环境二、翻译环境1.编译预处理编译汇编 2.链接 三、运行环境 一、翻译环境和运行环境 在 ANSI C 的任何⼀种实现中&am…...
Codeforces Round 994 (Div. 2)-D题
题目链接:https://codeforces.com/contest/2049/problem/D 题目大意是在开始移动之前,可以任意次将一行元素向左挪一格,代价是1,开始游戏后,只能向下走或者向右走,直到走到终点,问最小代价是多少. constexpr ll inf 1E18; void solve() {int n, m, K;std::cin >> n &g…...
【计算机视觉】opencv-停车位检测原理及代码演示
概述 本文介绍了一种基于OpenCV库的停车场空位检测方法。通过本项目演示,可以对opencv库有更深刻的理解。文章详细阐述了检测原理、算法流程以及代码实现。 一、原理介绍 基于OpenCV的停车位检测原理涉及多个图像处理步骤,以下将结合相关公式详细介绍每…...
C++面向对象三大特征之一 ——(多态)
C面向对象三大特征之一 ——多态 一. 多态的概念二. 多态的定义及实现2.1多态的构成条件2.2 虚函数2.3虚函数的重写虚函数重写的两个例外: 2.4 C11 override 和 final2.5 重载、覆盖(重写)、隐藏(重定义)的对比 三. 抽象类接口继承和实现继承 四.多态的原理4.1虚函数…...
HTTP协议及安全防范
由于图片解析问题,可以点击查看 👉🏻 博客原文 HTTP(Hypertext Transfer Protocol)超文本传输协议是一个用于 Web 应用程序通信的应用层协议。它是一种客户端-服务器协议,客户端通过发送请求到服务器来获取…...
JVM简介—1.Java内存区域
1.运行时数据区的介绍 (1)运行时数据区的定义 Java虚拟机在执行Java程序的过程中,会把它所管理的内存划分为若干个不同的数据区域,这些区域各有各的用途以及各自的创建和销毁时间也不一样。有的区域会随着虚拟机的进程启动而存在,有的区域则依…...
IPC协议获取签名信息
一:IPC协议获取签名信息详解 目录 什么是IPC协议?签名信息概述IPC协议中签名信息获取的流程相关知识点 数字签名原理常见签名算法数据完整性与认证签名的生成与验证IPC中的安全传输 应用场景总结 什么是IPC协议? IPC(Inter-Pro…...
高校就业管理系统:数据驱动的就业服务创新
1 Java语言 Java语言是目前最流行的语言之一,不仅可以做桌面窗口形式的程序,还可以做浏览器访问的程序,目前最流行的就是用Java语言作为基础,做各种程序的后台处理。Java语言是操作变量的语言,而变量则是Java对于数据存…...
C++中的模板元编程
模板元编程 模板特化: 指的是对某个特定类型或特定类型组合提供模板的定制实现。 示例: #include<iostream> using namespace std;template <typename T> void func(T t) {cout << "Generic template: " << t <…...
rk3568制冷项目驱动开发流程汇总(只适用于部分模块CIF DVP等,自用)
采用fpga输入,3568采集并显示至hdmi RKVICAP 驱动框架说明 RKVICAP驱动主要是基于 v4l2 / media 框架实现硬件的配置、中断处理、控制 buffer 轮转,以及控制 subdevice(如 mipi dphy 及 sensor) 的上下电等功能。 对于RK356X 芯片而言, VICAP…...
EMC——射频场感应的传导骚扰抗扰度(CS)
术语和定义 AE(辅助设备) 为受试设备正常运行提供所需信号的设备和检验受试设备性能的设备; 钳注入 是用电缆上的钳合式“电流”注入装置获得的钳注入; 电流钳 由被注入信号的电缆构成的二次绕组实现的电流变换器; 电磁…...
postgreSql对分钟级的降雨数据进行插值为整小时
postgreSql对分钟级的降雨数据进行插值为整小时 SQL语句实现 SQL语句实现 --核查某个小流域的降雨量小时插值是否正确SELECT tm, sum(drp) as sum, round(sum(drp), 2) as drp2 from(SELECT a.stcd, (TO_TIMESTAMP(time_period, YYYY-MM-DD HH24:MI:SS) INTERVAL 1 HOUR) as t…...
如何安全获取股票实时数据API并在服务器运行?
以下是安全获取股票实时数据 API 并在服务器运行的方法: 选择合适的券商或交易平台 评估自身需求:明确自己的交易策略、交易品种、交易频率等需求,以及对 股票api 的功能、性能、稳定性等方面的要求。调研券商或平台:了解不同券商…...
Android Bootable Recovery 中的 `imgdiff.cpp` 文件解析
Android Bootable Recovery 中的 imgdiff.cpp 文件解析 引言 在 Android 系统中,Recovery 模式是一个非常重要的组成部分,它允许用户在设备无法正常启动时进行系统修复、数据恢复、OTA 更新等操作。其中,OTA(Over-The-Air)更新是 Android 系统中常见的更新方式,它通过网…...
golang学习笔记-变量与常量
1.标识符 在编程语言中标识符就是程序员定义的具有特殊意义的词,比如变量名,常量名,函数名等.go语言中标识符有字母数字和_(下划线)组成,并且只能以字母和_开头 2.关键字 关键字是指变成语言中预先定义好的特殊含义的标识符 break default func interface select case …...
关于变分量子算法的问答
1.零噪声外推如何通过增加误差的过程来改善估计的误差缓解类型? 解释:**零噪声外推(ZNE)**是一种误差缓解方法,通过故意增加噪声并利用这些增加噪声的结果来改进量子电路的估计。其核心思想是在不同的噪声级别下运行量子电路&am…...
小学数学思维训练 一年级 第一周(少儿思维启蒙)
前言 本文主要介绍了通过各种题型和解题方法培养孩子的数学思维能力。通过系统的方法训练一年级学生的数学思维能力,帮助他们学会举一反三,融会贯通地解决各类数学问题。 点击获取小学数学1-6年级思维训练电子版 第一周 比一比 比一比是实际生活中常…...
sqlite 自定以脚本解释器
应用程序使用 libfdt 解析设备树,获取兼容性配置 内核源码支持libfdt 标准设备树语法,不用自己再创造 非常的爽,因为设备树支持预编译 一些可以跑类 BSD 系统的设备也可以使用这样的方法,不仅仅是在linux 系统上跑 有pylibfdt 支持解析设备树,校验设备树是否是正确的…...