1.数据库的类型
-
关系型数据库
- 操作数据库必须使用SQL语句
- 数据存储再磁盘上
-
非关系型数据库
- 操作数据库不使用SQL语句
- 数据默认存储在内存
-
关系型数据库和非关系型数据的联合使用
-
- RDBMS:关系型数据库管理系统
- 所用数据默认存储在关系数据库里
- 客户端访问数据库,有一些数据需要频繁的查数据库
- 服务器首先将数据从关系型数据中读出来->第一次
- 再将数据写到redis里面
- 客户端第二次访问数据库时,直接从redis读出
- 服务器首先将数据从关系型数据中读出来->第一次
- RDBMS:关系型数据库管理系统
2.redis
-
redis中的两个角色
- 服务端
-
redis-server # 默认启动
-
redis-server confFileName # 根据配置文件的设置启动
-
-
客户端
-
redis-cli # 默认连接本地 , 绑定了 6379 默认端口的服务器
-
redis-cli -p 端口号
-
redis-cli -h IP 地址 -p 端口 # 连接远程主机的指定端口的 redis
-
- 服务端
-
redis中常用命令
- String 类型
key -> string value -> string
# 设置一个键值对->string:string
SET key value
# 通过key得到value
GET key
# 同时设置一个或多个 key-value 对
MSET key value [key value ...]
# 同时查看过个key
MGET key [key ...]
# 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾
# key: hello, value: world, append: 12345
APPEND key value
# 返回 key 所储存的字符串值的长度
STRLEN key
# 将 key 中储存的数字值减一。
# 前提, value必须是数字字符串 -"12345"
DECR key
- List类型
key -> string
value -> list
# 将一个或多个值 value 插入到列表 key 的表头
LPUSH key value [value ...]
# 将一个或多个值 value 插入到列表 key 的表尾 (最右边)。
RPUSH key value [value ...]
# list中删除元素
LPOP key # 删除最左侧元素
RPOP key # 删除最右侧元素
# 遍历
LRANGE key start stop
start: 起始位置, 0 stop: 结束位置, -1
# 通过下标得到对应位置的字符串
LINDEX key index
# list中字符串的个数 LLEN key
- Set类型
key -> string value -> set类型 ("string", "string1")
# 添加元素
# 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略
SADD key member [member ...]
# 遍历
SMEMBERS key
# 差集
SDIFF key [key ...]
# 交集
SINTER key [key ...]
# 并集
SUNION key [key ...]
- SortedSet 类型
key -> string value -> sorted ([socre, member], [socre, member], ...)
# 添加元素
ZADD key score member [[score member] [score member] ...]
# 遍历
ZRANGE key start stop [WITHSCORES] # -> 升序集合
ZREVRANGE key start stop [WITHSCORES] # -> 降序集合
# 指定分数区间内元素的个数
ZCOUNT key min max
- Hash类型
key ->string value -> hash ([key:value], [key:value], [key:value], ...)
# 添加数据
HSET key field value
# 取数据
HGET key field
# 批量插入键值对
HMSET key field value [field value ...]
# 批量取数据
HMGET key field [field ...]
# 删除键值对
HDEL key field [field ...]
- key相关命令
# 删除键值对
DEL key [key ...]
# 查看key值
KEYS pattern 查找所有符合给定模式 pattern 的 key 。
KEYS * 匹配数据库中所有 key 。
KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
KEYS h*llo 匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo
# 给key设置生存时长
EXPIRE key seconds
# 取消生存时长
PERSIST key
# key对应的valued类型
TYPE key
-
redis配置文件
# redis服务器绑定谁之后, 谁就能访问redis服务器
# 任何客户端都能访问服务器, 需要注释该选项
bind 127.0.0.1 192.168.1.100
# 保护模式, 如果要远程客户端访问服务器, 该模式要关闭
protected-mode yes
# reids服务器启动时候绑定的端口, 默认为6379
port 6379
# 超时时长, 0位关闭该选项, >0则开启
timeout 0
# 服务器启动之后不是守护进程
daemonize no
# 如果服务器是守护进程, 就会生成一个pid文件
# ./ -> reids服务器启动时候对应的目录
-
redis数据持久化
- 持久化的两种方式:
- rdb方式
- 这是一种默认的持久化方式, 默认打开
- 磁盘的持久化文件xxx.rdb
- 将内存数据以二进制的方式直接写入磁盘文件
- 文件比较小, 恢复时间短, 效率高
- 以用户设定的频率 -> 容易丢失数据
- 数据完整性相对较低
- aof方式
- 默认是关闭的
- 磁盘的持久化文件xxx.aof
- 直接将生成数据的命令写入磁盘文件
- 文件比较大, 恢复时间长, 效率低
- 以某种频率 -> 1sec
- 数据完整性高
- rdb方式
- 持久化的两种方式:
3.hiredis的使用
-
hiredis API接口的使用
// 连接数据库
redisContext *redisConnect(const char *ip, int port);
redisContext *redisConnectWithTimeout(const char *ip, int port, const struct timeval tv);
// 执行redis命令
void *redisCommand(redisContext *c, const char *format, ...);
// redisCommand 函数实际的返回值类型
typedef struct redisReply {
/* 命令执行结果的返回类型 */
int type;
/* 存储执行结果返回为整数 */
long long integer;
/* str变量的字符串值长度 */
size_t len;
/* 存储命令执行结果返回是字符串, 或者错误信息 */
char *str;
/* 返回结果是数组, 代表数据的大小 */
size_t elements;
/* 存储执行结果返回是数组*/
struct redisReply **element;
} redisReply;
redisReply a[100];
element[i]->str
-
示例程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <hiredis.h>
int main() {
// 1.连接数据k库
redisContext* c = redisConnect("127.0.0.1", 6379);
if (c->err != 0) {
return -1;
}
// 2. 向数据库中存入数据
void* ptr = redisCommand(c, "hmset user3 username hansy passwd 123456 age 23");
redisReply* ply = (redisReply*)ptr;
if (ply->type == 5) {
printf("state : %s\n", ply->str);
}
freeReplyObject(ply);
// 3. 从数据库中查找数据
ptr = redisCommand(c, "hgetall user3");
ply = (redisReply*)ptr;
if (ply->type == 2) {
// 4.遍历数组
int i;
for (i = 0; i < ply->elements; i += 2) {
printf("key : %s, value : %s\n", ply->element[i]->str, ply->element[i + 1]->str);
}
}
freeReplyObject(ply);
redisFree(c);
return 0;
}
- 编译命令
gcc example.c -I /usr/local/include/hiredis/ -lhiredis -o ex
- 结果