C++文件服务器项目—Redis—2
- 前言
- 1. 数据库类型
- 1.1 基本概念
- 1.2 关系/非关系型数据库搭配使用
- 2. redis基础知识点
- 2.1 redis安装
- 2.2 redis中的两个角色
- 2.3 redis中数据的组织格式
- 2.4 redis中常用数据类型
- 3. redis常用命令
- 3.1 String类型
- 3.2 List类型 - 存储多个字符串
- 3.3 Set类型
- 3.4 SortedSet 类型
- 3.5 Hash类型
- 3.6 Key 相关的命令
- 4. redis配置文件
-
- 5. hiredis的使用
- 5.1 hiredis安装
- 5.2 hiredis API接口 介绍
- 5.3 hiredis使用Demo
前言
本文简单介绍了一下redis以及C接口的客户端库hiredis
的使用
本专栏知识点是通过零声教育的线上课学习,进行梳理总结写下文章,对c/c++linux课程感兴趣的读者,可以点击链接 C/C++后台高级服务器课程介绍 详细查看课程的服务。
1. 数据库类型
1.1 基本概念
- 关系型数据库 - sql
- 操作数据必须要使用sql语句
- 数据存储在磁盘
- 存储的数据量大
- 举例:
- mysql
- oracle
- sqlite - 文件数据库
- sql server
- 非关系数据库 - nosql
- 操作不使用sql语句
- 数据默认存储在内存
- 不需要数据库表
1.2 关系/非关系型数据库搭配使用
RDBMS: Relational Database Management System-关系数据库管理系统
- 所有的数据默认存储在关系型数据库中
- 客户端访问服务器, 有一些数据, 服务器需要频繁的查询数据
- 服务器首先将数据从关系型数据库中读出 -> 第一次
- 客户端第二次以及以后访问服务器
- 服务器从redis中直接读数据
- 如果redis没有再从关系型数据库中去读
2. redis基础知识点
2.1 redis安装
- 英文官方: https://redis.io/
- 中文官方: http://redis.cn/
- git:https://github.com/redis/redis
git clone https://github.com/redis/redis.git
cd redis
make
make install
2.2 redis中的两个角色
redis-server
redis-server confFileName
redis-cli
redis-cli -p 端口号
redis-cli -h IP地址 -p 端口
shutdown
ping [MSG]
2.3 redis中数据的组织格式
- 键值对
- key: 必须是字符串 -> “hello”
- value: 可选的
- String类型
- List类型
- Set类型
- SortedSet类型
- Hash类型
2.4 redis中常用数据类型
-
String类型
-
List类型
-
Set类型
-
SortedSet类型
- 排序集合, 集合中的每个元素分为两部分
- [分数, 成员] -> [66, ‘‘tom’’]
-
Hash类型
3. redis常用命令
3.1 String类型
SET key value
GET key
MSET key value [key value ...]
MGET key [key ...]
APPEND key value
STRLEN key
DECR key
3.2 List类型 - 存储多个字符串
LPUSH key value [value ...]
RPUSH key value [value ...]
LPOP key
RPOP key
LRANGE key start stop
start: 起始位置, 0
stop: 结束位置, -1
LINDEX key index
LLEN key
3.3 Set类型
SADD key member [member ...]
SMEMBERS key
SDIFF key [key ...]
SINTER key [key ...]
SUNION key [key ...]
3.4 SortedSet 类型
ZADD key score member [[score member] [score member] ...]
ZRANGE key start stop [WITHSCORES]
ZREVRANGE key start stop [WITHSCORES]
ZCOUNT key min max
3.5 Hash类型
HSET key field value
HGET key field
HMSET key field value [field value ...]
HMGET key field [field ...]
HDEL key field [field ...]
3.6 Key 相关的命令
DEL key [key ...]
KEYS pattern
EXPIRE key seconds
PERSIST key
TYPE key
4. redis配置文件
配置文件是给redis服务器使用 的,配置文件位置在源码安装目录.redis.conf
。一般不修改这个文件,而是拷贝出来一份就行修改,在启动redis服务器的时候,指定这个拷贝出来的配置文件即可。
4.1 基础配置项
下面的配置文件配置项只是一部分,还有数据持久化的配置在下一节介绍。
bind 127.0.0.1 192.168.1.100
protected-mode yes
port 6379
timeout 0
daemonize no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile "" -> 这是没写
logfile ./redis.log
databases 16
4.2 数据持久化配置项
持久化: 将数据从内存保存到磁盘的过程
持久化有两种方式:
-
rdb方式
-
特点
- 这是一种默认的持久化方式, 默认打开
- 磁盘的持久化文件xxx.rdb
- 将内存数据以二进制的方式直接写入磁盘文件
- 快照的方式,存储的是内存的数据,按照一定
频率
做持久化
-
优点
-
缺点
- 存储频率太低,同步不及时,容易丢失数据
- 存储频率太高,存储效率低
-
aof方式
- 特点
- 默认是关闭的
- 磁盘的持久化文件xxx.aof
- 直接将生成数据的命令写入磁盘文件
- 存储的是命令,按照时间间隔存储
- 优点
- 缺点
持久化配置项的相关参数
save 3600 1
save 300 100
save 60 10000
dbfilename dump.rdb
dir ./
appendonly no
-> 打开: yes
appendfilename "appendonly.aof"
appendfsync everysec
-
aof和rdb能不能同时打开? —> 可以
-
aof和rdb能不能同时关闭?—> 可以
-
rdb如何关闭?—> save ""
-
两种模式同时开启, 如果要进行数据恢复, 如何选择?
- 效率上考虑: rdb模式
- 数据的完整性: aof模式
5. hiredis的使用
5.1 hiredis安装
git clone https://github.com/redis/hiredis.git
cd hiredis
make
make install
5.2 hiredis API接口 介绍
redisContext *redisConnect(const char *ip, int port);
redisContext *redisConnectWithTimeout(const char *ip,
int port, const struct timeval tv);
void *redisCommand(redisContext *c, const char *format, ...);
typedef struct redisReply {
int type;
long long integer;
size_t len;
char *str;
size_t elements;
struct redisReply **element;
} redisReply;
void freeReplyObject(void *reply);
void redisFree(redisContext *c);
状态表示 | 含义 |
---|
REDIS_REPLY_STRING==1 | 返回值是字符串,字符串储存在redis->str当中,字符串长度为len |
REDIS_REPLY_ARRAY== 2 | 返回值是数组,数组大小存在redis->elements里面,数组值存储在redis->element[i]里面。数组里面存储的是指向redisReply的指针,数组里面的返回值可以通过redis->element[i]->str来访问,数组的结果里全是type==REDIS_REPLY_STRING的redisReply对象指针。 |
REDIS_REPLY_INTEGER == 3 | 返回整数long long,从integer字段获取值 |
REDIS_REPLY_NIL==4 | 返回值为空表示执行结果为空 |
REDIS_REPLY_STATUS ==5 | 返回命令执行的状态,比如set foo bar 返回的状态为OK,存储在str当中 reply->str == “OK” 。 |
REDIS_REPLY_ERROR ==6 | 命令执行错误,错误信息存放在 reply->str当中。 |
5.3 hiredis使用Demo
hiredis提供的接口使用起来非常的简单,参考example.c,直接一葫芦画瓢即可在程序中操作redis。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <hiredis.h>
int main(int argc, char **argv) {
redisContext *c;
redisReply *reply;
c = redisConnect("127.0.0.1", 6379);
if (c == NULL || c->err) {
printf("Connection error: %s\n", c->errstr);
redisFree(c);
exit(1);
}
reply = redisCommand(c, "PING");
printf("PING: %s\n", reply->str);
freeReplyObject(reply);
reply = redisCommand(c, "SET %s %s", "foo", "hello world");
printf("SET: %s\n", reply->str);
freeReplyObject(reply);
reply = redisCommand(c, "SET %b %b", "bar", (size_t) 3, "hello", (size_t) 5);
printf("SET (binary API): %s\n", reply->str);
freeReplyObject(reply);
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);
reply = redisCommand(c, "INCR counter");
printf("INCR counter: %lld\n", reply->integer);
freeReplyObject(reply);
reply = redisCommand(c, "DEL mylist");
freeReplyObject(reply);
int j = 0;
for (j = 0; j < 10; j++) {
char buf[64];
snprintf(buf, 64, "%u", j);
reply = redisCommand(c, "LPUSH mylist element-%s", buf);
freeReplyObject(reply);
}
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);
redisFree(c);
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)