网站改了关键词如何删除网站黑链

pingmian/2025/10/11 18:42:34/文章来源:
网站改了关键词,如何删除网站黑链,dj那个网站做的好,云南旅游网站一、hiredis源码安装说明 本文创作基于 hiredisv1.2.0版本 1.简介 hiredis是一个用于与Redis交互的C语言客户端库。它提供了一组简单易用的API#xff0c;使开发人员可以轻松地连接到Redis服务器#xff0c;并执行各种操作#xff0c;如设置和获取键值对、执行命令、订阅和…一、hiredis源码安装说明 本文创作基于 hiredisv1.2.0版本 1.简介 hiredis是一个用于与Redis交互的C语言客户端库。它提供了一组简单易用的API使开发人员可以轻松地连接到Redis服务器并执行各种操作如设置和获取键值对、执行命令、订阅和发布消息等。hiredis的设计目标是高效性和简单性。它使用纯C语言编写没有外部依赖可以轻松地与任何C/C项目集成。它具有轻量级的实现和低延迟的性能适用于高并发的应用场景。hiredis支持同步和异步的方式与Redis进行通信。同步方式是指客户端发送一个命令后会一直等待Redis的响应直到响应返回后才继续执行下一个命令。异步方式是指客户端发送命令后可以继续执行其他任务通过回调函数来处理Redis的响应。除了基本的Redis操作hiredis还提供了一些高级功能如管道操作和事务。管道操作允许一次性发送多个命令到Redis以减少网络开销。事务可以将一系列命令打包成一个原子操作保证它们的执行是连续的。 总之hiredis是一个简单、高效的C语言客户端库使开发人员可以轻松地与Redis进行交互。它适用于任何需要与Redis集成的C/C项目并且具有良好的性能和灵活性。 2.下载源码 hiredis官网https://redis.io/lp/hiredis/ hiredis githubhttps://github.com/redis/hiredis/releases 3.安装说明 # 下载软件包解压并移动目标位置 [rootAli ~]# wget https://github.com/redis/hiredis/archive/refs/tags/v1.2.0.tar.gz [rootAli ~]# tar xzvf v1.2.0.tar.gz [rootAli ~]# mv hiredis-1.2.0 /usr/local/redis/hiredis# 安装依赖 [rootAli hiredis]# yum install openssl-devel -y# 编译安装 hiredis [rootAli hiredis]# make [rootAli hiredis]# make install mkdir -p /usr/local/include/hiredis /usr/local/include/hiredis/adapters /usr/local/lib 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 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 可以看到make install成功后 hiredis头文件 安装放在/usr/local/include/hiredis库文件放在 /usr/local/lib/ 目录下 adapters 注意 使用上述编译生成的so不支持SSL若想支持SSL需要再编译增加USE_SSL1参数如make USE_SSL1 make install USE_SSL1 【参考 hiredis-README】 二、hiredis 使用说明 值得说明的是hiredis支持 同步 和 异步 两种调用方式。无论同步还是异步使用hiredis 基本流程都是以下三个步骤 使用 redisConnect 连接数据库使用 redisCommand 执行命令释放对象 使用 freeReplyObject 释放 redisReply 对象使用 redisFree 来释放redisContext。 1. 简单示例 本小节以一个最简单的 同步API调用 示例帮助读者建立API使用的整体过程。 一个最简单的API调用为例至少需要引入以下几个函数 /* 创建一个redis链接并返回一个redis上下文 */ redisContext *redisConnect(const char *ip, int port);/* 执行redis操作命令 */ void *redisCommand(redisContext *c, const char *format, ...); void *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen); void redisAppendCommand(redisContext *c, const char *format, ...); void redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);/*释放资源*/ void freeReplyObject(void *reply); void redisFree(redisContext *c);示例代码 #include stdio.h #include string.h #include hiredis/hiredis.hint main(){redisReply *lpReply nullptr;redisContext *lpContext nullptr;/* 创建一个redis链接 */lpContext redisConnect(127.0.0.1, 6379);if (lpContext NULL || lpContext-err) {if (lpContext) {printf(Error: %s\n, lpContext-errstr);// handle error} else {printf(Cant allocate redis context\n);}}/* 执行redis操作命令 */// void *redisCommand(redisContext *c, const char *format, ...);lpReply (redisReply*)redisCommand(lpContext, SET foo %s, 12345);printf(type%d, value%d\n, lpReply-type, lpReply-integer);/* 释放一个响应对象 */freeReplyObject(lpReply);lpReply (redisReply*)redisCommand(lpContext, GET foo);printf(type%d, value%s\n, lpReply-type, lpReply-str);/* 释放一个响应对象 */freeReplyObject(lpReply);/* 是否上下文 */redisFree(lpContext); } 运行结果 # 执行前redis中不存在foo的key [wengjianhongAli testzone]$ redis-cli 127.0.0.1:6379 get foo (nil) 127.0.0.1:6379# 编译运行 [wengjianhongAli testzone]$ g test_hiredis.cpp --stdc11 -lhiredis -o test_hiredis [wengjianhongAli testzone]$ ./test_hiredis type5, value0 type1, value12345# 执行后获取 redis中foo的值 [wengjianhongAli testzone]$ redis-cli 127.0.0.1:6379 get foo 12345 127.0.0.1:6379 2.同步API说明 建立链接 /* 建立连接 */ redisContext *redisConnect(const char *ip, int port);/* 带参数的建立连接 */ redisContext *redisConnectWithOptions(const redisOptions *options);/* 重连重连时自动使用保存在上下文的参数 */ int redisReconnect(redisContext *c);/* 此外redis还有如下的建立连接的接口底层上也是调用 redisConnectWithOptions */ redisContext *redisConnectNonBlock(const char *ip, int port); redisContext *redisConnectBindNonBlock(const char *ip, int port, const char *source_addr); redisContext *redisConnectBindNonBlockWithReuse(const char *ip, int port, const char *source_addr); redisContext *redisConnectWithTimeout(const char *ip, int port, const struct timeval tv); redisContext *redisConnectUnixWithTimeout(const char *path, const struct timeval tv); redisContext *redisConnectUnixNonBlock(const char *path); redisContext *redisConnectUnix(const char *path); redisContext *redisConnectFd(redisFD fd); 其中调用建连接口返回redis上下文 redisContext 注意: redisContext不是线程安全的其中保存hiredis的连接状态。 redisContext 中包含一个非零的整数err字段和一个带有错误描述的字符串字段。 /* Context for a connection to Redis */ typedef struct redisContext {const redisContextFuncs *funcs; /* Function table */int err; /* Error flags, 0 when there is no error */char errstr[128]; /* String representation of error when applicable */// ... ... } redisContext;在使用redisConnect连接到Redis后应该检查err字段看看建立连接是否成功如 redisContext *c redisConnect(127.0.0.1, 6379); if (c NULL || c-err) {if (c) {printf(Error: %s\n, c-errstr);// handle error} else {printf(Cant allocate redis context\n);} }注意套接字选项直接应用于底层套接字不会存储在 redisConnext 中因此调用 redisReconnect 重连的时候必须重新设置。如 int redisEnableKeepAlive(redisContext *c); int redisEnableKeepAliveWithInterval(redisContext *c, int interval); int redisSetTcpUserTimeout(redisContext *c, unsigned int timeout);发送命令 hiredis支持多种向Redis发出操作指令的接口函数原型如下 /*** brief 使用格式化字符串* param c redis上下文指针* param format 参数格式化字符串* param 参数* return redisReply 结构体指针 */ void* redisCommand(redisContext* c, const char* format, ...);/* 使用 argc、argv 参数列表 */ /*** brief 使用 argc、argv 参数列表* param c redis上下文指针* param argc 参数个数* param argv 参数指针数组* param argvlen 参数长度数组* return redisReply 结构体指针 */ void* redisCommandArgv(redisContext* c, int argc, const char** argv, const size_t* argvlen);上述的三个接口 执行成功时返回值 void* 实际上是 redisReply* 结构体如下。执行失败时返回值为NULL并且将设置上下文中的err字段(请参阅错误部分)。 注意一旦返回错误上下文就不能被重用您应该建立一个新的连接。 /* This is the reply object returned by redisCommand() */ typedef struct redisReply {int type; /* REDIS_REPLY_* */long long integer; /* The integer when type is REDIS_REPLY_INTEGER */size_t len; /* Length of string */char* str; /* Used for both REDIS_REPLY_ERROR and REDIS_REPLY_STRING */size_t elements; /* number of elements, for REDIS_REPLY_ARRAY */struct redisReply **element; /* elements vector for REDIS_REPLY_ARRAY */ } redisReply;示例 示例1 void* lpRelay redisCommand(context, SET foo bar); void* lpRelay redisCommand(context, SET foo %s, value); void* lpRelay redisCommand(context, SET %s %s, key, value); void* lpRelay redisCommand(context, SET foo %b, value, (size_t) valuelen); /* 二进制参数 需要指定长度 *//// 示例2 int argc 3; const char *argv[] {SET, foo3, bar3}; size_t argvlen[] {strlen(argv[0]), strlen(argv[1]), strlen(argv[2])}; void* lpReply (redisReply*)redisCommandArgv(lpContext, argc, argv, argvlen);hiredis 还支持管道的命令方式 和 显示的获取回复 /* Write a command to the output buffer. Use these functions in blocking mode* to get a pipeline of commands. */ void redisAppendCommand(redisContext *c, const char *format, ...); void redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);/* 获取返回结果 */ int redisGetReply(redisContext *c, void **reply); int redisGetReplyFromReader(redisContext *c, void **reply);示例 // 示例1 redisReply *reply; redisAppendCommand(context,SET foo bar); redisAppendCommand(context,GET foo); redisGetReply(context,(void**)reply); // reply for SET freeReplyObject(reply); redisGetReply(context,(void**)reply); // reply for GET freeReplyObject(reply);// 示例2 reply redisCommand(context,SUBSCRIBE foo); freeReplyObject(reply); while(redisGetReply(context,(void *)reply) REDIS_OK) {// consume messagefreeReplyObject(reply); }释放资源 /* 释放一个响应对象 */ void freeReplyObject(void *reply)/* 释放上下文自动断开连接 */ void redisFree(redisContext *c);3.异步API说明 建立连接 调用异步建连接口返回redis异步上下文 redisAsyncContext 注意: redisAsyncContext 不是线程安全的。此外使用异步调用还需要设置回调函数。 /* 建立异步连接 */ redisAsyncContext *redisAsyncConnect(const char *ip, int port); /* 建立带参数选项的异步连接 */ redisAsyncContext *redisAsyncConnectWithOptions(const redisOptions *options);/* 回调函数指针 */ typedef void (redisDisconnectCallback)(const struct redisAsyncContext*, int status); typedef void (redisConnectCallback)(const struct redisAsyncContext*, int status); typedef void (redisConnectCallbackNC)(struct redisAsyncContext *, int status); typedef void(redisTimerCallback)(void *timer, void *privdata);/* 设置异步回调函数 */ int redisAsyncSetConnectCallback(redisAsyncContext *ac, redisConnectCallback *fn); int redisAsyncSetConnectCallbackNC(redisAsyncContext *ac, redisConnectCallbackNC *fn); int redisAsyncSetDisconnectCallback(redisAsyncContext *ac, redisDisconnectCallback *fn);示例 void appConnect(myAppData *appData) {redisAsyncContext *c redisAsyncConnect(127.0.0.1, 6379);if (c-err) {printf(Error: %s\n, c-errstr);// handle errorredisAsyncFree(c);c NULL;} else {appData-context c;appData-connecting 1;c-data appData; /* store application pointer for the callbacks */redisAsyncSetConnectCallback(c, appOnConnect);redisAsyncSetDisconnectCallback(c, appOnDisconnect);} }void appOnConnect(redisAsyncContext *c, int status) {myAppData *appData (myAppData*)c-data; /* get my application specific context*/appData-connecting 0;if (status REDIS_OK) {appData-connected 1;} else {appData-connected 0;appData-err c-err;appData-context NULL; /* avoid stale pointer when callback returns */}appAttemptReconnect(); }void appOnDisconnect(redisAsyncContext *c, int status) {myAppData *appData (myAppData*)c-data; /* get my application specific context*/appData-connected 0;appData-err c-err;appData-context NULL; /* avoid stale pointer when callback returns */if (status REDIS_OK) {appNotifyDisconnectCompleted(mydata);} else {appNotifyUnexpectedDisconnect(mydata);appAttemptReconnect();} }发送命令 /* Reply回调函数 */ typedef void (redisCallbackFn)(struct redisAsyncContext*, void*, void*);/* 异步发送操作命令 */ int redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, const char *format, ...); int redisAsyncCommandArgv(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, int argc, const char **argv, const size_t *argvlen);注意当命令执行完成发生 Reply回复回调时回调数据只会在回调函数中有效一旦回调函数结束指针指向的数据就无效了 释放资源 /* 释放连接 */ void redisAsyncDisconnect(redisAsyncContext *ac);/* 释放异步上下文 */ void redisAsyncFree(redisAsyncContext *ac);结束语 参考 GitHub上的hiredis项目的 README文档 最后忍不住想吐槽一下C的开源项目真的做的不如Python、java好。 Redis作为当前最热门的开源项目之一hiredis也有很多的用户。然而hiredis的对外接口也没有很好的函数说明。 在使用过程中一个很大的问题即当传入的参数有多个时参数的含义基本靠猜比如redisCommandArgv、函数的返回值使用 void* 后很难知晓其含义比如redisCommand

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

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

相关文章

福州网站建设求职简历莱芜做网站

目录 一,计算机网络背景 二,网络协议初识 三,网络传输基本流程 四,网络中的地址管理 一,计算机网络背景 网络发展 独立模式,计算机之间相互独立;网络互联,多台计算机连接在一起…

上海建设工程施工许可证查询网站智慧团建网站登录密码

一、创建项目 1、创建一个spring-boot的项目 2、创建三个模块file、system、gateway模块 3、file和system分别配置启动信息,并且创建一个简单的控制器 server.port9000 spring.application.namefile server.servlet.context-path/file4、在根目录下引入依赖 <properties&g…

垡头网站建设网站及微站建设合同验收

在没有封面图片的时候&#xff0c;会随机显示出几张色彩不同的风格图片。这样整个效果就好很多&#xff0c;也能减少工作量&#xff0c;毕竟我们没太多时间去找封面图处理。我就想着用Eyoucms能执行PHP的功能&#xff0c;用rand随机下这几张图片出来&#xff0c;我用mt_rand&am…

番禺区大石做网站苏州手机网站设计

我们多次被问到使用Enigma Protector保护软件免遭破解和逆向工程的最佳方法是什么&#xff1f;在这里我将解释保护常用应用程序的技巧是什么。 许多开发人员认为&#xff0c;如果他们只需单击“保护”按钮&#xff0c;保护程序就会自动完成所有操作&#xff0c;无需嵌入额外的…

宝安网站设计项目没有网站怎么推广

功能&#xff1a;ArrayList去除集合中字符串的重复值(字符串的内容相同)&#xff0c;思路&#xff1a;创建新集合方式。 第一种编译运行没问题&#xff0c;第二种写法出错&#xff0c;原因是不可以两次使用it.next()。 错误提示&#xff1a;Exception in thread "main&q…

建设一个视频网站己18虚拟现实企业解决方案

什么是 Raneto &#xff1f; Raneto 是一个开源知识库平台&#xff0c;它使用静态 Markdown 文件来支持您的知识库。 官方提供了 doc & demo 网站&#xff0c;即是帮助文档&#xff0c;也是个 demo&#xff0c;地址&#xff1a;https://docs.raneto.com 准备 项目使用con…

网站开发主要任务网站建设选哪个

前几天老爸在小区垃圾桶旁边捡回来一个旧茶几&#xff0c;又脏又破都掉漆了&#xff0c;捡回来用不了还占地方&#xff0c;他却非说要动手将它改成个小沙发。那么麻烦还不如直接买一个&#xff0c;但最后改出来的效果还不错&#xff0c;关键是便宜&#xff0c;不到50块钱比定制…

网站开发技术与功能 需求说明牡丹江商城网站建设

文章目录环境准备使用的系统软件磁盘目录安装libfastcommon安装FastDFS安装fastdfs-nginx-module安装nginx单机部署tracker配置storage配置client测试配置nginx访问分布式部署tracker配置storage配置client测试配置nginx访问启动防火墙trackerstoragenginx检测集群说明配置文件…

网站建设策划书1万字网络设置网站

文章目录 1、启动、关闭、挂起、恢复&#xff08;电源&#xff09;2、更多虚拟机操作2.1 电源设置2.2 硬件参数设置2.3 状态栏2.4 全屏显示 3、快照与系统恢复4、桌面环境5、文件系统6、用户目录7、创建目录和文件8、命令行&#xff1a;文件列表ls 9、命令行&#xff1a;切换目…

网站建设目的和功能定位广告投放平台

目录 前言 一.简介 二.优缺点 三.Element完成登录注册 1. 环境配置及前端演示 1.1 安装Element-UI模块 1.2 安装axios和qs(发送get请求和post请求) 1.3 导入依赖 2 页面布局 2.1组件与界面 3.方法实现功能数据交互 3.1 通过方法进行页面跳转 3.2 axios发送get请求 …

合肥建设官方网站网页设计师培训水公司

文 | Ryan都已经2021年了&#xff0c;互联网已经今非昔比&#xff0c;20年前纯文本的日子已经一去不复返&#xff0c;文字已经满足不了网页、文章的需求&#xff0c;绝大部分都会有着精心设计的表格、图片&#xff0c;甚至视频。PDF文档这种富文本格式拥有更加复杂的结构信息&a…

北京市建设工程造价管理处 网站wordpress管理导航栏目

问题描述 最近安装了MYSQL8&#xff0c;遇到了各种问题&#xff0c;总体汇总一下&#xff0c;凡是无法启动就是my.cnf和初始化的参数不匹配。 第一种 启动前设置了mysqld --initialize --usermysql --lower-case-table-names1&#xff0c;my.cnf文件却没有修改就去启动。 第…

在哪可以建一个网站沂水网站建设

引言 Redis是一款基于内存的键值对数据库&#xff0c;提供了多种数据结构存储数据&#xff0c;存取数据的速度还非常快&#xff0c;除了这些优点它还提供了其他特色功能&#xff0c;比如&#xff1a;管道、lua脚本、发布订阅模型 本篇文章主要描述发布订阅模型&#xff0c;将…

免费微信网站开发前端技术包括哪些

大家都知道电脑使用起来非常方便&#xff0c;但遇见ps如何画直线的时候就非常头疼了&#xff0c;如果你是第一次遇到ps如何画直线&#xff0c;怎么样才能快速解决ps如何画直线带来的烦恼呢&#xff1f;小编为大家收集了很多关于ps如何画直线问题的解决方法&#xff0c;下面请看…

益阳市网站建设交换友情链接的意义是什么

随着科技的快速发展&#xff0c;现在的人们越来越注重自己的卫生问题&#xff0c;不仅在吃上面会注重卫生问题&#xff0c;在用的上面也会更加严格要求&#xff0c;而衣服做为我们最贴身的东西&#xff0c;我们对它的要求也会更加高&#xff0c;所以最近这几年较火爆的无疑是内…

广州手机网站制作天津网站建设揭秘

命名规则&#xff1a;表名_字段名1、需要加索引的字段&#xff0c;要在where条件中2、数据量少的字段不需要加索引3、如果where条件中是OR关系&#xff0c;加索引不起作用4、符合最左原则尽量不要用or&#xff0c;如果可以用union代替&#xff0c;则一定要代替https://segmentf…

无锡做推广的网站织梦cms做网站教程视频

前言 逻辑门本质上操作的是单个二进制数&#xff0c;通过高低电压或者有无信号来表示&#xff0c;并且&#xff0c;因为二进制数的原因&#xff0c;一个数字&#xff0c;我们可以通过二进制数来表示&#xff0c;整数可以精确表示&#xff0c;浮点数可以近似表示 本篇文章使用逻…

海珠区住房和建设水务局网站高性能网站建设指南 书

对于居住大户型或者跃层户型的用户来说&#xff0c;由于房屋结构复杂&#xff0c;还有各种转角墙体的阻隔&#xff0c;一台路由器已经无法满足WiFi覆盖需求&#xff0c;单路由家庭的WiFi覆盖总是有死角。为了解决WiFi信号差的问题&#xff0c;很多人直觉反应就是简单粗暴的多加…