[Redis#10] scan | db_0 | redis_cli | RESP | C++-redis启动教程
目录
1. 渐进式遍历
1.2 常见指令 - scan
2. 数据库管理
3.redis 客户端
是否前面学习的这些 redis 命令,没有价值了呢?
4.RESP 自定义协议
为什么能编写出一个自定义的 Redis 客户端?
RESP 协议
5.在 Ubuntu 下启用 C++ 操作 Redis
1. 前置依赖 - hiredis
2. 安装 redis-plus-plus
3. 示例:通用命令
1. 渐进式遍历
keys *
指令用于获取 Redis 中所有的 key,采用遍历的方式。但当 Redis 存储的 key 较多时,该操作可能会阻塞 Redis,影响其他指令执行。- 为避免上述问题,可以使用
scan
指令进行渐进式遍历。这种方式可以在不卡死服务器的情况下获取所有 key,并且 每次执行命令只获取其中的一小部分数据,如果 key 较多,则需要多次执行scan
命令。
1.2 常见指令 - scan
- 语法:
scan cursor [MATCH pattern] [COUNT count] [TYPE type]
功能:以渐进式方式对 Redis 中的所有键进行遍历。
- cursor:表示从哪个 光标 开始遍历。光标为 0 时,表示从头开始遍历。光标的概念不可以理解为下标,它不是一个连续递增的整数,他只是一个普通的字符串在每次遍历后返回下次遍历开始的光标(若 返回的字符串是 0,说明遍历已经完成)。
-
- 可能程序员不理解,但是 Redis服务器是可以知道这个光标对应的元素的位置的.
- pattern:匹配指定模式的 key。
- count:限制每次返回的元素个数,默认为 10。需要注意的是,这里的 count 只是客户端给 Redis 服务器的一个 建议,具体返回多少取决于实际情况。
- type:指定 key 对应 value 的类型,包含 5 个通用类型和 5 个特殊场景使用的类型。
在遍历过程中,不会在服务器中保存任何状态信息,如光标位置等。遍历可以随时终止,不会对服务器产生副作用。
- 就像我们去吃烧烤,如果有一部分烧烤还没有上来,我们就需要退款,这时候老板就到后厨看了一眼,说已经烤上了,退不了了。
- 再比如我们在遍历 Redis 服务器中的 key 的时候,遍历了一半,不想遍历了,但是这时候又取消不了,如果强行退出,这时候 服务器就会保存状态,这时候就会对服务造成一定的影响,这时候就相当于服务器保存了客户端的状态。
- 再比如我们去超市买东西,如果我们在结账的时候,发现钱没有带够,后面的东西不想要了,这时候 可以不扫后面的商品。
- 这时就像 Redis 中的渐进式遍历,没有保存之前遍历的状态,可以随时停止。
示例:
127.0.0.1:6379> mset k1 val1 k2 val2 k3 val3 k4 val4 k5 val5
OK
127.0.0.1:6379> scan 0 count 3
1) "1" // 返回下次开始遍历的光标
2) 1) "k3"2) "k4"3) "k5"
127.0.0.1:6379> scan 1 count 3
1) "0"
2) 1) "k1"2) "k2" // 虽然输入的 count 是 3, 但是只遍历了 2 个
- 注意:尽管
scan
解决了阻塞问题,但在 遍历期间如果键有所变化(增加、修改或删除),可能会导致重复遍历或遗漏。
不仅仅是 Redis,遍历其他内容的时候,也是比较忌讳一边遍历一边修改的。
C++ STL
遍历 + 修改/新增/删除 => 迭代器失效
std::vector<int> v = {1, 2, 3, 4};
for (auto it = v.begin(); it != v.end(); ++it) {v.erase(it);
}
注意!!这样的代码,就会导致“迭代器失效”。
当删除完成之后,it
这个迭代器指向哪里,已经不知道了!
此时循环体结束之后再次 ++it
,不一定就能指向下一个元素了。
- 在遍历过程中,不要一边遍历一边修改。
- C++ 中的迭代器在删除元素后可能会失效。
大部分编程语言中,++
都是后置写的
- C++ 更偏好前置
++
-
- 在 C++ 里 前置
++
比后置++
性能更高(少了一次临时对象的构造)
- 在 C++ 里 前置
- Java 中
++
只是针对数字,数字本身无论是前置后置都是足够快
-
- C++ 中
++
可能是针对一个对象(C++ 有运算符重载)
- C++ 中
不像 C++ 里可能就崩溃了
- Redis 虽然不会给你崩溃,但是可能会出现 遗漏重复。
2. 数据库管理
- 类似于 MySQL 中的 database 概念,Redis 中也有 database 的概念,但用户不能随意创建或删除数据库。
- Redis提供了⼏个⾯向Redis数据库的操作,分别是
dbsize
、select
、flushdb
、flushall
说明:
- 许多关系型数据库,例如MySQL⽀持在⼀个实例下有多个数据库存在的,但是 与关系型数据库⽤字符来区分不同数据库名不同,Redis只是⽤数字作为多个数据库的实现
- Redis默认配置中是有16个数据库。
select 0
操作会切换到第⼀个数据库,select 15
会切换到最后⼀个数据库 - 0号数据库和15号数据库保存的数据是完全不冲突的,即各种有各⾃的键值对。默认情况下,我们处于数据库0
- 选择数据库:可以通过
select dbIndex
(例如select 1
) 来切换数据库。 - 清除数据库:
-
flushdb
:清除当前数据库中的所有数据。flushall
:清除 Redis 服务器中的所有数据。
- 示例:
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> SELECT 0
OK
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> keys *
(empty array)
警告:永远不要在线上环境 执行清除数据的操作,除非你想要体验“从删库到跑路”的操作。
注意:Redis中虽然⽀持多数据库,但随着版本的升级,其实不是特别建议使⽤多数据库特性
- 如果真的需要完全隔离的两套键值对,更好的做法是维护多个Redis实例,⽽不是在⼀个 Redis实例中维护多数据库
-
- 这是因为本⾝Redis并没有为多数据库提供太多的特性
- 其次⽆论是否有多个数据库,Redis都是使⽤单线程模型,所以彼此之间还是需要排队等待命令的执⾏
- 同时多数据库还会让开发、调试和运维⼯作变得复杂
- 实践中,始终使⽤数据库0其实是⼀个很好的选择
3.redis 客户端
- 前面学习的主要是各种 redis 的基本操作/命令,都是在 redis 命令行客户端,手动执行的。
- 这种操作方式不是我们日常开发中主要的形式
- 更多的时候,是使用 redis 的 api,来实现定制化的 redis 客户端程序,进一步操作 redis 服务器。
- 用程序来操作 redis~
以前学习 MySQL 的时候~也会涉及到,关于使用程序来操作 MySQL 服务器
- C++: MySQL 原生 API
- Java: JDBC & MyBatis
redis 提供的命令行客户端 / 第三方的图形化客户端 ...
他们本质上都属于是“通用的客户端程序”
相比之下,在工作中更希望使用到的是 “专用的”“定制化”的客户端程序~
是否前面学习的这些 redis 命令,没有价值了呢?
- 当然不是的!!
- redis 命令相当于使用代码来执行
使用:
- 无论 C++还是 Java各自如何编程实现对应的 redis 客户端,其实要做的事情本质上是一样的~
- 网上关于 redis 这块的编程,基本都是 Java 为主,难道是,其他语言不配操作 redis 嘛?
- 当然不是!!!redis 能支持很多很多种编程语言
博主后面选择以 C++来进行讲解~
4.RESP 自定义协议
为什么能编写出一个自定义的 Redis 客户端?
- 网络通信中的协议层次:
-
- 应用层
- 传输层:TCP / UDP 协议
- 网络层:IP 协议
- 数据链路层:以太网
- 物理层
- 虽然业界有很多 成熟的应用层协议,如 HTTP,但在某些情况下,会“自定义”应用层协议。
-
- Redis 使用的就是一种自定义的应用层协议。
- 客户端和服务器之间的交互:
-
- 客户端按照应用层协议发送请求;
- 服务器按照该协议解析请求,并根据请求构造响应;
- 客户端再解析从服务器返回的响应。
- 关于我们能否 自己 编写自定义 Redis 客户端:
-
- 直接基于未公开的协议去编写是不可行的。然而,对于 Redis 来说,其使用的自定义协议(即 RESP)是公开的。
- 就像一些开源项目通过逆向工程实现了 QQ 客户端一样,实现过程依赖于 开发者对协议的理解和技术水平。
- 自主 开发 Redis 客户端的前提:
-
- 需要 了解 Redis 的应用层协议(暗号),即 RESP 协议。
- 由于 Redis 官方已经公开了这一协议规范,因此可以依据这些信息来编写客户端。
RESP 协议
- 名称:Redis Serialization Protocol (RESP)
- 特点:
-
- 简单易实现
- 快速解析
- 内容可读性强
- 与 TCP 的关系:
-
- 基于 TCP 传输,但不强耦合于 TCP。
- 请求-响应模型是 一问一答 的形式。
Redis 中的使用方式:
- 客户端发送命令到 Redis 服务器,服务器以 RESP 数组形式接收并处理。
- 根据命令的不同,服务器将以不同的 RESP 类型进行响应,例如:
-
- 直接返回
ok
- 返回整数
- 返回数组......
- 直接返回
常见 数据类型标识:
- Simple Strings: 开头为
+
- Errors: 开头为
-
- Integers: 开头为
:
- Bulk Strings: 开头为
$
- Arrays: 开头为
*
示例:
-
+OK\r\n
-Error message\r\n
:1000\r\n
$5\r\nhello\r\n
*2\r\n$5\r\nhello\r\n$6\r\nworld\r\n
- Simple Strings:用于传输非二进制安全的文本字符串,开销最小。
- Bulk Strings:用于传输二进制安全的数据。
- 可以发现 resp 比 htttps 的设计简单不少~
开发提示:
- 不需要手动解析或构造符合 RESP 规范的字符串,因为已有许多成熟的库支持这种操作。
- 我们只需要 使用大佬们 提供的库,就可以比较简单方便的来完成和 redis 服务器通信的操作了
5.在 Ubuntu 下启用 C++ 操作 Redis
1. 前置依赖 - hiredis
- hiredis 是一个用 C 语言实现的 Redis 客户端库,
redis-plus-plus
库基于hiredis
实现。 - 在开始之前,请确保已安装
libhiredis-dev
,可以通过以下命令安装:
sudo apt install libhiredis-dev
2. 安装 redis-plus-plus
redis-plus-plus
是一个功能强大且易于使用的 C++ Redis 客户端库。它具有统一的接口风格,使得使用起来非常方便。- 以下是安装步骤:
- 克隆
redis-plus-plus
的 GitHub 仓库到本地:
git clone https://github.com/sewenew/redis-plus-plus.git
进入克隆下来的项目目录,并创建构建目录:
cd redis-plus-plus
mkdir build && cd build
使用 CMake 配置并编译安装:
cmake .. -DCMAKE_INSTALL_PREFIX=/usr
make
sudo make install
- 说明:
-
redis-plus-plus
库支持多种方式传递参数,如 初始化列表或迭代器对。- 当函数需要返回多个数据时,通常会使用插入迭代器将结果添加到容器中。
- 对于可能返回无效值的情况,
redis-plus-plus
通常会使用std::optional
来表示。
3. 示例:通用命令
Quick Start创建一个简单的 C++ 程序来连接 Redis 并发送一个 ping
命令,以检查连接是否成功。
- main.cc:
#include <iostream>
#include <string>
#include <sw/redis++/redis++.h>using namespace std;int main()
{// 构建Redis对象的时候,在构造函数中,指定Redis服务器的地址和端口sw::redis::Redis redis("tcp://127.0.0.1:6379");string ret = redis.ping();cout << ret << endl;return 0;
}
- Makefile:
main: main.ccg++ -std=c++17 -o $@ $^ -l redis++ -l hiredis -l pthread.PHONY: clean
clean:rm main
- 编译和运行:
-
- 在终端中执行以下命令来编译程序:
make
-
- 运行生成的可执行文件:
./main
-
- 如果一切正常,可以 看到输出
PONG
,这表明已经成功连接到了 Redis 服务器啦
- 如果一切正常,可以 看到输出
相关文章:
[Redis#10] scan | db_0 | redis_cli | RESP | C++-redis启动教程
目录 1. 渐进式遍历 1.2 常见指令 - scan 2. 数据库管理 3.redis 客户端 是否前面学习的这些 redis 命令,没有价值了呢? 4.RESP 自定义协议 为什么能编写出一个自定义的 Redis 客户端? RESP 协议 5.在 Ubuntu 下启用 C 操作 Redis …...
LCR 151.彩灯装饰记录III
题目 代码 class Solution { public List<List> levelOrder(TreeNode root) { if(root null){ return new ArrayList<>(); } Queue<TreeNode> queue new LinkedList<>();List<List<Integer>> res new ArrayList<>();int sum 1;…...
vue实现滚动条滑动到底部分页调取后端接口加载数据
一、案例效果 二、前提条件 接口返回数据 三、案例代码 子组件 const $emit defineEmits([cloneItem, updateList]);const props defineProps({rightList: {type: Array,},chartTableData: {type: Array as () > ChartListType[],},deleteChartInfo: {type: Object,}…...
Vscode连接服务器
在VS Code中连接服务器的主要步骤如下: 1.安装Remote-SSH插件:打开VS Code,进入插件市场搜索“Remote-SSH”并安装。安装完成后,VS Code的侧边栏会出现一个远程资源管理器的图标。 2.配置服务器信息:点击…...
工作中Linux 内核的链表算法的使用
在 Linux 内核中,链表是一个非常重要的数据结构,广泛用于各种场景,如任务调度、设备管理、进程管理等。Linux 内核提供了高效且灵活的链表实现,能够更好地管理系统中的数据和对象。我们将深入浅出地讲解 Linux 内核链表的实现原理、用法,并举例展示如何使用。 1. 链表基本…...
洛谷P1115
最大子段和 - 洛谷 最大子段和 题目描述 给出一个长度为 n的序列a,选出其中连续且非空的一段使得这段和最大。 输入格式 第一行是一个整数,表示序列的长度n。 第二行有n个整数,第i个整数表示序列的第 i个数字 a_i。 输出格式 输出一行…...
USB Type-C一线通扩展屏:多场景应用,重塑高效办公与极致娱乐体验
在追求高效与便捷的时代,启明智显USB Type-C一线通扩展屏方案正以其独特的优势,成为众多职场人士、娱乐爱好者和游戏玩家的首选。这款扩展屏不仅具备卓越的性能和广泛的兼容性,更能在多个应用场景中发挥出其独特的价值。 USB2.0显卡ÿ…...
使用Native AOT发布C# dll 提供给C++调用
Native AOT,即提前本地编译(Ahead-Of-Time Compilation),是一种将托管代码(如 C#)编译为本机可执行文件的技术,无需在运行时进行任何代码生成。 (Native AOT 优缺点截图摘自张善友博…...
Excel中根据某列内容拆分为工作簿
简介:根据A列的内容进行筛选,将筛选出来的数据生成一个新的工作簿(可以放到指定文件夹下),且工作簿名为筛选内容。 举例: 将上面的内容使用VBA会在当前test1下生成5个工作簿,工作簿名分别为TEST1.xls TEST2.xls TEST3…...
网络安全体系与网络安全模型
4.1 网络安全体系概述 4.1.1 网络安全体系概述 一般面言,网络安全体系是网络安全保障系统的最高层概念抽象,是由各种网络安全单元按照一定的规则组成的,共同实现网络安全的目标。网络安全体系包括法律法规政策文件、安全策略、组织管理、技术…...
彻底理解quadtree四叉树、Octree八叉树 —— 点云的空间划分的标准做法
1.参考文章: (1)https://www.zhihu.com/question/25111128 这里面的第一个回答,有一幅图: 只要理解的四叉树的构建,对于八叉树的构建原理类比方法完全一样:对于二维平面内的随机分布的这些点&…...
Altium Designer脚本工具定制
原理图设计自动化 ➡️Altium原理图检查工具 ➡️元器件参数集导入导出 ➡️原理图符号自动创建 ➡️原理图高级查找 ➡️原理图库文档高级查找 ➡️原理图文档对比 ➡️原理图库文档对比 PCB设计自动化 ➡️各种各样的PCB线圈自动创建 ➡️PCB文档导出成SVG格式文档…...
容器化与容器编排(Containerization and Orchestration)
一、容器化与容器编排介绍 容器化技术(Containerization)是一种轻量级的虚拟化技术,它允许开发者将应用及其所有依赖打包到一个独立的、隔离的容器中。容器比传统虚拟机(VM)更加轻便、高效,可以跨平台部署,并且提供一致的运行环境。而容器编排(Container Orchestratio…...
娱乐API:快速生成藏头诗、藏尾诗和藏中诗
引言 诗歌是中国传统文化的重要组成部分,其中藏头诗、藏尾诗和藏中诗因其独特的形式而备受喜爱。为了满足广大文学爱好者的需求,我们推出了一款娱乐API,支持快速生成藏头诗、藏尾诗和藏中诗。本文将详细介绍该API的功能、使用方法以及如何将…...
基于Python制作一个简易UI界面
基于Python制作一个简易UI界面 目录 基于Python制作一个简易UI界面1 原理简介2 编写程序3 程序测试 1 原理简介 这里用到了Python自带的UI库tkinter。 tkinter 是 Python 的标准 GUI(图形用户界面)库,用于创建和管理图形界面。它提供了一个简…...
【视频】OpenCV:读写视频文件VideoCapture和VideoWriter
1、VideoCapture:获取视频 VideoCapture可以从摄像头或者视频文件(eg:mp4,avi)中获取视频数据。 1.1 打开视频 1)打开摄像头 cv::VideoCapture cap(0); 参数:0表示默认摄像头 2)打开视频文件 cv::VideoCapture cap("video.mp4");3)判断是否打开成功 …...
【Leecode】Leecode刷题之路第62天之不同路径
题目出处 62-不同路径-题目出处 题目描述 个人解法 思路: todo代码示例:(Java) todo复杂度分析 todo官方解法 62-不同路径-官方解法 方法1:动态规划 思路: 代码示例:(Java&…...
HarmonyOS NEXT应用开发,关于useNormalizedOHMUrl选项的坑
起因是这样的:我这库打包发布出问题了,这个有遇到的吗? 源码里面就没有 request .d.ts,这打包后哪来个这文件?且漏掉了其他文件。 猫哥csdn.yyz_1987 为啥我打包的har里面,只有接口,没有具体实现呢&#x…...
基于SpringBoot实现的编程训练系统(代码+论文)
🎉博主介绍:Java领域优质创作者,阿里云博客专家,计算机毕设实战导师。专注Java项目实战、毕设定制/协助 📢主要服务内容:选题定题、开题报告、任务书、程序开发、项目定制、论文辅导 💖精彩专栏…...
Spring Cloud Stream实现数据流处理
1.什么是Spring Cloud Stream? Spring Cloud Stream的核心是Stream,准确来讲Spring Cloud Stream提供了一整套数据流走向(流向)的API, 它的最终目的是使我们不关心数据的流入和写出,而只关心对数据的业务处…...
DETR:End-to-End Object Detection with Transformers
【DETR 论文精读【论文精读】-哔哩哔哩】 https://b23.tv/Iy9k4O2 【DETR源码解读4-哔哩哔哩】 https://b23.tv/Qp1uH5v 摘要: 将目标检测看作一个集合预测的问题 任务:给定一张图片,预测一组框,每个框需要得到坐标信息和包含的…...
【C++/Qt 】使用QCustomplot类打造一款数学函数图像生成工具(支持latex公式渲染+Python连接AI大模型)
✨✨ Rqtz 个人主页 : 点击✨✨ 🌈Qt系列专栏:点击 软件介绍 基于Qt的开源项目QCustomplot类的一款在线的数学函数图像生成工具,涉及到了数学的latex公式渲染,如何将latex语法转换为Python的函数,和如何在Qt中使用QCustomplot类进…...
Hackathon靶机系列Hackathon2
扫描ip: 获得靶机的ip:192.168.108.134 扫描端口: 获得80端口,7223的ssh和一个ftp服务器服务器中存在两个文件: 先看ftp: 默认用户名为ftp: 下载两个文件: 和 打开flag1.txt: 获得…...
Mybatis 复习
1 什么是MyBatis MyBatis是一个优秀的持久层框架,它对JDBC操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、 结果集检索等JDBC繁杂的过程代码 。…...
BurpSuite安装教程(详细!!附带下载链接)
声明 学习内容来自 B 站UP主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 ✍🏻作者简介:致…...
Istio_05_Istio架构
Istio_05_Istio架构 ArchitectureControl PlanePilotCitadelGalley Data PlaneSidecarIstio-proxyPilot-agentMetadta Exchange Ambient Architecture 如: Istio的架构(控制面、数据面) Gateway: Istio数据面的出/入口网关 Gateway分为: Ingress-gateway、Egress-gateway外部访…...
R语言结构方程模型(SEM)在生态学领域中的应用
目录 专题一、R/Rstudio简介及入门 专题二、结构方程模型(SEM)介绍 专题三:R语言SEM分析入门:lavaan VS piecewiseSEM 专题四:SEM全局估计(lavaan)在生态学领域高阶应用 专题五࿱…...
node.js基础学习-fs模块-文件操作(六)
一、前言 fs模块是 Node.js 内置的文件系统(File System)模块,它提供了一系列用于与文件系统进行交互的方法。通过fs模块,可以对文件或目录进行读取、写入、删除、重命名、查询状态等操作,这使得 Node.js 能够很好地处…...
EXCEL截取某一列从第一个字符开始到特定字符结束的字符串到新的一列
使用EXCEL中的公式进行特定截取 假设列A是一组产品的编码,我们需要的数据是“-”之前的字段。 我们需要在B1单元格输入公式“LEFT(A1,SEARCH("-",A1)-1)”然后选中B1至B4单元格,按“CTRLD”向下填充,就可以得出其它几行“-”之前的…...
JVM的垃圾回收算法有哪些
标记清除算法 标记清除算法,是将垃圾回收分为2个阶段,分别是标记和清除 根据可达性分析算法得出的垃圾进行标记对这些标记为可回收的内容进行垃圾回收 优点:标记和清除速度较快缺点:碎片化较为严重,内存不连贯的 标记整理算法 优缺点同标记…...
看华为,引入IPD的正确路径
目录 前言 引发重视 作者简介 前言 华为将 IPD 的引入过程归结为三步: 先僵化、后优化、再固化。 如果只是单纯模仿,在不清楚底层逻辑的情况下, 就开始走先僵化的流程,去搞削足适履式的引入。 开始执行后,你就…...
2024142读书笔记|《别无归处是归处》——一壶酒,一竿身,世上如侬有几人
2024142读书笔记|《别无归处是归处》——一壶酒,一竿身,世上如侬有几人 《别无归处是归处:吴镇的“渔父”画题(文人画的真性)》作者朱良志。诗词与古画并存的一本书,古画是比较偏复古黯淡微黄及墨色的&…...
think php处理 异步 url 请求 记录
1、需求 某网站 需要 AI生成音乐,生成mp3文件的时候需要等待,需要程序中实时监听mp3文件是否生成 2、用的开发框架 为php 3、文件结构 配置路由设置 Route::group(/music, function () {Route::post(/musicLyrics, AiMusic/musicLyrics);//Ai生成歌词流式…...
PostgreSQL详细安装教程
#安装PostgreSQL的yum仓库 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm#安装PostgreSQL 15版本 sudo yum install -y postgresql15-server#初始化数据库(若要自定义数据库存储目录…...
电子电气架构 --- 车载网关GW连接外部IP Tester
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...
开发一套ERP 第八弹 RUst 插入数据
更全面的报错,方便检查错误在哪里,现代高级语言越来越智能 还是得看下原文档怎么操作的 src 目录为crate 的根目录 想在crate 中模块相互引入需要在 main 中声明,各个模块,然后才能在各个模块中相互引入和使用 原始工程引入,避免直接使用 lib.rs 回合cargo 中的一些 工程管理出…...
RFdiffusion Diffuser类解读
Diffuser 类是一个封装类,调用EuclideanDiffuser和IGSO3类,用于执行扩散模型的核心功能,主要针对分子或蛋白质结构的旋转(SO(3) 群上的扩散)和位移(欧几里得空间中的扩散)。 源代码: class Diffuser:# wrapper for yielding diffused coordinatesdef __init__(self,T…...
【pdf密码】为什么我的PDF文件不能复制文字?
大家现在接触PDF文件越来越多,有的时候在网上下载的PDF文件打开之后,发现选中文字之后无法复制。甚至其他功能也都无法使用,这是怎么回事?该怎么办? 当我们发现文件打开之后,编辑功能无法使用,很…...
C#学写了一个程序记录日志的方法(Log类)
1.错误和警告信息单独生产文本进行记录; 2.日志到一定内存阈值可以打包压缩,单独存储起来,修改字段MaxLogFileSizeForCompress的值即可; 3.Log类调用举例:Log.Txt(JB.信息,“日志记录内容”,"通道1"); usi…...
Android Framework禁止弹出当前VOLTE不可用的提示窗口
文章目录 VoLTE简介VoLTE 的优势 当前VOLTE不可用的弹窗弹窗代码定位屏蔽弹出窗口 VoLTE简介 VoLTE(Voice over LTE)是一种基于4G LTE网络的语音通话技术。它允许用户在4G网络上进行高质量的语音通话和视频通话,而不需要回落到2G或3G网络。V…...
Maven Surefire 插件简介
Maven Surefire 插件是 Maven 构建系统中的一个关键组件,专门用于在构建生命周期中执行单元测试。 它通常与 Maven 构建生命周期的测试阶段绑定,确保所有单元测试在项目编译后和打包前被执行。 最新版本 Maven Surefire 插件的最新版本为 3.5.2。 使…...
vue3-新增API组件
shallowRef 创建一个响应式数据,但只对顶层属性进行响应式处理,只跟踪引用值的变化,不关心值内部的属性变化 import {shallowRef} from "vue" import UserInfo from "/components/UserInfo.vue";let name shallowRef("vue&quo…...
Linux随记(十三)
一、jstack随记 运行cmd cd C:\icp-agent\jdk_min\bin 执行 jstack PID > thread_dump.txt (查看PID:tasklist |findstr javaw 查看第二列) thread_dump.txt 取给研发二、让普通用户test,有权限使用docker指令 1、 查看当前用…...
AI数据分析工具(一)
Looker Studio(谷歌)-免费 优点 免费使用:对于中小型企业和个人用户来说,没有任何费用压力,可以免费享受到数据可视化和报表创建的功能。与Google服务集成:特别适合使用Google产品生态的企业,…...
dhcp服务
安装dhcp-libs和dhcp-common软件包是配置DHCP服务器的前提,但仅仅安装这两个软件包并不能直接开启DHCP服务器。您还需要进行以下步骤来完整配置和启动DHCP服务器: 安装DHCP服务器软件包: 除了dhcp-libs和dhcp-common,您还需要安装…...
RSA算法和AES算法,哪种更安全
目录 一、RSA (非对称加密算法) 二、AES (对称加密算法) 三、对比总结 四、更安全的选择 五、结合使用:RSA AES RSA 和 AES 是两种不同类型的加密算法,适用于不同的场景,因此它们的安全性不能直接比较,而是取决于具体的应用…...
反向代理模块开发
1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当于…...
(微信小程序)基于Spring Boot的校园失物招领平台的设计与实现(vue3+uniapp+mysql)
💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...
1-7 GD32函数指针应用
前言: 本博客仅在应用函数指针与回调函数相关的知识,通过实践巩固所学知识,也是对相关知识点的回顾。 函数指针与回调函数:1-6 GD32函数指针与回调函数-CSDN博客 目录 前言: 1.0 程序架构思想 2.0 构建串口结构体 …...
前端js面试知识点思维导图(脑图)
如果看着不清晰可以去https://download.csdn.net/download/m0_73761441/90058523访问下载,无需积分 使用百度脑图制作,可以一键导入下面的文本生成自己的脑图 js相关面试题、知识点 数据类型 1. 数据类型分类?分别包含ÿ…...