用hiredis连接redis
hiredis
什么是 Hiredis
Hiredis 是一个用于与 Redis 服务器进行通信的 C 语言库。它提供了一组 API,方便开发者在各种应用场景中实现与 Redis 服务器的数据交互操作。
在服务器端的应用中,比如构建 Web 服务或者后端处理程序时,如果需要频繁地与 Redis 进行数据存储、读取、修改等操作,使用 Hiredis 可以提高效率和性能。
使用
以下取自hiredis库官方README
开源链接
同步 API
要使用同步 API,只需要引入几个函数调用:
redisContext *redisConnect(const char *ip, int port);
void *redisCommand(redisContext *c, const char *format, ...);
void freeReplyObject(void *reply);
连接
redisConnect 函数用于创建所谓的 redisContext。上下文是 Hiredis 用来存储连接状态的地方。redisContext 结构中的整型 err 字段在连接出现错误时非零。errstr 字段会包含一个错误描述字符串。更多关于错误的信息可以在“错误”部分找到。使用 redisConnect 尝试连接 Redis 后,应检查 err 字段,以确定建立连接是否成功:
redisContext *c = redisConnect("127.0.0.1", 6379);
if (c == NULL || c->err) {if (c) {printf("Error: %s\n", c->errstr);// 处理错误} else {printf("Can't allocate redis context\n");}
}
也可以使用 redisConnectWithOptions,它接受一个 redisOptions 参数,可以通过这个参数配置终结点信息和许多不同的标志来改变 redisContext 的配置。
redisOptions opt = {0};/* 可以通过我们的帮助宏之一设置终结点 */
if (tcp) {REDIS_OPTIONS_SET_TCP(&opt, "localhost", 6379);
} else {REDIS_OPTIONS_SET_UNIX(&opt, "/tmp/redis.sock");
}/* 也可以通过另一个帮助宏指定 privdata */
REDIS_OPTIONS_SET_PRIVDATA(&opt, myPrivData, myPrivDataDtor);/* 最后,可以通过 `options` 成员设置各种选项,如下所示 */
opt.options |= REDIS_OPT_PREFER_IPV4;
如果连接丢失,可以使用 int redisReconnect(redisContext *c) 恢复连接,使用与给定上下文相同的终结点和选项。
使用套接字选项的其他配置
以下套接字选项直接应用于底层套接字。 这些值不会存储在 redisContext 中,因此在使用 redisReconnect() 重新连接时不会自动应用。 这些函数成功时返回 REDIS_OK,失败时返回 REDIS_ERR 并关闭底层连接。
对于异步上下文(参见下面的“异步 API”),使用 ac->c 从 asyncRedisContext 中获取 redisContext。
int redisEnableKeepAlive(redisContext *c);
int redisEnableKeepAliveWithInterval(redisContext *c, int interval);
启用 TCP 保活,通过设置以下套接字选项(根据操作系统有所不同):
SO_KEEPALIVE;
TCP_KEEPALIVE 或 TCP_KEEPIDLE,可使用 interval 参数配置,默认为 15 秒;
TCP_KEEPINTVL 设为 interval 的三分之一;
TCP_KEEPCNT 设为 3。
int redisSetTcpUserTimeout(redisContext *c, unsigned int timeout);
设置 Linux 特有的 TCP_USER_TIMEOUT 套接字选项,如 tcp 手册页所述:
当值大于 0 时,表示传输的数据可以未确认的最大时间(以毫秒为单位),超时后 TCP 将强制关闭相应的连接并向应用程序返回
ETIMEDOUT。 如果选项值指定为 0,则 TCP 将使用系统默认值。
发送命令
向 Redis 发送命令有多种方法。首先介绍的是 redisCommand 函数,它采用类似于 printf 的格式。最简单形式如下:
reply = redisCommand(context, "SET foo bar");
%s 指定符会插入字符串,并使用 strlen 确定字符串长度:
reply = redisCommand(context, "SET foo %s", value);
当需要在命令中传递二进制安全字符串时,可以使用 %b 指定符。需要与字符串指针一起提供一个 size_t 类型的字符串长度参数:
reply = redisCommand(context, "SET foo %b", value, (size_t) valuelen);
Hiredis 会将命令拆分为不同的参数,并将其转换为与 Redis 通信所使用的协议。 命令中的多个空格用于分隔参数,所以可以在参数中的任何位置使用指定符:
reply = redisCommand(context, "SET key:%s %s", myid, value);
使用回复
如果命令执行成功,redisCommand 的返回值会持有回复。发生错误时,返回值为 NULL,并将上下文的 err 字段设置(参见“错误”部分)。 一旦返回错误,就无法再使用该上下文,应建立新的连接。
redisCommand 返回的标准回复类型为 redisReply。使用 redisReply 的 type 字段来测试接收到了哪种类型的回复:
清理
要断开连接并释放上下文,可以使用以下函数:
void redisFree(redisContext *c);
例子
#include <stdio.h>
#include <stdlib.h>
#include <hiredis/hiredis.h>int main() {// 创建 Redis 上下文redisContext *context = redisConnect("127.0.0.1", 6379);if (context == NULL || context->err) {if (context) {printf("连接错误: %s\\n", context->errstr);redisFree(context);} else {printf("无法分配 Redis 上下文\\n");}return 1;}// 设置键值对/*这条命令在 Redis 中设置了一个键值对,其中键(key)是 foo,值(value)是 bar。因此,通过上面的代码添加的数据是键值对 foo:bar。在 Redis 中,每个键都可以关联一个 值,用于存储和检索数据。在这个例子中,我们只是简单地设置了一个键值对,但在实际应用中,你可以根据需要设置更复杂的键值对,比如数组、哈希表、列表、集合等。*/redisReply *reply = redisCommand(context, "SET foo bar");if (reply == NULL) {printf("Redis 命令执行失败\\n");redisFree(context);return 1;}// 检查命令执行结果if (reply->type == REDIS_REPLY_STATUS && strcmp(reply->str, "OK") == 0) {printf("键值对设置成功\\n");} else {printf("键值对设置失败\\n");}// 释放回复对象freeReplyObject(reply);// 关闭 Redis 连接redisFree(context);return 0;
}
相关文章:
用hiredis连接redis
hiredis 什么是 Hiredis Hiredis 是一个用于与 Redis 服务器进行通信的 C 语言库。它提供了一组 API,方便开发者在各种应用场景中实现与 Redis 服务器的数据交互操作。 在服务器端的应用中,比如构建 Web 服务或者后端处理程序时,如果需要频…...
第G8周:ACGAN任务
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 本周任务: 根据GAN、CGAN、SGAN及它们的框架图,写出ACGAN代码。 框架图 从图中可以看到,ACGAN的前半部分类似于CGAN&#…...
nvm拉取安装node包时报错的解决办法
问题一:用nvm安装某个版本node包时,node正确安装了,但是对应的npm无法安装 原因:原系统中node.js没有卸载干净, 解决办法:先把原系统中node.js卸载干净。再安装nvm和node包 问题二:nvm无法拉取…...
PyTorch 和 TensorFlow
PyTorch 和 TensorFlow 是目前最流行的两个深度学习框架。它们各自有不同的特点和优势,适合不同的使用场景。以下是对这两个框架的详细比较和介绍。 1. PyTorch 简介 PyTorch 是由 Facebook AI Research (FAIR) 开发的开源深度学习框架,以其易用性和灵…...
数据库视图和索引
参考链接: 数据库的视图和索引的概念和区别_索引和视图的区别-CSDN博客 MySQL 数据库--索引(理论详解及实例演示)_数据库索引-CSDN博客 1.视图 视图是从一个或多个表中导出来的表,是一种不是一种真正存在的概念。这样…...
哈希表的底层实现(1)---C++版
目录 哈希表的基本原理 哈希表的优点 哈希表的缺点 应用场景 闭散列法 开散列法 开放定值法Open Addressing——线性探测的模拟实现 超大重点部分评析 链地址法Separate Chaining——哈希桶的模拟实现 哈希表(Hash Table)是一种数据结构&#x…...
如何使用PTK一键安装opengaussdb 5.0
1、关于PTK工具 MogDB数据库是云和恩墨基于openGauss开源数据库打造,安稳易用的企业级关系型数据库。 PTK是云和恩墨出品的一款工具,帮助用户更便捷地部署管理MogDB数据库。 1.1 使用场景 开发人员快速启动多个本地 MogDB 环境用户通过 PTK 快速安装…...
跟李沐学AI:长短期记忆网络LSTM
输入们、遗忘门和输出门 LSTM引入输入门、忘记门和输出门 输入门计算公式为:。 遗忘门计算公式为:。 输出门计算公式为:。 它们由三个具有sigmoid激活函数的全连接层处理, 以计算输入门、遗忘门和输出门的值。 因此,…...
【BIM模型数据】BIM模型的数据如何存储,BIM大模型数据云端存储,需要考虑哪些因素,BIM模型数据存储和获取
【BIM模型数据】BIM模型的数据如何存储,BIM大模型数据云端存储,需要考虑哪些因素,BIM模型数据存储和获取 BIM文件的结构化数据和非结构化数据的存储方式,需要根据数据的特性和使用需求来选择。以下是一些推荐的存储策略࿱…...
【LLM大模型】大模型架构:layer\_normalization
2.layer_normalization 1.Normalization 1.1 Batch Norm 为什么要进行BN呢? 在深度神经网络训练的过程中,通常以输入网络的每一个mini-batch进行训练,这样每个batch具有不同的分布,使模型训练起来特别困难。Internal Covariat…...
PON光模块的独特类型和特性
在当前互联网需求快速增长的背景下,PON光模块已成为实现光纤网络高速数据传输的重要组成部分。从住宅宽带到各种企业应用程序解决方案,PON光模块始终致力于实现高质量的数据传输与无缝通信。了解PON光模块的类型和特性对于深入理解现代网络基础设施至关重…...
架构与业务的一致性应用:实现企业战略目标和合规管理的全面指南
在当今快速变化的数字经济中,信息架构已成为企业实现其业务目标、优化运营效率和确保数据安全的关键工具。 一个成功的信息架构不仅要与企业的战略目标紧密对齐,还必须遵循日益严格的合规性要求,以保护敏感数据并满足法规规定。《信息架构&a…...
时尚穿搭想换就换,各种风格一键完美搭配!亲测在线虚拟试衣换装平台效果超赞!
随着科技的发展,时尚领域也迎来了新的革命。传统的试衣方式逐渐被现代科技所取代,虚拟试衣间的出现使得用户可以在舒适的家中轻松体验不同的服装风格。 先前给大家也介绍过一些虚拟试衣的技术,例如AnyFit或者OutfitAnyone等,今天…...
【C++】C++ 标准库string类介绍(超详细解析,小白必看系列)
C 标准库中的 std::string 类是一个非常强大的工具,用于处理和操作字符串。它属于 <string> 头文件,并提供了一套丰富的功能和方法。以下是 std::string 类的一些主要特性和常用操作: 1 string简介 字符串是表示字符序列的类 标准的字…...
若依RuoYi项目环境搭建教程(RuoYi-Vue + RuoYi-Vue3版本)
文章目录 一、开发脚手架选择二、RuoYi框架1、介绍2、版本发展3、为什么选择若依4、优缺点5、项目内置功能 三、后端项目部署1、拉取源码2、环境要求3、Maven构建4、MySQL相关(1)导入SQL脚本(2)配置信息 5、Redis相关(…...
Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密
加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30…...
HarmonyOS开发之使用PhotoViewPicker(图库选择器)保存图片
一:效果图 二:添加依赖 import fs from ohos.file.fs;//文件管理 import picker from ohos.file.picker//选择器 三:下载,保存图片的实现 // 下载图片imgUrldownloadAndSaveImage(imgUrl: string) {http.createHttp().request(…...
跨境独立站支付收款常见问题排雷篇1.0丨出海笔记
最近小伙伴们在社群讨论挺多关于独立站支付问题的,鉴于不少朋友刚接触独立站,我整理了一些独立站支付相关的问题和解决方案,供大家参考,百度网上一堆媒体的那些软文大家就别看了,都是软广或者抄来抄去,让大…...
uni-app实现web-view和App之间的相互通信
双向实时 如果app端部署成网站,则web-view就是iframe,使用也可以双向通讯 https://uniapp.dcloud.net.cn/component/web-view.html APP端代码 index.vue: <template><web-viewid"m-webview":fullscreen"true":src"…...
HTB-Vaccine(suid提权、sqlmap、john2zip)
前言 各位师傅大家好,我是qmx_07,今天来为大家讲解Vaccine靶机 渗透过程 信息搜集 服务器开放了 21FTP服务、22SSH服务、80HTTP服务 通过匿名登录FTP服务器 通过匿名登录到服务器,发现backup.zip文件,可能存在账号密码 发现b…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
