• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C基础 redis缓存访问详解

C基础 redis缓存访问详解

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了redis缓存,redis缓存技术,redis缓存机制,spring redis缓存,java redis缓存等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

引言

先说redis安装, 这里采用的环境是.

Linux version 4.4.0-22-generic (buildd@lgw01-41) 
(gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) 
#40-Ubuntu SMP Thu May 12 22:03:46 UTC 2016
</div>

对于 ubuntu 安装 redis是非常简单的. 这里采用源码安装. 安装代码如下

wget http://download.redis.io/releases/redis-3.0.6.tar.gz
tar xzf redis-3.0.6.tar.gz
cd redis-3.0.6
make
</div>

安装后我的环境是

那我们测试一下. 安装结果. 先启动 redis-server 服务器.

再启动 redis-cli 客户端

我们开始测试一下. 

 测试之后一切正常. redis linux上安装基本完毕了. 更加详细的参照

Redis 官网教程 很详细 http://www.redis.net.cn/tutorial/3501.html

前言

现在我们安装 redis c 访问的驱动. hiredis. 一开始都是下载安装. 我是直接从 hiredis git官网下载安装的.

hiredis  源码 https://github.com/redis/hiredis

wget https://github.com/redis/hiredis/archive/master.zipunzip master.zip
</div>

 安装完毕会看见这样环境

执行安装命令

makesudo make install
</div>

本质对于 make install 执行了下面步骤

mkdir -p /usr/local/include/hiredis /usr/local/lib
cp -a hiredis.h async.h read.h sds.h adapters /usr/local/include/hiredis
cp -a libhiredis.so /usr/local/lib/libhiredis.so.0.13
cd /usr/local/lib && ln -sf libhiredis.so.0.13 libhiredis.so
cp -a libhiredis.a /usr/local/lib
mkdir -p /usr/local/lib/pkgconfig
cp -a hiredis.pc /usr/local/lib/pkgconfig
</div>

此刻基本上 hiredis 驱动已经安装完毕. 后面解释一下, 驱动提供的api.

常用的 api如下.

/*
 * redis链接函数, 返回redis上下文.
 * ip  : 链接地址的ip
 * port  : 链接端口
 *     : 返回 redis上下文, NULL表示获取失败
 */
redisContext *redisConnect(const char *ip, int port)


/*
 * 执行redis操作命令, 返回得到的结果集
 *  context  : redisConnect 返回的redis上下文对象
 *  format  : 等同于 printf格式控制符
 *  ...    : 后面可变参数, 需要和 format中格式符对应
 *      : 返回 得到的结果集
 */
void *redisCommand(redisContext *context, const char *format, ...);

/*
 * 释放redis命令操作返回过来的结果集
 * reply  : redisCommand返回的结果集
 */
void freeReplyObject(void *reply);

/*
 * 释放链接上下文
 * context  : redisConnect返回的链接上下文
 */
void redisFree(redisContext *context);
</div>

 更加详细的解释我们可以看 源码接口文件 hiredis/hiredis.h .  例如

第一个是 redisConnect 返回的 redisContext上下文结构
/* Context for a connection to Redis */
typedef struct redisContext {
  int err; /* Error flags, 0 when there is no error */
  char errstr[128]; /* String representation of error when applicable */
  int fd;
  int flags;
  char *obuf; /* Write buffer */
  redisReader *reader; /* Protocol reader */
  enum redisConnectionType connection_type;
  struct timeval *timeout;
  struct {
    char *host;
    char *source_addr;
    int port;
  } tcp;
  struct {
    char *path;
  } unix_sock;
} redisContext;

还有一个是 redisCommand 返回的命令集
/* 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 */
  int 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;
</div>

关于 hiredis基本的C驱动接口,解释完毕. 后面开始写demo测试一番.最好的理解方式还是看官方源码和测试代码.

正文

首先来个简单的demo测试. simpleget.c

#include <stdio.h>
#include <stdlib.h>
#include <hiredis/hiredis.h>

/*
 * 请求 redis网络缓存服务器内存.
 */
int main(int argc, char* argv[]) {
  redisContext *conn = redisConnect("127.0.0.1", 6379);
  if(NULL == conn) {
    fprintf(stderr, "redisConnect 127.0.0.1:6379 error!\n");
    exit(EXIT_FAILURE);
  }  
  if(conn->err) {
    fprintf(stderr, "redisConect error:%d\n", conn->err);
    redisFree(conn);
    exit(EXIT_FAILURE);
  }  
  
  // 这里redisConnect 链接对象创建完毕了
  redisReply *reply = redisCommand(conn, "get foo");
  if(reply && reply->type == REDIS_REPLY_STRING) {
    printf("get foo => %s\n", reply->str);
  }  
  printf("reply->type = %d\n", reply->type);

  // 释放这个对象
  freeReplyObject(reply);
  // 释放hiredis 上下文对象  
  redisFree(conn);

  return 0;
}
</div>

编译命令是

gcc -Wall -ggdb -o simpleget.out simpleget.c -lhiredis

最终测试结果是

最终测试结果是


这里表明流程是跑通了. 这里扩展一下, 有时候在Linux上查找函数或宏定义声明好麻烦. 我用的方式是

 find . -name *.h | xargs grep 'REDIS_REPLY_STRING'
</div>

笨方法也挺实用的. 查找的结果是 上面 REDIS_REPLY_STRING 定义在 hiredis/read.h 中 摘录部分如下

#define REDIS_REPLY_STRING 1
#define REDIS_REPLY_ARRAY 2
#define REDIS_REPLY_INTEGER 3
#define REDIS_REPLY_NIL 4
#define REDIS_REPLY_STATUS 5
#define REDIS_REPLY_ERROR 6
</div>

通过这些宏枚举区分返回的值. 其实到这里基本上 关于 redis接口使用基本入门了. 后面再举一个 操作list的操作代码 setlist.c

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <hiredis/hiredis.h>

/*
 * 请求 redis网络缓存服务器内存.
 */
int main(int argc, char* argv[]) {
  // 忽略服务器退出,导致当前进程退出
  signal(SIGPIPE, SIG_IGN);

  redisContext *conn = redisConnect("127.0.0.1", 6379);
  if(NULL == conn) {
    fprintf(stderr, "redisConnect 127.0.0.1:6379 error!\n");
    exit(EXIT_FAILURE);
  }  
  if(conn->err) {
    fprintf(stderr, "redisConect error:%d\n", conn->err);
    redisFree(conn);
    exit(EXIT_FAILURE);
  }  
  
  // 这里redisConnect 链接对象创建完毕了
  freeReplyObject(redisCommand(conn, "lpush mylist foo"));
  freeReplyObject(redisCommand(conn, "lpush mylist bar"));
  redisReply *reply = redisCommand(conn, "lrange mylist 0 -1");
  if(reply && reply->type == REDIS_REPLY_ARRAY && reply->elements == 2) {
    printf("%s %s\n", reply->element[0]->str, reply->element[1]->str);
  }  
  else {
    printf("redisCommand [lrange mylist 0 -1] error:%d. %s\n", reply->type, reply->str);
  }  

  // 释放这个对象
  freeReplyObject(reply);
  // 释放hiredis 上下文对象  
  redisFree(conn);

  return 0;
}
</div>

编译代码

gcc -Wall -ggdb -o setlist.out setlist.c -lhiredis

 运行结果如下

更加详细介绍请参照 hiredis git上 源码.

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C基础 redis缓存访问详解

相关文章

  • 2017-05-28C语言设计一个闪闪的圣诞树
  • 2017-05-28C语言打印华氏-摄氏温度对照表的方法
  • 2017-05-28C++跳转语句之Goto对变量定义的影响详解
  • 2017-05-28C++取得当前时间的方法
  • 2017-05-28实例解析C++中类的成员函数指针
  • 2017-05-28简明的C++函数指针学习教程
  • 2017-05-28浅析C++中模板的那点事
  • 2017-05-28C/C++中的typedef和#define详解
  • 2017-05-28ipv6实现udp编程示例
  • 2017-05-28详解C++文件读写操作

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++指向函数的指针用法详解
    • 一些语言的按行读取文件的代码实现小结
    • 详解C++编程中对二进制文件的读写操作
    • C语言行优先和列优先的问题深入分析
    • 概率的问题:使用递归与多次试验模拟的分析
    • C++队列用法实例
    • 手把手教你如何优化C语言程序
    • 简单谈谈C++ 中指针与引用
    • 用C语言判断字符是否为空白字符或特殊字符的方法
    • C语言 if else 语句详细讲解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有