当前位置: 首页 > news >正文

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;
}

相关文章:

CentOS 编译安装Redis

一、编译配置hiredis.h C来操作redis数据库。通过hiredis接口来实现&#xff0c;目前只能在Linux环境使用。 下载hiredis.h hiredis的下载地址为&#xff1a;https://github.com/redis/hiredis 解压并编译hiredis [rootlocalhost source_code]# pwd /usr/local/source_…...

可拓展的低代码全栈框架

尽管现在越来越多的人开始对低代码开发感兴趣&#xff0c;但已有低代码方案的局限性仍然让大家有所保留。其中最常见的担忧莫过于低代码缺乏灵活性以及容易被厂商锁定。 显然这样的担忧是合理的&#xff0c;因为大家都不希望在实现特定功能的时候才发现低代码平台无法支持&…...

C++11 智能指针

目录 智能指针 异常导致执行流乱跳 智能指针解决问题 auto_ptr unique_ptr sharded_ptr weak_ptr 智能指针 由于C11引入异常之后&#xff0c;执行流乱跳&#xff0c;所以导致之前 malloc/new 的空间很容易没有被释放&#xff0c;导致内存泄露问题。 所以这时候&#x…...

二、WebGPU阶段间变量(inter-stage variables)

二、WebGPU阶段间变量&#xff08;inter-stage variables&#xff09; 在上一篇文章中&#xff0c;我们介绍了一些关于WebGPU的基础知识。在本文中&#xff0c;我们将介绍阶段变量&#xff08;inter-stage variables&#xff09;的基础知识。 阶段变量在顶点着色器和片段着色…...

【Linux】31个普通信号

文章目录 1.每种信号的含义2.两种不能被忽略的信号3.两种不能被捕捉的信号 1.每种信号的含义 信号编号信号名信号含义1SIGHUP如果终端接口检测到一个连接断开&#xff0c;则会将此信号发送给与该终端相关的控制进程&#xff0c;该信号的默认处理动作是终止进程。2SIGINT当用户…...

Mac电脑交互式原型设计 Axure RP 8汉化最新 for mac

Axure RP 8是一款专业且快速的原型设计工具&#xff0c;主要用于定义需求、规格、设计功能和界面。这款工具主要适用于用户体验设计师、交互设计师、业务分析师、信息架构师、可用性专家和产品经理等职业。 Axure RP 8的主要特性包括能够快速设计出应用软件或Web网站的线框图、…...

在线免费无时长限制录屏工具 - 录猎在线版

需要录屏的小伙伴注意啦&#xff0c;想要长时间录制又不想花钱的&#xff0c;可以看下这款在线版录屏软件 —— 录猎在线版&#xff0c;一个录屏软件所需要的基本功能它都有&#xff0c;设置录制范围、录制的声音来源、摄像头也能录制的。同时它是支持Windows和Mac系统的&#…...

c语言文件操作详解:fgetc,fputc,fgets,fputs,fscanf,,fprintf,fread,fwrite的使用和区别

前言&#xff1a;在对于c语言的学习中&#xff0c;我们为了持续使用一些数据&#xff0c;为了让我们的数据可以在程序退出后仍然保存并且可以使用&#xff0c;我们引入了文件的概念和操作&#xff0c;本文旨在为大家分享在文件操作中常用的输入输出函数的使用方式和技巧&#x…...

Harmony装饰器

1、装饰器 装饰器是用于装饰类、结构、方法以及变量&#xff0c;并赋予其特殊的含义。如&#xff1a; Component表示自定义组件Entry表示该自定义组件为入口组件State表示组件中的状态变量&#xff0c;状态变量变化会触发UI刷新。 2 、语法范式 Builder/BuilderParam&#…...

如何加快Chrome谷歌浏览器下载速度?

用Chrome打开chrome://flags/...

使用kubectl连接远程Kubernetes(k8s)集群

使用kubectl连接远程Kubernetes集群 环境准备下载kubectl下载地址 安装kubectl并处理配置文件Windows的安装配置安装kubectl拉取配置文件安装kubectl拉取配置文件kubectl命令自动补全 Linux的安装配置安装kubectl拉取配置文件kubectl命令自动补全 环境准备 你需要准备一个Kube…...

Kubernetes革命:云原生时代的应用编排和自动化

文章目录 什么是Kubernetes以及为何它备受欢迎&#xff1f;云原生应用和K8s的关系Kubernetes的核心概念&#xff1a;Pods、Services、ReplicaSets等部署、扩展和管理应用程序的自动化容器编排的演进&#xff1a;Docker到Kubernetes实际用例&#xff1a;企业如何受益于K8s的应用…...

mysql.mongoDb,neo4j数据库对比

#Mysql与MongoDb和Neo4j的一些对比 主要区别 MySQL&#xff1a; 1.MySQL是一种关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛用于处理结构化数据。 2.它支持SQL语言&#xff0c;具备成熟的事务处理和数据一致性能力。 3.MySQL适用于大多数传统的基于表…...

unity使用UniStorm 5.1.0.unitypackage增加天气

添加天天气组件unistorm 然后添加一个player 导入包会报错,需要修改代码 using UnityEngine; using UnityEngine.PostProcessing;namespace UnityEditor.PostProcessing {[CustomPropertyDrawer(typeof(UnityEngine.PostProcessing.MinAttribute))]sealed class MinDrawer : …...

Flink实现kafka到kafka、kafka到doris的精准一次消费

1 流程图 2 Flink来源表建模 --来源-城市topic CREATE TABLE NJ_QL_JC_SSJC_SOURCE ( record string ) WITH (connector kafka,topic QL_JC_SSJC,properties.bootstrap.servers 172.*.*.*:9092,properties.group.id QL_JC_SSJC_NJ_QL_JC_SSJC_SOURCE,scan.startup.mode …...

Outlook屏蔽Jira AI提醒

前言&#xff1a;最近不知道为什么jira上的ai小助手抽风&#xff0c;一周发个几千封邮件…导致我现在都不想在邮箱里面跟找垃圾一样找消息了。实在忍无可忍&#xff0c;决定屏蔽AI小助手&#xff0c;方法很简单&#xff0c;follow me~~ 第一步&#xff1a;双击打开电脑版Outloo…...

毛玻璃 has 选择器卡片悬停效果

效果展示 页面结构 从上述的效果展示可以看到&#xff0c;页面是由多个卡片组成&#xff0c;并且鼠标悬停在卡片上时&#xff0c;会旋转用户图片并且韩式对应的用户信息框。 CSS3 知识点 :has 属性的运用 实现页面整体结构 <div class"container"><div…...

[hive]解决group by 字段超过系统规定64个

用开窗函数即可 ( row_number() over(partition by col1,...,col70 oder by xx) rn ) where rn1...

生成老年人的声音sox

sox laoren1.wav laoren2.wav pitch -300...

DC2DC电源设计注意事项--1,Feedback

电源采集图如下图 Feedback 采集电压点应该在靠近负载侧。这样可以减少大电流导线导致的电压差&#xff0c;真实反应输出电压值 FB_1P21采集电路靠近芯片侧&#xff0c; 2.1&#xff0c;采集分压电路上侧为Vout Vnoise, 那么一分压就噪声就小了。假如采集电路远离芯片侧&…...

计算机视觉处理的开源框架

计算机视觉是一门涉及图像和视频分析的领域&#xff0c;有许多开源的框架和库可用于构建计算机视觉应用程序。以下是一些常见的计算机视觉开源框架及其特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合…...

最新AI智能创作系统源码AI绘画系统/支持GPT联网提问/支持Prompt应用

AI绘图专业设计 不得将程序用作任何违法违纪内容&#xff0c;不要让亲人两行泪 界面部分图解构&#xff1a; 前台show&#xff1a; 前端部署&#xff1a; 安装pm2管理器 点击设置 选择v16.19.1版本-切换版本 再新建一个网站 点击设置 添加反向代理-代理名称随便…...

2019架构真题案例(四十八)

系统应用集成构件统一标准的基础平台&#xff0c;在各个应用系统的接口之间数据共享和功能&#xff0c;基本原则是保证应用程序的&#xff08;&#xff09;。系统应用集成提供了四个不同层次的服务&#xff0c;最上层服务是&#xff08;&#xff09;。 独立性相关性互操作性排…...

zabbix自定义监控内容和自动发现

6 目录 一、自定义监控内容&#xff1a; 1.明确需要执行的 linux 命令 2.创建 zabbix 的监控项配置文件&#xff0c;用于自定义 key&#xff1a; 3. 在 Web 页面创建自定义监控项模板&#xff1a; 3.1 创建模板&#xff1a; 3.2 创建监控项&#xff1a; 3.3 创建触发器&#…...

导引服务机器人 通用技术条件

声明 本文是学习GB-T 42831-2023 导引服务机器人 通用技术条件. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 6 检验规则 6.1 检验项目 检验分为型式检验和出厂检验。检验项目见表2。 表 2 检验项目 序号 检验项目 技术要求 检验方法 出厂检验 型…...

今日头条文章采集ChatGPT3.5/4.0驱动浏览器改写文章软件说明文档

大家好了&#xff0c;我是淘小白~ 今天给大家介绍的软件是一个款驱动浏览器改写文章的软件&#xff0c;下面给大家做一下介绍说明&#xff1a; 一、软件语言 Python编写的&#xff0c;使用的库是selenium库 二、具体逻辑 1、整理头条文章网址&#xff0c;需要自己整理&…...

Mac系统清理工具BuhoCleaner

BuhoCleaner是一款在Mac电脑上运行的清洁软件。它的界面简洁&#xff0c;易于使用&#xff0c;能够快速扫描Mac电脑上的垃圾文件、重复文件、大型文件等&#xff0c;帮助用户清理不需要的文件&#xff0c;释放磁盘空间。 该软件的主要功能包括&#xff1a; 垃圾文件清理&…...

SpringBoot集成WebSocket讲解

文章目录 1 WebSocket1.1 简介1.2 WebSocket作用和调用1.2.1 作用1.2.2 js端调用 1.3 Javax1.3.1 服务端1.3.1.1 服务端接收1.3.1.2 服务端集成1.3.1.3 ping和pong消息 1.3.2 客户端1.3.2.1 客户端接收1.3.2.2 客户端发送 1.4 WebMVC1.4.1 服务端1.1.4.1 服务端接收1.1.4.2 服务…...

GNOME 45 动态三层缓存补丁更新

导读GNOME 45 "Rīga" 上周已正式发布&#xff0c;此版本虽然有许多针对桌面环境的改进&#xff0c;但上游缺少的一个功能是 Canonical 主导的 Mutter 动态三层缓存。 动态三层缓存用于在需要时提升性能&#xff0c;并且已被证明有助于提高桌面渲染性能&#xff0c;…...

[论文笔记]Poly-encoder

引言 本文是Poly-encoder1的阅读笔记,论文题目为基于预训练模型的快速准确多句评分模型。 也是本系列第一篇基于Transformer架构的模型,对于进行句子对之间比较的任务,有两种常用的途经:Cross-encoder在句子对上进行交互完全自注意力;Bi-encoder单独地编码不同的句子。前…...