C基础 redis缓存访问
引言
先说redis安装, 这里采用的环境是.
Linux version 4.4.--generic (buildd@lgw01-)
(gcc version 5.3. (Ubuntu 5.3.-14ubuntu2) )
#-Ubuntu SMP Thu May :: UTC
对于 ubuntu 安装 redis是非常简单的. 这里采用源码安装. 安装代码如下
wget http://download.redis.io/releases/redis-3.0.6.tar.gz
tar xzf redis-3.0..tar.gz
cd redis-3.0.
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[]; /* 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", );
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 ;
}
编译命令是
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", );
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 == ) {
printf("%s %s\n", reply->element[]->str, reply->element[]->str);
}
else {
printf("redisCommand [lrange mylist 0 -1] error:%d. %s\n", reply->type, reply->str);
} // 释放这个对象
freeReplyObject(reply);
// 释放hiredis 上下文对象
redisFree(conn); return ;
}
编译代码
gcc -Wall -ggdb -o setlist.out setlist.c -lhiredis
运行结果如下
更加详细介绍请参照 hiredis git上 源码.
后记
到这里关于C简单使用控制redis服务器, 基本讲完了. 错误是难免的. 欢迎指正.
/**********************************************************************
** 直接向大师们而不是他们得的学生领悟。
** —— 阿贝尔
***********************************************************************/
C基础 redis缓存访问的更多相关文章
- 使用方法拦截机制在不修改原逻辑基础上为 spring MVC 工程添加 Redis 缓存
首先,相关文件:链接: https://pan.baidu.com/s/1H-D2M4RfXWnKzNLmsbqiQQ 密码: 5dzk 文件说明: redis-2.4.5-win32-win64.z ...
- 【Azure Redis 缓存 Azure Cache For Redis】在创建高级层Redis(P1)集成虚拟网络(VNET)后,如何测试VNET中资源如何成功访问及配置白名单的效果
当使用Azure Redis高级版时候,为了能更好的保护Redis的安全,启用了虚拟网路,把Redis集成在Azure中的虚拟网络,只能通过虚拟网络VENT中的资源进行访问,而公网是不可以访问的.但是 ...
- Windows环境下使用Redis缓存工具的图文详细方法
一.简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序集合). ...
- Redis 缓存 + Spring 的集成示例(转)
<整合 spring 4(包括mvc.context.orm) + mybatis 3 示例>一文简要介绍了最新版本的 Spring MVC.IOC.MyBatis ORM 三者的整合以及 ...
- Redis缓存项目应用架构设计一
一些项目整理出的项目中引入缓存的架构设计方案,希望能帮助你更好地管理项目缓存,作者水平有限,如有不足还望指点. 一.基础结构介绍 项目中对外提供方法的是CacheProvider和MQProvider ...
- $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )
$.ajax()方法详解 jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...
- Redis缓存设计及常见问题
Redis缓存设计及常见问题 缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要.下面会介绍缓存使 用技巧和设计方案,包含如下内容:缓存的收益和成本分析.缓存更新策略的 ...
- redis缓存设计
1:缓存技术和框架的重要性 互联网的一些高并发,高性能的项目和系统中,缓存技术是起着功不可没的作用.缓存不仅仅是key-value的简单存取,它在具体的业务场景中,还是很复杂的,需要很强的架构设计能力 ...
- 分布式Redis缓存串讲(一)
互联网应用的基石 现在流量稍微大些的网站,都会采取Redis.基于Redis的内存缓存特性,可以大幅度降低数据库的访问量,大大提升了网站的并发能力,充当数据库的削量先锋.既然Redis这么重要,我们从 ...
随机推荐
- 【bzoj3524】[Poi2014]Couriers 主席树
题目描述 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 输入 第一行 ...
- 转:浅谈Spectral Clustering 谱聚类
浅谈Spectral Clustering Spectral Clustering,中文通常称为“谱聚类”.由于使用的矩阵的细微差别,谱聚类实际上可以说是一“类”算法. Spectral Cluste ...
- Springboot2.x+shiro+redis(Lettuce)整合填坑
主要记录关键和有坑的地方 前提: 1.SpringBoot+shiro已经集成完毕,如果没有集成,先查阅之前的Springboot2.0 集成shiro权限管理 2.redis已经安装完成 3.red ...
- C++中Set的使用
/* #include <string> // 使用 string 类时须包含这个文件 #include <iostream> // 这个就加上去吧.c++的输入和输出. us ...
- PCA误差
我们知道,PCA是用于对数据做降维的,我们一般用PCA把m维的数据降到k维(k < m). 那么问题来了,k取值多少才合适呢? PCA误差 PCA的原理是,为了将数据从n维降低到k维,需要找到k ...
- 洛谷 P1640 [SCOI2010]连续攻击游戏 解题报告
P1640 [SCOI2010]连续攻击游戏 题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备 ...
- 洛谷 P3644 [APIO2015]八邻旁之桥 解题报告
P3644 [APIO2015]八邻旁之桥 题目描述 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域\(A\)和区域\(B\). 每一块区域沿着河岸都建了恰好\(1000000001\)栋的建筑 ...
- CodeForces - 50A Domino piling (贪心+递归)
CodeForces - 50A Domino piling (贪心+递归) 题意分析 奇数*偶数=偶数,如果两个都为奇数,最小的奇数-1递归求解,知道两个数都为1,返回0. 代码 #include ...
- Communications link failure
针对数据库Communications link failure的错误,可以理解为有两种策略解决: 策略1(推荐): 数据池配置 <property name="minEvic ...
- 【神仙题】【P1600】【NOIP2016D1T2】天天爱跑步
传送门 Description 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游 ...