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

目录

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.mzph.cn/news/35615.shtml

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

相关文章

原生js发送ajax请求---ajax请求篇(一)

在原生js中我们使用的是XMLHttpRequest对象来发送ajax请求 主要步骤就是&#xff1a; 1.创建XMLHTTPRequest对象 2.使用open方法设置和服务器的交互信息 3.设置发送的数据&#xff0c;开始和服务器端交互 4.注册事件 5.更新界面 &#xff08;1&#xff09; get方式 //步骤一…

使用python对图像加噪声

加上雨点噪声 import cv2 import numpy as npdef get_noise(img, value10):#生成噪声图像>>> 输入&#xff1a; img图像value 大小控制雨滴的多少 >>> 返回图像大小的模糊噪声图像noise np.random.uniform(0, 256, img.shape[0:2])# 控制噪声水平&#xff…

OPENCV C++(十二)模板匹配

正常模板匹配函数 matchTemplate(img, templatee, resultMat, 0);//模板匹配 这里0代表的是方法&#xff0c;一般默认为0就ok img是输入图像 templatee是模板 resultmat是输出 1、cv::TM_SQDIFF&#xff1a;该方法使用平方差进行匹配&#xff0c;因此最佳的匹配结果在结果为…

Excel(1):表头或列头冻结

1.需求 对于较大的excel&#xff0c;通常需要固定一部分内容&#xff0c;另一份内容为可翻动。 2.解决方式 在视图中选择冻结窗格&#xff0c;需要注意的是&#xff0c;选择冻结窗格时&#xff0c;窗格的左上方的表格区域是固定不动的&#xff0c;只可以向下或者向右活动。

8.10论文阅读

文章目录 The multimodal MRI brain tumor segmentation based on AD-Net摘要本文方法损失函数 实验结果 max-vit - unet:多轴注意力医学图像分割摘要本文方法实验结果 The multimodal MRI brain tumor segmentation based on AD-Net 摘要 基于磁共振成像(MRI)的多模态胶质瘤…

云计算|OpenStack|使用VMware安装华为云的R006版CNA和VRM---初步使用(二)

前言&#xff1a; 在前面一篇文章云计算|OpenStack|使用VMware安装华为云的R006版CNA和VRM---初始安装&#xff08;一&#xff09;_华为cna_晚风_END的博客-CSDN博客 介绍了基于VMware虚拟机里嵌套部署华为云的云计算&#xff0c;不过仅仅是做到了在VRM的web界面添加计算节点…

Android使用kotlin+协程+room数据库的简单应用

前言&#xff1a;一般主线程&#xff08;UI线程&#xff09;中是不能执行创建数据这些操作的&#xff0c;因为等待时间长。所以协程就是为了解决这个问题出现。 第一步&#xff1a;在模块级的build.gradle中引入 id com.android.application// roomid kotlin-androidid kotlin…

Mysql主从分离

一、前言 某个应用场景中&#xff0c;在操作数据库这部分&#xff0c;往往是数据库的读取往往大于数据库的写入&#xff0c;当读取数据达到数据库的瓶颈时&#xff0c;性能下滑&#xff0c;影响数据的写入&#xff0c;导致整个应用的不可用。为了解决这个问题&#xff0c;这时&…

单片机直驱两相四线步进电机研究

【本文发布于https://blog.csdn.net/Stack_/article/details/132236329&#xff0c;未经允许不得转载&#xff0c;转载须注明出处】 双极性步进电机&#xff08;两相四线步进电机&#xff09;&#xff0c;原理的东西就先不讲太多了&#xff0c;还没搞清楚&#xff0c;边查资料边…

jsoup解析html之table表格

jsoup解析html之table表格 jsoup说明 一款Java 的HTML解析器 jsoup 是一款Java 的HTML解析器&#xff0c;可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API&#xff0c;可通过DOM&#xff0c;CSS以及类似于jQuery的操作方法来取出和操作数据。 主要功能 从一…

Python Opencv实践 - 图像旋转

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR)#图像旋转 #Opencv中的旋转&#xff0c;首先通过cv.getRotationMatrix2D获得旋转矩阵 #cv.getRotationMatrix2D(center,ang…

Mr. Cappuccino的第62杯咖啡——Spring之Bean的生命周期

Spring之Bean的生命周期 Aware接口项目结构项目代码运行结果源代码使用场景 InitializingBean接口项目结构项目代码运行结果源代码 BeanFactoryPostProcessor接口项目结构项目代码运行结果源代码 Bean的生命周期项目结构项目代码运行结果源代码 Aware接口 实现Aware接口是为了…

机器视觉项目流程和学习方法

机器视觉项目流程&#xff1a; 00001. 需求分析和方案建立 00002. 算法流程规划和业务逻辑设计 00003. 模块化编程和集成化实现 00004. 调试和优化&#xff0c;交付客户及文档 学习机器视觉的方法&#xff1a; 00001. 实战学习&#xff0c;结合项目经验教训 00002. 学习…

NAS搭建指南二——影视资源中心

1. 刮削 这一部分是利用 tinyMediaManager 进行影视资源的评分、简介以及图片的搜集工作tinyMediaManager 官方网站地址下载及安装过程&#xff1a;略我的主要修改的设置项如下所示&#xff1a; 使用方法&#xff1a; a. 点击更新媒体库 b. 选择影片–>右键单击–>…

时序预测 | MATLAB实现基于BiLSTM双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于BiLSTM双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于BiLSTM双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 Matlab实现BiLST…

年之年的选择,组装版

组件&#xff1a;<!--* Author: liuyu liuyuxizhengtech.com* Date: 2023-02-01 16:57:27* LastEditors: wangping wangpingxizhengtech.com* LastEditTime: 2023-06-30 17:25:14* Description: 时间选择年 - 年 --> <template><div class"year-range-pick…

04.利用Redis国逻辑过期实现缓存功能---解决缓存击穿

学习目标&#xff1a; 提示&#xff1a;学习如何利用Redis逻辑过期实现添加缓存功能解决缓存击穿 学习产出&#xff1a; 缓存击穿讲解图&#xff1a; 解决方案&#xff1a; 采用互斥锁采用逻辑过期 1. 准备pom环境 <dependency><groupId>org.springframework…

⑤ Axios网络请求

Axios安装 cnpm install --save axios post请求需要用到的&#xff1a; cnpm install --save querystring(用来转换格式的) 引入 一般是全局引入&#xff0c;在main.js中引入 全局引入后的get和post方式使用 get请求方式 post请求方式 先引入&#xff1a; axios封装…

STM32 定时器自动重装载寄存器ARR带来的影响,ARPE0和1区别

ARR是啥 自动重载寄存器是预装载的。对自动重载寄存器执行写入或读取操作时会访问预装载寄存器。预装载寄存器的内容既可以直接传送到影子寄存器&#xff0c;也可以在每次发生更新事件 (UEV) 时传送到影子寄存器&#xff0c;这取决于 TIMx_CR1 寄存器中的自动重载预装载使能位 …

1.作用域

1.1局部作用域 局部作用域分为函数作用域和块作用域。 1.函数作用域: 在函数内部声明的变量只能在函数内部被访问&#xff0c;外部无法直接访问。 总结&#xff1a; (1)函数内部声明的变量&#xff0c;在函数外部无法被访问 (2)函数的参数也是函数内部的局部变量 (3)不同函数…