用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…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
