一、redis 简介
1、redis 介绍
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
2、redis 下载地址
http://download.redis.io/releases/redis-3.2.3.tar.gz
二、redis 编译
1、解压
tar xf redis-3.2.3.tar.gz -C /home/openlib/
2、编译
cd /home/openlib/redis-3.2.3
make && make install
编译之后按照的路径默认为 /usr/local/bin/
3、测试redis 服务器
cd /home/openlib/redis-3.2.3/src/
可以看到编译生成的可执行文件 :
redis-server :redis 服务器
redis-cli : Redis命令行操作工具
redis-sentinel :是Redis实例的监控管理、通知和实例失效备援服务,是Redis集群的管理工具。在一般的分布式中心节点数据库中,Redis-sentinel的作用是中心节点的工作,监控各个其他节点的工作情况并且进行故障恢复,来提高集群的高可用性。
redis-benchmark:是官方自带的Redis性能测试工具,可以有效的测试Redis服务的性能。
redis-check-rdb: 用于检测RDB文件(RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照)
redis-check-aof :用于检查AOF文件(AOF 持久化记录服务器执行的所有写操作命令)
redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况。
4、redis-benchmark测试命令事例:
1、redis-benchmark -h 192.168.1.201 -p 6379 -c 100 -n 100000
100个并发连接,100000个请求,检测host为localhost 端口为6379的redis服务器性能
2、redis-benchmark -h 192.168.1.201 -p 6379 -q -d 100
测试存取大小为100字节的数据包的性能
3、redis-benchmark -t set,lpush -n 100000 -q
只测试某些操作的性能
4、redis-benchmark -n 100000 -q script load "redis.call('set','foo','bar')"
只测试某些数值存取的性能
5、运行服务器
三、移植redis客户端
1、编译客户端
redis 的C客户端源码存放在redis-3.2.3/deps/hiredis 目录下
cd redis-3.2.3/deps/hiredis/ 编译生成库文件
make
可以在当前目录生成:
libhiredis.a 和libhiredis.so 库
2、交叉编译redis
cd redis-3.2.3/deps/hiredis/修改Makfile 文件,加上如下:
CC =mipsel-linux-gcc
重新编译就可以生成在mips 平台下的库文件
3、redis客户端接口介绍
a.连接hiredis服务器
redisContext *conn = redisConnect("127.0.0.1", 6379); //redis server默认端口
b.发送命令至服务器
redisReply *reply = redisCommand(conn, "set key value");
c.关闭Reply对象
freeReplyObject(reply);
d.关闭连接
redisFree(conn);
4、redis 连接服务器代码(以下代码是用redis-3.2.3/deps/hiredis/examples/example.c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <hiredis.h>
int main(int argc, char **argv) {
unsigned int j;
redisContext *c;
redisReply *reply;
const char *hostname = (argc > 1) ? argv[1] : "127.0.0.1";
int port = (argc > 2) ? atoi(argv[2]) : 6379;
struct timeval timeout = { 1, 500000 }; // 1.5 seconds
c = redisConnectWithTimeout(hostname, port, timeout);
if (c == NULL || c->err) {
if (c) {
printf("Connection error: %s\n", c->errstr);
redisFree(c);
} else {
printf("Connection error: can't allocate redis context\n");
}
exit(1);
}
/* PING server */
reply = redisCommand(c,"PING");
printf("PING: %s\n", reply->str);
freeReplyObject(reply);
/* Set a key */
reply = redisCommand(c,"SET %s %s", "foo", "hello world");
printf("SET: %s\n", reply->str);
freeReplyObject(reply);
/* Set a key using binary safe API */
reply = redisCommand(c,"SET %b %b", "bar", (size_t) 3, "hello", (size_t) 5);
printf("SET (binary API): %s\n", reply->str);
freeReplyObject(reply);
/* Try a GET and two INCR */
reply = redisCommand(c,"GET foo");
printf("GET foo: %s\n", reply->str);
freeReplyObject(reply);
reply = redisCommand(c,"INCR counter");
printf("INCR counter: %lld\n", reply->integer);
freeReplyObject(reply);
/* again ... */
reply = redisCommand(c,"INCR counter");
printf("INCR counter: %lld\n", reply->integer);
freeReplyObject(reply);
/* Create a list of numbers, from 0 to 9 */
reply = redisCommand(c,"DEL mylist");
freeReplyObject(reply);
for (j = 0; j < 10; j++) {
char buf[64];
snprintf(buf,64,"%d",j);
reply = redisCommand(c,"LPUSH mylist element-%s", buf);
freeReplyObject(reply);
}
/* Let's check what we have inside the list */
reply = redisCommand(c,"LRANGE mylist 0 -1");
if (reply->type == REDIS_REPLY_ARRAY) {
for (j = 0; j < reply->elements; j++) {
printf("%u) %s\n", j, reply->element[j]->str);
}
}
freeReplyObject(reply);
/* Disconnects and frees the context */
redisFree(c);
return 0;
}