CentOS 编译安装Redis

一、编译配置hiredis.h

C++来操作redis数据库。通过hiredis接口来实现,目前只能在Linux环境使用。

  •  下载hiredis.h

  •  hiredis的下载地址为:https://github.com/redis/hiredis

  •   解压并编译hiredis

[root@localhost source_code]# pwd
/usr/local/source_code
[root@localhost source_code]# ll
总用量 5296
drwxr-xr-x. 2 root root       42 9月  18 17:32 c_demo
-rw-r--r--. 1 root root   126216 10月 10 09:42 hiredis-1.2.0.tar.gz
drwxr-xr-x. 5  500 users    8192 9月   4 15:28 jpeg-9e
-rw-r--r--. 1 root root  1046935 9月   4 15:23 jpegsrc.v9e.tar.gz
-rw-r--r--. 1 root root  4234219 8月  31 16:22 release-3.4.13.tar.gz
drwxrwxr-x. 8 root root      259 8月  31 16:33 zookeeper-release-3.4.13
[root@localhost source_code]# tar -zxvf hiredis-1.2.0.tar.gz
hiredis-1.2.0/
hiredis-1.2.0/.github/
hiredis-1.2.0/.github/release-drafter-config.yml
******
  • 执行make && make install(自动把libhiredis.so放到/usr/local/lib/中,把hiredis.h放到/usr/local/inlcude/hiredis/中)
[root@localhost source_code]# cd hiredis-1.2.0
[root@localhost hiredis-1.2.0]# make && make install
cc -std=c99 -c -O3 -fPIC   -Wall -Wextra -Werror -Wstrict-prototypes -Wwrite-strings -Wno-missing-field-initializers -g -ggdb  -pedantic alloc.c
cc -std=c99 -c -O3 -fPIC   -Wall -Wextra -Werror -Wstrict-prototypes -Wwrite-strings -Wno-missing-field-initializers -g -ggdb  -pedantic net.c
cc -std=c99 -c -O3 -fPIC   -Wall -Wextra -Werror -Wstrict-prototypes -Wwrite-strings -Wno-missing-field-initializers -g -ggdb  -pedantic hiredis.c
******
# 生成hredis 相关信息
mkdir -p /usr/local/include/hiredis /usr/local/include/hiredis/adapters /usr/local/lib
-- hiredis 头文件生成地址
cp -pPR hiredis.h async.h read.h sds.h alloc.h sockcompat.h /usr/local/include/hiredis
cp -pPR adapters/*.h /usr/local/include/hiredis/adapters
-- hiredis 动态库文件生成地址
cp -pPR libhiredis.so /usr/local/lib/libhiredis.so.1.1.0
cd /usr/local/lib && ln -sf libhiredis.so.1.1.0 libhiredis.so && ln -sf libhiredis.so.1.1.0 libhiredis.so.1
cp -pPR libhiredis.a /usr/local/lib
mkdir -p /usr/local/lib/pkgconfig
cp -pPR hiredis.pc /usr/local/lib/pkgconfig

在程序中包含#include <hiredis/hiredis.h>即可 

[root@localhost ~]# cd /usr/local/source_code/
[root@localhost source_code]# ll
总用量 5300
drwxr-xr-x. 2 root root       42 9月  18 17:32 c_demo
drwxrwxr-x. 6 root root     4096 10月 10 09:44 hiredis-1.2.0
-rw-r--r--. 1 root root   126216 10月 10 09:42 hiredis-1.2.0.tar.gz
drwxr-xr-x. 2 root root       50 10月 10 10:37 hiredis_demo
drwxr-xr-x. 5  500 users    8192 9月   4 15:28 jpeg-9e
-rw-r--r--. 1 root root  1046935 9月   4 15:23 jpegsrc.v9e.tar.gz
-rw-r--r--. 1 root root  4234219 8月  31 16:22 release-3.4.13.tar.gz
drwxr-xr-x. 2 root root        6 10月 10 10:58 zookeeper_demo
drwxrwxr-x. 8 root root      259 8月  31 16:33 zookeeper-release-3.4.13
[root@localhost source_code]# cd hiredis_demo/
[root@localhost hiredis_demo]# ll
总用量 16
-rwxr-xr-x. 1 root root 8608 10月 10 10:37 hiredis_demo
-rw-r--r--. 1 root root  697 10月 10 10:26 hiredis_demo.cpp
[root@localhost hiredis_demo]# cat hiredis_demo.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <hiredis/hiredis.h>int main() {redisContext *c;redisReply *reply;struct timeval timeout = { 1, 500000 }; // 1.5 secondsc = redisConnectWithTimeout((char*)"192.168.43.80", 6379, timeout);if (c != NULL && c->err){printf("Connection error: %s", c->errstr);redisFree(c);exit(1);}reply = (redisReply *)redisCommand(c, "SET %s %s", "foo", "bar");freeReplyObject(reply);reply = (redisReply *)redisCommand(c, "GET foo");printf("foo: %s", reply->str);freeReplyObject(reply);redisFree(c);return 0;
}
[root@localhost hiredis_demo]#
  • 编译代码的时候需要加链接的库及库的路径,那么编译命令如下
g++ hiredis_demo.cpp -o hiredis_demo -L/usr/local/lib/ -lhiredis 
  • 在执行的时候如果出现动态库无法加载。
    [root@localhost hiredis_demo]# ./hiredis_demo
    ./hiredis_demo: error while loading shared libraries: libhiredis.so.1.1.0: cannot open shared object file: No such file or directory

    那么需要进行如下配置。

  • 在 /etc/ld.so.conf.d/ 目录下新建文件 usr-libs.conf ,内容是: /usr/local/lib
vim /etc/ld.so.conf.d/usr-libs.conf
  • 然后使用命令 /sbin/ldconfig 更新一下配置即可。
sbin/ldconfig

二、hiredis.h核心方法

第一步:查看hiredis.h 头文件定义:

[root@localhost lib]# cd /usr/local/include/hiredis/
[root@localhost hiredis]# ll
总用量 56
drwxr-xr-x. 2 root root   197 10月 10 09:44 adapters
-rw-rw-r--. 1 root root  3130 7月  12 15:31 alloc.h
-rw-rw-r--. 1 root root  6288 7月  12 15:31 async.h
-rw-rw-r--. 1 root root 14319 7月  12 15:31 hiredis.h
-rw-rw-r--. 1 root root  4918 7月  12 15:31 read.h
-rw-rw-r--. 1 root root  9238 7月  12 15:31 sds.h
-rw-rw-r--. 1 root root  4409 7月  12 15:31 sockcompat.h
[root@localhost hiredis]# cat hiredis.h

 

核心方法定义

1.建立链接:redisConnect

redisContext* redisConnect(const char *ip, int port)

 函数说明:

  • 函数用来连接redis数据库, 两个参数分别是redis数据库的ip和端口,端口号一般为6379
  • 该函数redisConnect用于创建所谓的redisContext。上下文是Hiredis保持连接状态的地方。
  • 当连接处于错误状态时,该redisContext 结构具有一个err非零的整数字段该字段errstr将包含带有错误描述的字符串
  • 使用尝试连接到Redis后redisConnect,应检查该err字段以查看建立连接是否成功

 还提供了一个函数,供连接超时限定,即

redisContext* redisConnectWithTimeout(const char *ip, int port, timeval tv)。

 Demo 示例:

 c = redisConnectWithTimeout((char*)"192.168.43.80", 6379, timeout);if (c != NULL && c->err){printf("Connection error: %s", c->errstr);redisFree(c);exit(1);}

解释说明:

当函数调用不成功时,取决于函数NULL还是REDIS_ERR返回。err上下文中的字段将为非零值,并设置为以下常量之一:

  • REDIS_ERR_IO:创建连接,尝试写入套接字或从套接字读取时发生I /O错误。如果您包含errno.h在应用程序中,则可以使用全局errno变量来找出问题所在。
  • REDIS_ERR_EOF:服务器关闭了连接,导致读取为空。
  • REDIS_ERR_PROTOCOL:解析协议时出错。
  • REDIS_ERR_OTHER:其他任何错误。当前,仅在无法解析要连接的指定主机名时使用。

在每种情况下,errstr上下文中的字段都将设置为包含错误的字符串表示形式。
 

2. 执行redis命令:redisCommand

void *redisCommand(redisContext *c, const char *format...)

函数说明:

  • 该函数用于执行redis数据库中的命令,第一个参数为连接数据库返回的redisContext,剩下的参数为变参。 

  • 此函数的返回值为void*,但是一般会强制转换为redisReply类型,以便做进一步的处理。

 const char *format... 动态参数关联方法定义:

void * redisCommandArgv(redisContext * c,int argc,const  char ** argv,const  size_t * argvlen);

 函数说明:

  • 它需要参数的数量,argc字符串数组argv和参数的长度argvlen。
  • 为了方便起见,argvlen可以将设置为NULL,并且函数将strlen(3)在每个参数上使用以确定其长度。
  • 显然,当任何一个参数需要二进制安全时,argvlen都应提供整个长度数组。
  • 返回值的语义与相同redisCommand。

 Demo 示例:

 reply = (redisReply *)redisCommand(c, "SET %s %s", "foo", "bar");

3.释放redisCommand

void freeReplyObject(void *reply)

函数说明:

  • 释放redisCommand执行后返回的的redisReply所占用的内存。
  • redisCommand成功执行命令后,的返回值将保留答复。
  • 发生错误时,返回值为NULL并且err将设置上下文中的字段。返回错误后,上下文context将无法重用,您应该建立一个新的连接。

Demo 示例:

 freeReplyObject(reply);

4.断开连接:redisFree

void redisFree(redisContext *c)

函数说明:

  • 此函数立即关闭套接字,然后释放在创建上下文时完成的分配。

三、Hiredis 基于C++ 封装

redis_handler.h

#ifndef __REDIS_HANDLER_H__
#define __REDIS_HANDLER_H__#include <hiredis/hiredis.h>
#include <string>using namespace std;enum
{M_REDIS_OK = 0, //执行成功M_CONNECT_FAIL = -1, //连接redis失败M_CONTEXT_ERROR = -2, //RedisContext返回错误M_REPLY_ERROR = -3, //redisReply错误M_EXE_COMMAND_ERROR = -4 //redis命令执行错误
};class RedisHandler
{
public:RedisHandler();~RedisHandler();int connect(const string &addr, int port, const string &pwd = ""); //连接redis数据库:addr:IP地址,port:端口号,pwd:密码(默认为空)int disConnect(); //断开连接int setValue(const string &key, const string &value); //添加或修改键值对,成功返回0,失败<0int getValue(const string &key, string &value); //获取键对应的值,成功返回0,失败<0int delKey(const string &key); //删除键,成功返回影响的行数,失败<0int printAll(); //打印所有的键值对string getErrorMsg(); //获取错误信息
private:string m_addr; //IP地址int m_port; //端口号string m_pwd; //密码redisContext* pm_rct; //redis结构体redisReply* pm_rr; //返回结构体string error_msg; //错误信息int connectAuth(const string &pwd); //使用密码登录int handleReply(void* value = NULL, redisReply ***array = NULL); //处理返回的结果
};#endif

redis_handler.cpp

#include "redis_handler.h"
#include <string>
#include <cstring>
#include <iostream>
using namespace std;RedisHandler::RedisHandler()
{m_addr = "";m_port = 0;m_pwd = "";pm_rct = NULL;pm_rr = NULL;error_msg = "";
}RedisHandler::~RedisHandler()
{disConnect();pm_rct = NULL;pm_rr = NULL;
}/*
连接redis数据库
addr: 地址,port:端口号,pwd:密码
成功返回M_REDIS_OK,失败返回M_CONNECT_FAIL
*/
int RedisHandler::connect(const string &addr = "127.0.0.1", int port = 6379, const string &pwd) {m_addr = addr;m_port = port;m_pwd = pwd;pm_rct = redisConnect(m_addr.c_str(), m_port);if (pm_rct->err){error_msg = pm_rct->errstr;return M_CONNECT_FAIL;}if (!m_pwd.empty()){return connectAuth(m_pwd);}return M_REDIS_OK;
}/*
断开redis连接
*/
int RedisHandler::disConnect()
{redisFree(pm_rct);freeReplyObject(pm_rr);
}/*
添加或插入键值对
key:键,value:值
成功返回M_REDIS_OK,失败返回<0
*/
int RedisHandler::setValue(const string &key, const string &value)
{string cmd = "set " + key + " " + value;pm_rr = (redisReply*)redisCommand(pm_rct, cmd.c_str());return handleReply();
}/*
获取键对应的值
key:键,value:值引用
成功返回M_REDIS_OK,失败返回<0
*/
int RedisHandler::getValue(const string &key, string &value)
{string cmd = "get " + key;pm_rr = (redisReply*)redisCommand(pm_rct, cmd.c_str());int ret = handleReply(&value);
}/*
删除键
key:键
成功返回影响的行数(可能为0),失败返回<0
*/
int RedisHandler::delKey(const string &key)
{string cmd = "del " + key;pm_rr = (redisReply*)redisCommand(pm_rct, cmd.c_str());int rows = 0;int ret = handleReply(&rows);if (ret == M_REDIS_OK)return rows;elsereturn ret;
}/*
打印所有键值对到屏幕上
*/
int RedisHandler::printAll()
{string cmd = "keys *";pm_rr = (redisReply*)redisCommand(pm_rct, cmd.c_str());int len ;redisReply **array;int ret = handleReply(&len, &array);if (ret == M_REDIS_OK){for (int i = 0; i < len; i++)cout << string(array[i]->str) << endl;}elsereturn 0;
}/*
返回错误信息
*/
string RedisHandler::getErrorMsg()
{return error_msg;
}/*
使用密码登录
psw:登录密码
成功返回M_REDIS_OK,失败返回<0
*/
int RedisHandler::connectAuth(const string &psw)
{string cmd = "auth " + psw;pm_rr = (redisReply*)redisCommand(pm_rct, cmd.c_str());return handleReply();
}/*
处理redis返回的信息
value:数据指针,用于保存redis返回的基本类型(value指针指向该数据)
array:数组指针,用于保存redis返回的数组
成功返回M_REDIS_OK,失败返回<0
*/
int RedisHandler::handleReply(void* value, redisReply*** array)
{if (pm_rct->err){error_msg = pm_rct->errstr;return M_CONTEXT_ERROR;}if (pm_rr == NULL){error_msg = "auth redisReply is NULL";return M_REPLY_ERROR;}switch (pm_rr->type){case REDIS_REPLY_ERROR:error_msg = pm_rr->str;return M_EXE_COMMAND_ERROR;case REDIS_REPLY_STATUS:if (!strcmp(pm_rr->str, "OK"))return M_REDIS_OK;else{error_msg = pm_rr->str;return M_EXE_COMMAND_ERROR;}case REDIS_REPLY_INTEGER:*(int*)value = pm_rr->integer;return M_REDIS_OK;case REDIS_REPLY_STRING:*(string*)value = pm_rr->str;return M_REDIS_OK;case REDIS_REPLY_NIL:*(string*)value = "";return M_REDIS_OK;case REDIS_REPLY_ARRAY:*(int*)value = pm_rr->elements;*array = pm_rr->element;return M_REDIS_OK;default:error_msg = "unknow reply type";return M_EXE_COMMAND_ERROR;}
}

Demo 示例:

redis_main.cpp

#include <iostream>
#include <string>
#include "redis_handler.h"
using namespace std;int main()
{RedisHandler* rh = new RedisHandler();int ret;//连接测试cout << "错误测试: " << "地址错误" << endl;ret = rh->connect("34.15.14.15", 6379, "linesum");if (ret != M_REDIS_OK)cout << "redis error: " << rh->getErrorMsg() << endl;cout << "错误测试: " << "端口错误" << endl;ret = rh->connect("127.0.0.1", 1234, "linesum");if (ret != M_REDIS_OK)cout << "redis error: " << rh->getErrorMsg() << endl;cout << "错误测试: " << "密码错误" << endl;ret = rh->connect("127.0.0.1", 6479, "linsum");if (ret != M_REDIS_OK)cout << "redis error: " << rh->getErrorMsg() << endl;ret = rh->connect("127.0.0.1", 6479, "linesum");if (ret != M_REDIS_OK){cout << "redis error: " << rh->getErrorMsg() << endl;return ret;}//set测试cout << "错误测试: " << "set不带value参数" << endl;ret = rh->setValue("key11", "");if (ret != M_REDIS_OK)cout << "redis error: " << rh->getErrorMsg() << endl;ret = rh->setValue("key11", "value11");if (ret != M_REDIS_OK){cout << "redis error: " << rh->getErrorMsg() << endl;return ret;}ret = rh->setValue("key22", "value22");if (ret != M_REDIS_OK){cout << "redis error: " << rh->getErrorMsg() << endl;return ret;}//get测试string str;cout << "错误测试: " << "get不带key参数" << endl;ret = rh->getValue("key1111", str);if (ret != M_REDIS_OK)cout << "redis error: " << rh->getErrorMsg() << endl;ret = rh->getValue("key11", str);if (ret != M_REDIS_OK){cout << "redis error: " << rh->getErrorMsg() << endl;return ret;}elsecout << "value : " << str << endl;//print测试ret = rh->printAll();if (ret != M_REDIS_OK){cout << "redis error: " << rh->getErrorMsg() << endl;return ret;}//del测试cout << "错误测试: " << "删除不存在的key" << endl;ret = rh->delKey("key1111");if (ret != M_REDIS_OK)cout << "redis error: " << rh->getErrorMsg() << endl;ret = rh->delKey("key11");if (ret != M_REDIS_OK){cout << "redis error: " << rh->getErrorMsg() << endl;return ret;}delete rh;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/156728.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

排序算法——冒泡排序

一、介绍&#xff1a; 冒泡排序原理就是从第一个元素开始&#xff0c;比较其后边的一个元素的大小&#xff0c;按照排序方式进行交换位置&#xff0c;直到将所有元素的顺序排列好为止。演示如下&#xff1a; 视频演示&#xff1a; 冒泡排序演示_网络游戏热门视频 (bilibili.co…

卷积神经网络CNN基础知识

目录 1 前言2 卷积神经网络CNN2.1 LeNet-5相关介绍2.2 CNN基本结构2.2.1 卷积层2.2.2 池化层&#xff08;下采样层&#xff09;2.2.3 全连接层2.2.3.1激励层&#xff08;非线性激活&#xff09;2.2.3.2 线性层2.2.3.3 Dropout层2.2.3.4 总结 2.3 图像的上采样和下采样2.3.1 上采…

如何防止内部员工数据外泄?

首先&#xff0c;数据对于企业的价值和意义无需多说&#xff0c;数据价值的发挥和利用以数据安全为基础。当数据创造价值的同时&#xff0c;也面临着被窃取泄露、滥用、非法利用的风险&#xff0c;进而对个人、组织甚至整个社会、国家的利益产生严重威胁和损害。近年来&#xf…

kafka生产者发送消息报错 Bootstrap broker localhost:9092 (id: -1 rack: null) disconnected

报这个错误是因为kafka里的配置要修改下 在config目录下 server.properties配置文件 这下发送消息就不会一直等待&#xff0c;就可以发送成功了

配置nginx的虚拟主机

1.基于域名的虚拟主机 vim /usr/local/nginx/conf/nginx.conf 复制一个 cd /var/www/html/ mkdir kgc accp cd kgc/ vim index.html this is kgc! cd .. cd accp this is accp! vim /etc/hosts systemctl restart nginx 2.基于ip的虚拟主机 ifconfig ens33:0 192.168…

【特纳斯电子】基于物联网的指纹密码锁系统设计-实物设计

资料下载链接&#xff1a;基于物联网的指纹密码锁系统设计-实物设计 - 电子校园网 编号&#xff1a; T3732205M-SW 设计简介&#xff1a; 本设计是基于单片机的指纹密码锁&#xff0c;主要实现以下功能&#xff1a; 1、可通过密码解锁 2、可通过云平台解锁 3、可通过指纹解…

OpenWRT搭建个人web站点并结合内网穿透实现公网远程访问

文章目录 前言1. 检查uhttpd安装2. 部署web站点3. 安装cpolar内网穿透4. 配置远程访问地址5. 配置固定远程地址 前言 uhttpd 是 OpenWrt/LuCI 开发者从零开始编写的 Web 服务器&#xff0c;目的是成为优秀稳定的、适合嵌入式设备的轻量级任务的 HTTP 服务器&#xff0c;并且和…

2023年中国手机回收量、手机回收价值及行业细分现状分析[图]

手机回收的主要去向包括再销售及环保降解两类。其中进行再交易的二手手机多为9成新及以上手机。二手手机最终去向主要为再销售及环保降解。 2016年以来&#xff0c;我国手机总体出货量持续下滑&#xff0c;2022年全年&#xff0c;国内市场手机总体出货量累计2.72亿部&#xff0…

c#设计模式-行为型模式 之 迭代器模式

&#x1f680;简介 提供一个对象来顺序访问聚合对象中的一系列数据&#xff0c;而不暴露聚合对象的内部表示。 迭代器模式主要包含以下角色&#xff1a; 抽象聚合&#xff08;Aggregate&#xff09;角色&#xff1a;定义存储、添加、删除聚合元素以及创建迭代器对象的接口…

【linux进程(四)】僵尸进程和孤儿进程概念进程优先级讲解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 进程优先级 1. 前言2. 什么是…

ubuntu20.04 nerf Instant-ngp (下) 复现,自建数据集,导出mesh

参考链接 Ubuntu20.04复现instant-ngp&#xff0c;自建数据集&#xff0c;导出mesh_XINYU W的博客-CSDN博客 GitHub - NVlabs/instant-ngp: Instant neural graphics primitives: lightning fast NeRF and more youtube上的一个博主自建数据集 https://www.youtube.com/watch…

在Linux中掌握不同的命令,让创建文件变得易如反掌

在Linux中创建一个新文件很简单,但也有一些令人惊讶和灵巧的技术。​在本教程中,学习如何从Linux终端创建文件。​ 先决条件 访问命令行/终端窗口(Ctrl-Alt-F2或Ctrl-Alt-T) 具有sudo权限的用户帐户(对于某些文件/目录是可选的) 从命令行创建新的Linux文件 Linux的设计…

如何构建安全的App网络通信?

前言 说到安全肯定逃不开数据的加解密&#xff0c;数据本地存储大多用对称加解密来实现&#xff0c;那网络传输数据的时候是不是也用对称加解密来实现&#xff1f;没错&#xff0c;常规网络通信时&#xff0c;大部分网络传输过程中基本也是用对称加解密来实现的&#xff0c;毕竟…

Matlab论文插图绘制模板第118期—进阶气泡图

之前的文章中&#xff0c;分享过Matlab气泡图的绘制模板&#xff1a; 图虽说好看&#xff0c;但有一个缺点&#xff1a;需要手动调节两个图例的位置。 为了解决这一问题&#xff0c;我们不妨结合前段时间分享的紧凑排列多子图的绘制模板&#xff1a; 从而达到自动对齐排列的效…

Vue3模块找不到问题解决:找不到模块‘vue ‘。你的意思是将“模块解决方案”选项设置为“节点”,还是添加ali

Vue3 vite 项目引入 vue 报错 Cannot find module ‘vue‘. Did you mean to set the ‘moduleResolution‘ option to ‘node‘, or to add ali 在项目中找到 tsconfig.json 文件 找到配置项里的 "moduleResolution": "bundler", 将其改成 &q…

<图像处理> Fast角点检测

Fast角点检测 基本原理是使用圆周长为N个像素的圆来判定其圆心像素P是否为角点&#xff0c;如下图所示为圆周长为16个像素的圆&#xff08;半径为3&#xff09;&#xff1b;OpenCV还提供圆周长为12和8个像素的圆来检测角点。 相对中心像素的位置信息 //圆周长为16 static c…

前端工程化(editorconfig+ESLint+Prettier+StyleLint+Husky、Commitlint)

前言 致谢&#xff1a;有来技术大大 通过学习有来技术大大的文章和结合自己的实践&#xff0c;写一篇笔记记录一下 所使用的工具&#xff1a; ide项目风格(editorconfig)代码检查(ESLint)代码风格(Prettier)样式风格(StyleLint)git提交规范(Husky、Commitlint) 一、ide项目…

PyTorch模型性能分析与优化

一、说明 训练深度学习模型&#xff0c;尤其是大型模型&#xff0c;可能是一项昂贵的支出。我们可以使用的管理这些成本的主要方法之一是性能优化。性能优化是一个迭代过程&#xff0c;我们不断寻找提高应用程序性能的机会&#xff0c;然后利用这些机会。在之前的文章中&#x…

【TensorFlow2 之015】 在 TF 2.0 中实现 AlexNet

一、说明 在这篇文章中&#xff0c;我们将展示如何在 TensorFlow 2.0 中实现基本的卷积神经网络 \(AlexNet\)。AlexNet 架构由 Alex Krizhevsky 设计&#xff0c;并与 Ilya Sutskever 和 Geoffrey Hinton 一起发布。并获得Image Net2012竞赛中冠军。 教程概述&#xff1a; 理论…

LMI FocalSpec 3D线共焦传感器 使用笔记1

一.硬件介绍 以上特别注意: 屏蔽线必须接地,因为在现场实际调试中,使用软件调试发现经常 弹窗 传感器丢失警告!! 以上 Position LED 的灯被钣金挡住,无法查看异常现象,能否将指示灯设置在软件界面上? 需要确认是软触发还是硬触发,理论上 硬触发比软触发速度要快.(我们目前使用…