C++文件服务器项目—Redis—2

2023-05-16

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配置文件
    • 4.1 基础配置项
    • 4.2 数据持久化配置项
  • 5. hiredis的使用
    • 5.1 hiredis安装
    • 5.2 hiredis API接口 介绍
    • 5.3 hiredis使用Demo

前言

  本文简单介绍了一下redis以及C接口的客户端库hiredis的使用

  本专栏知识点是通过零声教育的线上课学习,进行梳理总结写下文章,对c/c++linux课程感兴趣的读者,可以点击链接 C/C++后台高级服务器课程介绍 详细查看课程的服务。

1. 数据库类型

1.1 基本概念

  1. 关系型数据库 - sql
    • 操作数据必须要使用sql语句
    • 数据存储在磁盘
    • 存储的数据量大
    • 举例:
      • mysql
      • oracle
      • sqlite - 文件数据库
      • sql server
  2. 非关系数据库 - nosql
    • 操作不使用sql语句
      • 使用命令
    • 数据默认存储在内存
      • 速度快, 效率高
      • 存储的数据量小
    • 不需要数据库表
      • 以键值对的方式存储的

1.2 关系/非关系型数据库搭配使用

在这里插入图片描述

  RDBMS: Relational Database Management System-关系数据库管理系统

  1. 所有的数据默认存储在关系型数据库中
  2. 客户端访问服务器, 有一些数据, 服务器需要频繁的查询数据
    • 服务器首先将数据从关系型数据库中读出 -> 第一次
      • 将数据写入到redis中
    • 客户端第二次以及以后访问服务器
      • 服务器从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	# 默认连接本地, 绑定了6379默认端口的服务器
redis-cli -p 端口号
redis-cli -h IP地址 -p 端口 # 连接远程主机的指定端口的redis
# 通过客户端关闭服务器
shutdown
# 客户端的测试命令
ping [MSG]

2.3 redis中数据的组织格式

  • 键值对
    • key: 必须是字符串 -> “hello”
    • value: 可选的
      • String类型
      • List类型
      • Set类型
      • SortedSet类型
      • Hash类型

2.4 redis中常用数据类型

  • String类型

    • 字符串
  • List类型

    • 存储多个string字符串
  • Set类型

    • redis集合
      • 元素不重复, 数据是无序的
  • SortedSet类型

    • 排序集合, 集合中的每个元素分为两部分
      • [分数, 成员] -> [66, ‘‘tom’’]
  • Hash类型

    • 跟map数据组织方式一样: key:value
      • Map -> 红黑树
      • hash -> 数组
        • a[index] = xx

3. redis常用命令

3.1 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

3.2 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

3.3 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 ...]

3.4 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

3.5 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 ...]

3.6 Key 相关的命令

# 删除键值对
DEL key [key ...]

# 查看key值
# 查找所有符合给定模式 pattern 的 key
# KEYS * 匹配数据库中所有 key
# KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
# KEYS h*llo 匹配 hllo 和 heeeeello 等。
# KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo
KEYS pattern

# 给key设置生存时长
EXPIRE key seconds

# 取消生存时长
PERSIST key

# key对应的valued类型
TYPE key

4. redis配置文件

  配置文件是给redis服务器使用 的,配置文件位置在源码安装目录.redis.conf。一般不修改这个文件,而是拷贝出来一份就行修改,在启动redis服务器的时候,指定这个拷贝出来的配置文件即可。

4.1 基础配置项

  下面的配置文件配置项只是一部分,还有数据持久化的配置在下一节介绍。

# redis服务器绑定谁之后, 谁就能访问redis服务器
# 想要任何客户端ip都能访问服务器, 需要注释该选项
bind 127.0.0.1 192.168.1.100 
# 保护模式, 如果要远程客户端访问服务器, 该模式要关闭(no)
protected-mode yes
# reids服务器启动时候绑定的端口, 默认为6379
port 6379
# 超时时长, 0位关闭该选项, >0则开启
timeout 0
# 服务器启动之后不是守护进程
daemonize no
# 如果服务器是守护进程, 就会生成一个pid文件
# ./ -> reids服务器启动时候对应的目录
# pidfile ./redis.pid
pidfile /var/run/redis_6379.pid
# 日志级别
loglevel notice
# 如果服务器是守护进程, 才会写日志文件
logfile "" -> 这是没写
logfile ./redis.log
 # redis中数据库的个数
databases 16 
#- 切换 select dbID [dbID == 0 ~ 16-1]

4.2 数据持久化配置项

  持久化: 将数据从内存保存到磁盘的过程

持久化有两种方式:

  • rdb方式

    • 特点

      • 这是一种默认的持久化方式, 默认打开
      • 磁盘的持久化文件xxx.rdb
      • 将内存数据以二进制的方式直接写入磁盘文件
      • 快照的方式,存储的是内存的数据,按照一定频率做持久化
    • 优点

      • 文件比较小, 恢复时间短, 效率高
    • 缺点

      • 存储频率太低,同步不及时,容易丢失数据
      • 存储频率太高,存储效率低
  • aof方式

    • 特点
      • 默认是关闭的
      • 磁盘的持久化文件xxx.aof
      • 直接将生成数据的命令写入磁盘文件
      • 存储的是命令,按照时间间隔存储
    • 优点
      • 以时间为单位存储,数据完整性高
    • 缺点
      • 文件比较大, 恢复时间长, 效率低

  
  持久化配置项的相关参数

# rdb的同步频率, 任意一个满足都可以
# Unless specified otherwise, by default Redis will save the DB:
#   * After 3600 seconds (an hour) if at least 1 change was performed
#   * After 300 seconds (5 minutes) if at least 100 changes were performed
#   * After 60 seconds if at least 10000 changes were performed

save 3600 1
save 300 100
save 60 10000
# rdb文件的名字
dbfilename dump.rdb
# 生成的持久化文件保存的那个目录下, rdb和aof
dir ./ 
# 是不是要打开aof模式
appendonly no
 -> 打开: yes
# 设置aof文件的名字
appendfilename "appendonly.aof"
# aof更新的频率
# appendfsync always
appendfsync everysec
# appendfsync no
  1. aof和rdb能不能同时打开? —> 可以

  2. aof和rdb能不能同时关闭?—> 可以

  3. rdb如何关闭?—> save ""

  4. 两种模式同时开启, 如果要进行数据恢复, 如何选择?

    • 效率上考虑: 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);
  • 执行redis命令函数
// 执行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;
  • 释放资源
// 释放资源
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;
    //1. 连接redis服务器
    c = redisConnect("127.0.0.1", 6379);
    if (c == NULL || c->err) {
        printf("Connection error: %s\n", c->errstr);
        redisFree(c);
        exit(1);
    }

    //2. 执行redis命令
    /* 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);
    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);
    }

    /* 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;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++文件服务器项目—Redis—2 的相关文章

随机推荐

  • Unity Shader:光照模型,纹理,详细注释

    Phong光照模型 进入摄像机的光线分为四个部分 环境光 xff08 ambient xff09 其他所有间接光照 自发光 xff08 emissive xff09 给定一个方向 xff0c 模型表面本身向该方向发射多少辐射量 漫反射 xf
  • 算法与数据结构 面试知识点大全【持续更新中】(校招/社招/实习/大厂/面试)

    文章目录 排序算法1 冒泡排序2 插入排序3 归并排序4 快速排序5 选择排序 二分搜索1 数组中第k大的数字2 875 爱吃香蕉的珂珂 力扣 xff08 LeetCode xff09 https leetcode cn problems
  • 堆栈

    栈是一种执行 后进先出 算法的数据结构 设想有一个直径不大 一端开口一端封闭的竹筒 有若干个写有编号的小球 xff0c 小球的直径比竹筒的直径略小 现在把不同编号的小球放到竹筒里面 xff0c 可以发现一种规律 xff1a 先放进去的小球只
  • 大端小端和C实现大小端字节序的转化

    大端小端 小端就是低位字节放在内存的低地址端 xff0c 高位字节放在内存的高地址端 大端就是高位字节放在内存的低地址端 xff0c 低位字节放在内存的高地址端 举一个例子 xff0c 比如数字0x12 34 56 78 xff08 注意7
  • 【计算机图形学/实时渲染】 阴影(GAMES202)

    阴影 对于静态的物体 xff0c 可以使用Lightmap烘焙的方法来获取物体的影子 xff08 静态阴影 xff09 xff0c 而对于动态的物体 xff0c 一般采用的是Shadowmap的技术 光照贴图 xff08 Lightmap
  • 解决Mingw-w64下载太慢问题

    官网下载太慢了 xff0c 我们只用换一个镜像源就可以 1 点击Problems Downloading 2 切换香港的
  • 嵌入式Linux开发8——UART串口通讯

    1 背景知识 1 1 UART通讯格式 串口全称叫做串行接口 xff0c 通常也叫做 COM 接口 xff0c 串行接口指的是数据一个一个的顺序传输 xff0c 通信线路简单 使用两条线即可实现双向通信 xff0c 一条用于发送 xff0c
  • 二叉树笔记

    二叉树 二叉搜索 xff08 排序 查找 xff09 树 二叉查找树 xff08 Binary Search Tree xff09 xff0c xff08 又 xff1a 二叉搜索树 xff0c 二叉排序树 xff09 它或者是一棵空树 x
  • C++面试常见题目

    C 43 43 面试常见题目 c 43 43 编译过程自动类型推导auto和decltype重载 重写 xff08 覆盖 xff09 和隐藏的区别C 43 43 构造函数和析构函数能调用虚函数吗volatile关键词运算符重载格式noexe
  • 计算机网络面试常问问题

    C 43 43 面试 计算机网络常见问题 计算机网络常见问题TCP IP协议笔记TCPTCP的特点及目的序列号与确认应答提高可靠性为什么是三次握手和四次挥手滑动窗口流量控制拥塞控制TCP粘包问题 httphttp和https的区别https
  • Trajectory generation for quadrotor while tracking a moving target in cluttered environment

    四旋翼在杂波环境下跟踪运动目标的轨迹生成 摘要1 文章主要贡献2 前言2 1 轨迹公式2 2 实现结构 3 跟踪轨迹生成3 1 标称路径点生成3 2 可行路径点生成3 3 安全飞行走廊生成3 4 代价函数3 5 强制约束3 6 求解跟踪轨迹
  • 翻译-Frustum PointNets for 3D Object Detection from RGB-D Data

    Frustum PointNets for 3D Object Detection from RGB D Data 摘要介绍相关工作从RGB D数据中检测三维物体基于前视图图像的方法 xff1a 基于鸟瞰图的方法 基于3D的方法 点云的深度
  • Online Trajectory Generation of a MAV for Chasing a Moving Target in 3D Dense Environments

    微型无人机的在线轨迹生成 xff0c 用于在3D密集环境中追踪运动目标 摘要一 介绍二 相关工作A 在障碍物环境中追逐B 通过预先规划安全地生成轨迹 三 问题陈述A 问题设置B 能力C 命名 IV 视点生成A 可见度指标B 具有安全性和可见
  • 配置目标跟踪开源项目traj_gen_vis踩过的坑

    项目地址 https github com icsl Jeon traj gen vis 安装依赖需注意的问题 traj gen with qpoases 需安装ros分支的代码 xff08 这个作者并没有指出 xff0c 坑 xff09
  • cmake arm-none-eabi-gcc for stm32 cpp project

    尝试把原有的stm32工程F1canBootloader用cmake来管理 xff0c 遇到了以下几个坑 xff1a 1 报错 xff0c undefined reference to 96 dso handle 39 CMakeFiles
  • 网络攻防之wireshark抓取登录信息

    使用wireshark抓取登录信息 简介 xff1a Wireshark xff08 前称Ethereal xff09 是一个网络封包分析软件 网络封包分析软件的功能是撷取网络封包 xff0c 并尽可能显示出最为详细的网络封包资料 Wire
  • 头文件互相包含所引发的的问题(深入剖析)

    今天写程序出现了一个让人蛋疼的错误 xff0c 后来发现是由于头文件互相包含所引起的 原本只是简单的以为头文件互相包含只会触发 xff0c 头文件的递归包含 即 xff0c A包含B xff0c 所以才A的头文件里会将B的头文件内容拷贝过来
  • C++11异步操作future和aysnc 、function和bind

    C 43 43 11异步操作future和aysnc function和bind 前言异步操作std future和std aysnc 介绍std future和std aysnc的使用Demostd packaged task 介绍std
  • C++文件服务器项目—FastDFS—1

    C 43 43 文件服务器项目 FastDFS 1 前言1 项目架构2 分布式文件系统2 1 传统文件系统2 2 分布式文件系统 3 FastDFS介绍3 1 fdfs概述3 2 fdfs框架中的三个角色3 3 fdfs三个角色之间的关系3
  • C++文件服务器项目—Redis—2

    C 43 43 文件服务器项目 Redis 2 前言1 数据库类型1 1 基本概念1 2 关系 非关系型数据库搭配使用 2 redis基础知识点2 1 redis安装2 2 redis中的两个角色2 3 redis中数据的组织格式2 4 r