引言

  先说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

对于 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

安装后我的环境是

那我们测试一下. 安装结果. 先启动 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.zip
unzip master.zip

安装完毕会看见这样环境

执行安装命令

make
sudo make install

本质对于 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

此刻基本上 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);

更加详细的解释我们可以看 源码接口文件 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;

关于 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;
}

编译命令是

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

最终测试结果是


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

 find . -name *.h | xargs grep 'REDIS_REPLY_STRING'

笨方法也挺实用的. 查找的结果是 上面 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

通过这些宏枚举区分返回的值. 其实到这里基本上 关于 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;
}

编译代码

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

运行结果如下

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

后记

  到这里关于C简单使用控制redis服务器, 基本讲完了. 错误是难免的. 欢迎指正.

/**********************************************************************

**        直接向大师们而不是他们得的学生领悟。

**                           —— 阿贝尔

***********************************************************************/

转载于:https://www.cnblogs.com/life2refuel/p/5560944.html

C基础 redis缓存访问相关推荐

  1. java redis缓存清除_java基础-redis缓存篇

    Redis的数据类型 Redis总共支持5种数据类型,分别是: 类型 说明,命令 String set ,get Hash HMSET myhash field1 "Hello" ...

  2. Docker中搭建redis分片集群,搭建redis哨兵结构,实现springboot中对redis分片集群、哨兵结构的访问,Redis缓存雪崩、缓存击穿处理(非关系型数据库技术课程 第十二周)

    文章目录 一.要求: 二.知识总结 缓存雪崩 解决方案 docker中redis分片集群搭建 配置好配置文件 redis-6380.conf redis-6381.conf redis-6382.co ...

  3. Spring Boot基础学习笔记18:Spring Boot整合Redis缓存实现

    文章目录 零.学习目标 一.Spring Boot支持的缓存组件 二.基于注解的Redis缓存实现 (一)安装与启动Redis (二)创建Spring Boot项目 - RedisCacheDemo0 ...

  4. Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?

    欢迎关注方志朋的博客,回复"666"获面试宝典 原始数据存储在 DB 中(如 MySQL.Hbase 等),但 DB 的读写性能低.延迟高. 比如 MySQL 在 4 核 8G 上 ...

  5. Redis缓存数据库安全加固指导(一)

    2019独角兽企业重金招聘Python工程师标准>>> 背景 在众多开源缓存技术中,Redis无疑是目前功能最为强大,应用最多的缓存技术之一,参考2018年国外数据库技术权威网站DB ...

  6. 怎么查询redis缓存的数据_阿里开发十年写出这份「Redis简明教程」+「Redis实战」请你查收...

    Redis是啥?用Redis官方的话来说就是: Redis is an open source (BSD licensed), in-memory data structure store, used ...

  7. Redis缓存穿透、击穿、雪崩及主从复制

    文章目录 Redis缓存穿透 概念 解决方案1-布隆过滤器 解决方案2-缓存空对象 缓存击穿 概念 解决方案1-热点数据永不过期 解决方案2-加互斥锁 缓存雪崩 概念 解决方案1-Redis高可用 解 ...

  8. Redis 缓存和 MySQL 数据如何实现一致性?

    需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...

  9. 「中间件系列二」redis缓存

    Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库. Redis 可以存储键和五种不同类型的值之 ...

最新文章

  1. 基于问题导向与成果产出的教学模式:《大数据与城市规划》特色课程
  2. 算法导论之红黑树的学习
  3. 十分钟了解分布式计算:Petuum
  4. 详解JDBC连接数据库
  5. linux网络编程——boa移植
  6. 17个Python的牛逼骚操作,你都OK吗?
  7. 云计算odps使用笔记(一)环境搭建
  8. 从里面学到的关于过去的经验 中篇
  9. MySQL深度剖析之索引专题(2021)
  10. Dart基础-变量与类型
  11. ubuntu 定时执行重启(crontab)
  12. 小米盒子刷arm linux,最新小米盒子3s刷原生安卓系统图文教程!值得收藏
  13. linux各种命令手册
  14. 投票管理系统的设计与实现(项目实现)
  15. 定时器-----每天定时删除临时文件
  16. 神经网络预测参数有哪些,神经网络预测参数包括
  17. 课堂纪律一团糟老师应该怎么办?
  18. 超声系统发射变迹仿真(Ultrasound Emit apodization Simulation)
  19. yolo论文_YOLO之父宣布退出CV界,坦言无法忽视自己工作带来的负面影响
  20. 中瀛手机销售软件 v5.0 官方

热门文章

  1. Jmeter(二十二)_jenkins配置gitlab插件与ant插件
  2. C#中Equals和==的比较
  3. angularjs文档下载
  4. Oracle86和92语法的连接,子查询,集合的操作
  5. 集群环境配置遇到的问题(随时更新)
  6. 浅谈PHP自动化代码审计技术
  7. 小议 static 关键字
  8. Jquery ValidateEngine表单验证
  9. QQ摘录 “废了!”
  10. jQuery-demos轮播图练习(一)