C++ 网络编程项目fastDFS分布式文件系统(二)-redis部分

news2024/11/24 20:55:43

目录

1. 数据库类型

        1.1 基本概念

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

2. Redis

2.1 基本知识点

2.2 redis常用命令

- String类型

- List类型

 - Set类型

- SortedSet 类型

- Hash类型

 Key 相关的命令

2.3 redis配置文件

2.4 redis数据持久化

3 hiredis的使用


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中直接读数据

2. Redis

> 1. 知道redis是什么?

>    - 非关系型数据库 也可以叫 内存数据库

> 2. 能干什么?

>    - 存储访问频率高的数据

>    - 共享内存

>      - 服务器端 -> redis

> 3. 怎么使用?

>    - 常用的操作命令

>      - 各种数据类型 -> 会查

>    - redis的配置文件

>    - redis的数据持久化

>    - 写程序的时候如何对redis进行操作

>      - 客户端 -> 服务器

服务器 启动 redis-server 

客户端启动 redis-cli

2.1 基本知识点

1. 安装包下载

   - 英文官方: <https://redis.io/>

   - 中文官方: <http://redis.cn/>

2. Redis安装

   - make

   - make install

3. redis中的两个角色

   ```shell

   # 服务器 - 启动

   redis-server # 默认启动

   redis-server confFileName # 根据配置文件的设置启动

   # 客户端

   redis-cli  # 默认连接本地, 绑定了6379默认端口的服务器

   redis-cli -p 端口号

   redis-cli -h IP地址 -p 端口 # 连接远程主机的指定端口的redis

   # 通过客户端关闭服务器

   shutdown

   # 客户端的测试命令

   ping [MSG]

   ```

4. redis中数据的组织格式

   - 键值对

     - key: 必须是字符串 - "hello"

     - value: 可选的

       - String类型

       - List类型

       - Set类型

       - SortedSet类型

       - Hash类型

5. redis中常用数据类型

   - String类型

     - 字符串

   - List类型

     - 存储多个string字符串的

   - Set类型

     - 集合

       - stl集合

         - 默认是排序的, 元素不重复

       - redis集合

         - 元素不重复, 数据是无序的

   - SortedSet类型

     - 排序集合, 集合中的每个元素分为两部分

       - [分数, 成员] -> [66, ''tom'']

   - Hash类型

     - 跟map数据组织方式一样: key:value

       - Qt -> QHash, QMap

       - Map -> 红黑树

       - hash -> 数组

         - a[index] = xx

 

2.2 redis常用命令

- String类型

  ```shell

  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类型

- 存储多个字符串

  ```shell

  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类型

  ```shell

  key -> string

  value -> set类型 ("string", "string1")

  # 添加元素

  # 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略

  SADD key member [member ...]

  # 遍历

  SMEMBERS key

  # 差集

  SDIFF key [key ...]

  # 交集

  SINTER key [key ...]

  # 并集

  SUNION key [key ...]

  ``` 可以使用交集差集,比如qq推送可能认识的人。

 

 

- SortedSet 类型

  ```shell

  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类型

 

  ```shell

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

  ```

#获取所有keys 对应的域

HGETALL key

 Key 相关的命令

  ```shell

  # 删除键值对

  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

2.3 redis配置文件

> 配置文件是给**redis服务器**使用 的

1. 配置文件位置

   - 从源码安装目录中找 -> redis.conf

2. 配置文件配置项

   ```shell

   # 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服务器启动时候对应的目录

   pidfile ./redis.pid

   # 日志级别

    loglevel notice

   # 如果服务器是守护进程, 才会写日志文件

    logfile "" -> 这是没写

    logfile ./redis.log

    # redis中数据库的个数

    databases 16

      - 切换 select dbID [dbID == 0 ~ 16-1]

   ```

2.4 redis数据持久化

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

持久化的两种方式:

- rdb方式

  - 这是一种默认的持久化方式, 默认打开

  - 磁盘的持久化文件xxx.rdb

  - 将内存数据以二进制的方式直接写入磁盘文件

  - 文件比较小, 恢复时间短, 效率高

  - 以用户设定的频率 -> 容易丢失数据

  - 数据完整性相对较低

- aof方式

  - 默认是关闭的

  - 磁盘的持久化文件xxx.aof

  - 直接将生成数据的命令写入磁盘文件

  - 文件比较大, 恢复时间长, 效率低

  - 以某种频率 -> 1sec

  - 数据完整性高

```shell

# rdb的同步频率, 任意一个满足都可以 在配置文件里面打开

save 900 1

save 300 10

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能不能同时关闭?

   - 可以

   - rdb如何关闭?

     ```shell 在配置文件里面 216行 改成 ->

     save ""

     ```

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

   - 效率上考虑:  rdb模式

   - 数据的完整性: aof模式

3 hiredis的使用

1. hiredis的安装

   - 下载地址: <http://redis.cn/clients.html#c>

   - 安装

     - make

     - make

2. hiredis API接口的使用

   - 连接数据库

     ```c

     // 连接数据库

     redisContext *redisConnect(const char *ip, int port);

     redisContext *redisConnectWithTimeout(const char *ip,

                                           int port, const struct timeval tv);

     ```

   - 执行redis命令函数

     ```c

     // 执行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

     ```

     | 状态表示                 | 含义                                                         |

     | ------------------------ | ------------------------------------------------------------ |

     | REDIS_REPLY_STRING==1    | 返回值是字符串,字符串储存在redis->str当中,字符串长度为redi   |

     | 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当中。                 |

   - 释放资源

     ```c

     // 释放资源

     void freeReplyObject(void *reply);

     void redisFree(redisContext *c);

     ```


4. 复习

1. fastDFS

   - 是什么?

     - 分布式文件系统

   - 干什么?

     - 提供文件上传

     - 提供文件下载

   - 怎么使用?

     - 根据主机的角色 -> 修改对应的配置文件

     - 启动各个角色

       ```shell

       fdfs_trackerd /etc/fdfs/tracker.conf

       fdfs_storaged /etc/fdfs/storage.conf

       ```

     客户端编写

     ![1531272014374](1531272014374.png)

     - 操作步骤

       1. 创建管道 - pipe

       2. 创建子进程

       3. 子进程干什么?

          - 写管道, 关闭读端

            - 将标准输出 -> 管道的写端

          - 重定向

          - 执行execl命令, 调用另外的进程fdfs_upload_file

          - 子进程退出

       4. 父进程?

          - 读管道, 关闭写端

          - 释放子进程资源 - pcb

            - wait()/ waitpid()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/874730.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人类:我觉得1+1=956446,你觉得呢?大模型:啊对对对

大模型太「听话」了怎么办&#xff1f; 大型语言模型&#xff08;LLM&#xff09;的自然语言理解与生成能力一直备受称赞&#xff0c;特别是 ChatGPT 等对话式语言模型能够与人类流畅、自然地进行多轮对话。然而&#xff0c;最近一篇 Google DeepMind 的论文研究发现 LLM 普遍存…

FPGA GTP全网最细讲解 aurora 8b/10b协议OV5640摄像头视频传输 提供2套工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、GTP 全网最细解读GTP 基本结构GTP 发送和接收处理流程GTP 的参考时钟GTP 发送接口GTP 接收接口GTP IP核调用和使用 4、设计思路框架OV5640摄像头配置及采集视频数据组包GTP aurora 8b/10b数据对齐视频数据解包图像…

WinCC V7.5 中的C脚本对话框不可见,将编辑窗口移动到可见区域的具体方法

WinCC V7.5 中的C脚本对话框不可见&#xff0c;将编辑窗口移动到可见区域的具体方法 由于 Windows 系统更新或使用不同的显示器&#xff0c;在配置C动作时&#xff0c;有可能会出现C脚本编辑窗口被移动到不可见区域的现象。 由于该窗口无法被关闭&#xff0c;故无法进行进一步…

WebRTC音视频通话-RTC直播本地视频及相册视频文件

WebRTC音视频通话-RTC直播本地视频及相册视频文件 WebRTC音视频通话-RTC直播本地视频文件效果图如下 WebRTC音视频通话-RTC直播本地视频文件时候&#xff0c;用到了AVPlayer、CADisplayLink。 一、通过AVPlayer播放本地视频 AVPlayer是什么&#xff1f; AVPlayer是基于AV…

进程间的通信

进程的通信&#xff0c;光是听概念就知道这是一个非常重要的知识点&#xff0c;但是之前学习的概念其实都无法实现真正意义上的进程间的通信&#xff1a; 子进程调用exit或Exit或_exit&#xff0c;然后父进程通过wait可以知道其状态&#xff0c;这虽然实现了消息的传递&#x…

【图像分类】理论篇(2)经典卷积神经网络 Lenet~Densenet

1、卷积运算 在二维卷积运算中&#xff0c;卷积窗口从输入张量的左上角开始&#xff0c;从左到右、从上到下滑动。 当卷积窗口滑动到新一个位置时&#xff0c;包含在该窗口中的部分张量与卷积核张量进行按元素相乘&#xff0c;得到的张量再求和得到一个单一的标量值&#xff0c…

算法与数据结构(二十三)动态规划设计:最长递增子序列

注&#xff1a;此文只在个人总结 labuladong 动态规划框架&#xff0c;仅限于学习交流&#xff0c;版权归原作者所有&#xff1b; 也许有读者看了前文 动态规划详解&#xff0c;学会了动态规划的套路&#xff1a;找到了问题的「状态」&#xff0c;明确了 dp 数组/函数的含义&a…

二叉树的存储结构(顺序存储)—— 数据结构与算法

&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️ &#x1f4a5;个人主页&#xff1a;&#x1f525;&#x1f525;&#x1f525;大魔王&#x1f525;&#x1f525;&#x1f525; &#x1f4a5;代码仓库&#xff1a;&#x1f525;&#x1f525;魔…

《雷达像智能识别对抗研究进展》阅读记录

&#xff08;1&#xff09;引言 ​ 神经网络通常存在鲁棒性缺陷&#xff0c;易受到对抗攻击的威胁。攻击者可以隐蔽的诱导雷达智能目标识别做出错误预测&#xff0c;如&#xff1a; ​ a图是自行车&#xff0c;加上对抗扰动后神经网络就会将其识别为挖掘机。 &#xff08;2&a…

一探Linux下的七大进程状态

文章目录 一、前言二、操作系统学科下的进程状态1、运行状态2、阻塞状态3、挂起状态 三、Linux下的7种进程状态1、运行状态R2、浅度睡眠状态S3、深度睡眠状态D一场有趣的官司 4、停止状态T5、进程跟踪状态t6、死亡状态X7、僵死状态Z —— 两个特殊进程① 僵尸进程② 孤儿进程 四…

算法竞赛备赛之搜索与图论训练提升,暑期集训营培训

目录 1.DFS和BFS 1.1.DFS深度优先搜索 1.2.BFS广度优先搜索 2.树与图的遍历&#xff1a;拓扑排序 3.最短路 3.1.迪杰斯特拉算法 3.2.贝尔曼算法 3.3.SPFA算法 3.4.多源汇最短路Floy算法 4.最小生成树 4.1.普利姆算法 4.2.克鲁斯卡尔算法 5.二分图&#xff1a;染色法…

嵌入式学习之strcpy、memset、realloc、malloc使用方法

今天主要针对C语言的strcpy memset realloc mallooc函数进行了学习。 char* strcpy(char* destination,const char* source); void memset ( void *s , char ch, unsigned n )&#xff1b; void* realloc(void* memblock, size_t size)&#xff1b; void *malloc(size_t si…

tkinter打造三维绘图系统,附源代码

文章目录 输入数据加载数据绘图函数源代码 Python绘图系统系列&#xff1a;将matplotlib嵌入到tkinter 简单的绘图系统 数据导入 输入数据 三维绘图需要一个新的坐标变量&#xff0c;设置为z&#xff0c;这个改改UI就可以办到&#xff0c;并不困难。但是&#xff0c;此前用于…

git安装介绍

一、分布式版本控制系统Git概述 1.1 分布式版本控制系统Git介绍 版本控制定义 记录和跟踪项目中各文件内容的改动变化 保存项目的版本历史&#xff0c;以及改动原因&#xff0c;从而让用户能够查看各个历史版本 版本控制系统也是帮助人员进行协作开发的利器 为什么需要版本…

WebRTC音视频通话-WebRTC本地视频通话使用ossrs服务搭建

iOS开发-ossrs服务WebRTC本地视频通话服务搭建 之前开发中使用到了ossrs&#xff0c;这里记录一下ossrs支持的WebRTC本地服务搭建。 一、ossrs是什么&#xff1f; ossrs是什么呢&#xff1f; SRS(Simple Realtime Server)是一个简单高效的实时视频服务器&#xff0c;支持RTM…

福康源:用孝道温暖每一个心灵,共筑幸福健康新人生!

福康源&#xff1a;用孝道温暖每一个心灵&#xff0c;共筑幸福健康新人生 孝道的光芒&#xff1a;福康源的初心 在浮躁的现代社会&#xff0c;孝道的力量正被越来越多的人忽略。然而&#xff0c;福康源的初心却始终坚守孝顺的真谛。孝道不仅是对父母的敬爱&#xff0c;更是一种…

【解析postman工具的使用---基础篇】

postman前端请求详解 主界面1.常见类型的接口请求1.1 查询参数的接口请求1.1.1 什么是查询参数?1.1.2 postman如何请求 1.2 ❤表单类型的接口请求1.2.1 复习下http请求1.2.2❤ 什么是表单 1.3 上传文件的表单请求1.4❤ json类型的接口请求 2. 响应接口数据分析2.1 postman的响…

程序设计 树基础

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

Lorilla LLM - 面向API调用生成的专用AI大模型

Gorilla 是一种先进的大型语言模型 (LLM)&#xff0c;旨在与各种 API 有效交互&#xff0c;从而增强 LLM 在实际应用中的功能。 Gorilla LLM的相关链接&#xff1a;官网 | github | 论文。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 1、Gorilla LLM简介 通过使用自…

CentOS 项目作出声明,宣称自家 Linux 社区 “始终向所有人开放”

导读在红帽 RHEL 开源事件后&#xff0c;许多兼容 RHEL 的发行版最近都进行了表态&#xff0c;CentOS 项目也在日前作出了声明&#xff0c;宣称自家社区 “始终向所有人开放”。 据悉&#xff0c;CentOS 项目董事会日前在官方博客发布了一则公告&#xff0c;内容主要涉及“ Ce…