尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
C++客户端对Redis的使用
Redis头文件存在的路径/usr/local/include/sw/redisRedis库存在的路径/usr/local/lib/libredis.a检验连接Redis服务是否正常#includeiostream #includevector #includestring #includeunordered_map #includesw/redis.h using std::cout; using std::endl; using std::vector; using std::string; using unordered_map; int main() { //创建redis对象tcp://为固定格式tcp可换成其它支持的连接层协议IP:port sw::redis::Redis redis(tcp://127.0.0.1:6379); //检测是否连接成功了 string result redis.ping(); coutresultendl; return 0; }在编译含有redis对象的代码时需要包含三种库文件1redis自己的静态库文件2hiredis的静态库因为redis依赖了hiredis3线程库因为redis依赖了线程库getRedis的通用命令的使用1.get/set 2.exists 3.del 4.keys 5.expire/ttl 6.type1.get/set#includestring #includeunordered_map #includesw/redis/redis.h using std::cout; using std::endl; void test(sw::redis::Redis redis) { //清空数据库避免被之前的数据干扰 redis.flushall(); //设置key val redis.set(key1,111); redis.set(key2,222); redis.set(key3,333); //获取val值 auto value1 redis.get(key1); coutvalue1.value()endl; auto value2 redis.get(key2); coutvalue2.value()endl; auto value3 redis.get(key3); coutvalue3.value()endl; auto value4 redis.get(key4); coutvalue4.value()endl; } int main() { sw::redis::Redis redis(tcp://127.0.0.1:6379); test(redis); return 0; }这里面运用了StringView这样的类型是在sw::redis命名空间里面的std::string是可以修改的StringView是只读的因为是只读的所以可以做很多优化工作效率比std::string更高在C17中也提供了std::string_view类型但为了向前兼容所以Redis选择自己实现了一份get函数的返回值为Optional此处的Optional表示非法值/无效值该类的存在为了解决返回值为nil的情况std::string表示空类型并不方便std::string*可以表示但是返回指针又涉及到内存归谁管可能会引入不必要的麻烦所以Redis自己实现了Optional专门为了解决这种情况C14版本引入了Optional类型但为了向前兼容所以Redis自己实现了一个OptionalOptional可以当作元素的容器对于key4没有设置所以对于非法状态optional进行取值操作就会抛出异常也就是触发了SIGABRT信号处理方式1要么try catch不推荐因为这样会出现执行流跳跃的问题2在使用之前进行提前判定举个例子#includestring #includeunordered_map #includesw/redis/redis.h using std::cout; using std::endl; void test(sw::redis::Redis redis) { //清空数据库避免被之前的数据干扰 redis.flushall(); //设置key val redis.set(key1,111); redis.set(key2,222); redis.set(key3,333); //获取val值 auto value1 redis.get(key1); if(value1) coutvalue1.value()endl; auto value2 redis.get(key2); if(value2) coutvalue2.value()endl; auto value3 redis.get(key3); if(value3 )coutvalue3.value()endl; auto value4 redis.get(key4); if(value4) coutvalue4.value()endl; } int main() { sw::redis::Redis redis(tcp://127.0.0.1:6379); test(redis); return 0; }EXISTS举个例子#includeiostream #includesw/redis/redis.h using std::cout; using std::endl; void test(sw::redis::Redis redis) { redis.flushall(); redis.set(key1,111); //判定key1是否存在 auto ret redis.exists(key1); coutretendl; //使用初始化列表进行操作返回值依然是long long类型返回存在个数 auto retl redis.exists({key1,key2,key3}); } int main() { sw::redis::Redis redis(tcp://127.0.0.1:6379); test(redis); return 0; }DEL返回值表示当前删除成功的个数#includeiostream #includesw/redis/redis.h using std::cout; using std::endl; void test(sw::redis::Redis redis) { redis.flushall(); redis.set(key1,111); //判定key1是否存在 auto ret1 redis.del(key1); coutretendl; auto ret2 redis.del({key1,key2,key3}); coutret2endl; } int main() { sw::redis::Redis redis(tcp://127.0.0.1:6379); test(redis); return 0; }KEYS第一个参数为遍历规则*等第二个参数插入迭代器指向保存结果的容器#includeiostream #includesw/redis/redis.h #includestring #includevector using std::cout; using std::endl; using std::vector; using std::string; void test(sw::redis::Redis redis) { redis.flushall(); redis.set(key1,111); redis.set(key2,222); redis.set(key3,333); redis.set(key4,444); redis.set(key5,555); redis.set(key6,666); vectorstring result; //构造擦插入迭代器 auto it std::back_inserter(result); redis.keys(*,it); } int main() { sw::redis::Redis redis(tcp://127.0.0.1:6379); test(redis); return 0; }STL五种迭代器类型1.输入迭代器2.输出迭代器3.前向迭代器4.双向迭代器5.随机迭代器随机访问迭代器最大的优势就在于以O(1)的复杂度快速定位到指定位置主要依靠内存的随机访问上述五种迭代器为什么没有插入迭代器插入迭代器本质上也是属于输出迭代器1front_insert_iterator可以绑定区间的开头向该位置之前插入2back_insert_iterator可以绑定区间的结尾向该位置之后插入3insert_iterator可以绑定区间的任意位置向该位置之前插入一般不会直接构造出这几个对象因为比较麻烦一般会使用一些辅助函数来进行构造如back_insert_iterator的构造函数std::back_inserter(某容器对象)实现插入迭代器本质的操作就是赋值把其它迭代器赋值给这个插入迭代器举个例子it为插入迭代器it2为普通迭代器it it2相当于是获取到it2指向的元素然后把元素按照it当前插入迭代器的位置和动作来进行插入操作比如it是一个back_insert_iterator那么就是在赋完值后调用push_back()函数来实现尾插。redis.keys(*,it);这里为什么选择传递迭代器而不是直接传递容器因为这样可以解耦合可以向任何容器中插入EXPIRETTL第二个参数还可以传递long long类型但是不推荐因为可读性比较差比如直接写10你不知道这个单位是10s还是10ms默认是s举个例子#includeiostream #includesw/redis/redis.h #includestring #includevector //使用系统库休眠函数需要引入的头文件 #includechrono #includethread using std::cout; using std::endl; using std::vector; using std::string; void test( sw::redis::Redis redis) { redis.flushall(); //10s为字面值常量 10s std::chrono::seconds(10); redis.expire(key1,10s); //想直接传递值需要打开命名空间 using namespace std::chrono_literals; //设置休眠时间 std::this_thread::sleep_for(3s) //返回值long long类型 auto time redis.ttl(key); couttimeenld; } int main() { sw::redis::Redis redis(tcp:/127.0.0.16379); test(redis); return 0; }TYPE#includeiostream #includesw/redis/redis.h #includestring #includevector //使用系统库休眠函数需要引入的头文件 #includechrono #includethread using std::cout; using std::endl; using std::vector; using std::string; void test( sw::redis::Redis redis) { redis.flushall(); redis.set(key1,111); if(redis.exists(key1)) { std::string result redis.type(key1); coutresultendl; } } int main() { sw::redis::Redis redis(tcp:/127.0.0.16379); test(redis); return 0; }
RELATED

相关推荐

Ghidra工具在恶意软件逆向工程中的实战应用

Ghidra工具在恶意软件逆向工程中的实战应用

1. 恶意软件逆向工程与Ghidra工具定位逆向工程在网络安全领域扮演着关键角色,特别是针对恶意软件的分析。当安全研究人员拿到一个可疑样本时,静态分析和动态调试是两种基本方法。静态分析就像拆解一台精密的钟表,通过观察内部结构和零件运作原…

📅 2026/8/23 17:04:05
深入解析EDMA3TC寄存器:配置、监控与错误处理实战指南

深入解析EDMA3TC寄存器:配置、监控与错误处理实战指南

1. 项目概述与EDMA3TC核心价值在嵌入式系统,尤其是高性能信号处理领域,数据搬运的效率直接决定了整个系统的吞吐量和实时性。想象一下,一个高清视频处理应用,每一帧图像的数据量都高达数兆字节,如果让CPU亲自去搬运这些…

📅 2026/8/23 17:04:05
SolidWorks快捷键全解析:从核心原理到自定义高效工作流

SolidWorks快捷键全解析:从核心原理到自定义高效工作流

刚接触 SolidWorks 时,我总觉得它“慢”。不是软件本身慢,而是我的操作慢。画一个简单的草图,要反复在工具栏里找命令;装配时,为了对齐两个孔,鼠标在视图和特征树之间来回切换;出工程图更是折磨…

📅 2026/9/14 12:56:40
MORE NEWS

更多资讯

📰

Highcharts表格直驱可视化:HTML Table自动转图表教程

1. 为什么这个标题值得你花15分钟认真读完Highcharts 实战|HTML表格数据源自动可视化开发教程(附Demo)——这行字里藏着三个关键信号:Highcharts是工业级图表库的“老司机”,不是玩具级轮子;HTML表格数据源…

📰

仿站式训练:用HTML、CSS与JavaScript体系化提升前端布局与还原能力

去年年底我在整理书签时翻出一个收藏了很久的页面——一个把所有知名网站仿写版本集中在一起的教学项目,里面有仿电商首页的、仿资讯门户的、仿社区论坛的,粗粗扫一眼,少说也有上百个案例。我当时的第一反应是“这不就是个扒皮站合集吗”&…

📰

Unity AssetBundle构建慢的三大底层原因与架构级解决方案

1. 这不是“怎么加载资源”的问题,而是“为什么每次改个贴图就打包两小时”的真相Unity项目做到中后期,美术扔来一张新纹理,你点下Build AssetBundle,看着进度条卡在“Writing asset bundle…”不动,咖啡凉了三杯&…

📰

macOS窗口移动工具开发实战:从Accessibility API到全局快捷键

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

FFmpeg实战指南:从安装配置到音视频处理与项目集成全解

FFmpeg这个工具,我已经用了快十年了。从最早在命令行里敲ffmpeg -i input.mp4 output.avi被满屏的报错搞到头大,到后来给视频平台做转码服务、给移动端写硬解播放器,几乎所有和音视频处理打交道的时候,都绕不开它。你们搜索里提到…

📰

BCT脑网络分析实战指南:从MATLAB安装到可发表指标计算

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬