Redis学习【2】之入门

前言

  • 学习的环境为Linux环境下的Redis

一 Redis概述

1.1 Redis简介

  • RedisRemote Dictionary Server )远程字典服务一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库并提供多种语言的API
  • 由意大利人 Salvatore Sanfilippo又名 Antirez开发
  • redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件并且在此基础上实现了master-slave(主从)同步。
  • Redis 之所以称之为字典服务是因为 Redis 是一个 key-value 存储系统。支持存储的 value类型很多包括 String(字符串)、List(链表)、Set(集合)、Zset(sorted set --有序集合)和 Hash哈希类型等

1.2 Redis用途

  • 总结内存存储和持久化(RDBAOF)
    • redis支持异步将内存中的数据写到硬盘上同时不影响继续服务
    • 内存的弊端是断电即失所以持久化格外重要

  • Redis 在生产中使用最多的场景就是做数据缓存。即客户端从 DBMS 中查询出的数据首先写入到 Redis 中后续无论哪个客户端再需要访问该数据直接读取 Redis 中的即可不仅减小了 RT而且降低了 DBMS 的压力。
    在这里插入图片描述
  • 根据 Redis 缓存的数据与 DBMS 中数据的同步性划分缓存一般可划分为两类实时同步缓存与阶段性同步缓存
    • 实时同步缓存DBMS 中数据更新后Redis 缓存中的存放的相关数据会被立即清除以促使再有对该数据的访问请求到来时必须先从 DBMS 中查询获取到最新数据然后再写入到 Redis。
    • 阶段性同步缓存Redis 缓存中的数据允许在一段时间内与 DBMS 中的数据不完全一致。而这个时间段就是这个缓存数据的过期时间。

1.3 Redis特性

  1. 多样的数据结构Redis 是一个 key-value 存储系统。支持存储的 value 类型很多包括String(字符串)、List(链表)、Set(集合)、Zset(sorted set --有序集合)和 Hash哈希类型等还有 BitMap、HyperLogLog、Geospatial 类型。
    • BitMap一般用于大数据量的二值性统计。
    • HyperLogLog其是 Hyperlog Log用于对数据量超级庞大的日志做去重统计。
    • Geospatial地理空间其主要用于地理位置相关的计算。
  2. 持久化Redis 内存中的数据可以进行持久化其有两种方式RDB 与 AOF。
  3. 高可用集群Redis 提供了高可用的主从集群功能可以确保系统的安全性。
  4. 强大的功能Redis 提供了数据过期功能、发布/订阅功能、简单事务功能还支持 Lua脚本扩展功能。
  5. 性能极高Redis 读的速度可以达到 11w 次/s写的速度可以达到 8w 次/s。
  6. Redis 源码非常精细集性能与优雅于一身

1.4 Redis的IO模型

  • Redis 客户端提交的各种请求是如何最终被 Redis 处理的
  • Redis 处理客户端请求所采用的处理架构称为 Redis 的 IO 模型。
  • 不同版本的 Redis 采用的 IO 模型是不同的。

1.4.1 单线程模型

  • 对于 Redis 3.0 及其以前版本Redis 的 IO 模型采用的是纯粹的单线程模型。即所有客户端的请求全部由一个线程处理。
    在这里插入图片描述
    • Redis 的单线程模型采用了多路复用技术
  • 补充内容
  • 对于多路复用器的多路选择算法常见的有三种select 模型、poll 模型、epoll 模型。
    • poll 模型的选择算法采用的是轮询算法。该模型对客户端的就绪处理是有延迟的。
    • epoll 模型的选择算法采用的是回调方式。根据就绪事件发生后的处理方式的不同
      又可分为 LT 模型与 ET 模型。
  • 每个客户端若要向 Redis 提交请求都需要与 Redis 建立一个 socket 连接并向事件分发器注册一个事件。一旦该事件发生就表明该连接已经就绪。而一旦连接就绪事件分发器就会感知到然后获取客户端通过该连接发送的请求并将由该事件分发器所绑定的这个唯一的线程来处理。如果该线程还在处理多个任务则将该任务写入到任务队列等待线程处理。
  • 之所以称为事件分发器是因为它会根据不同的就绪事件将任务交由不同的事件处理器去处理。

1.4.2 混合线程模型

  • **从 Redis 4.0 版本开始Redis 中就开始加入了多线程元素。****处理客户端请求的仍是单线程模型但对于一些比较耗时但又不影响对客户端的响应的操作就由后台其它线程来处理。**例如持久化、对 AOF 的 rewrite、对失效连接的清理等。

1.4.3 多线程模型

  • Redis 6.0 版本才是真正意义上的多线程模型因为其对于客户端请求的处理采用的是多线程模型
    在这里插入图片描述
  • 多线程 IO 模型中的“多线程”仅用于接受、解析客户端的请求然后将解析出的请求写入到任务队列。而对具体任务命令的处理仍是由主线程处理。这样做使得用户无需考虑线程安全问题无需考虑事务控制无需考虑像 LPUSH/LPOP 等命令的执行顺序问题。

1.4.4 Redis的IO模型优缺点总结

  1. 单线程模型
    • 优点
      • 可维护性高性能高。不存在并发读写情况所以也就不存在执行顺序的不确定性不存在线程切换开销不存在死锁问题不存在为了数据安全而进行的加锁/解锁开销。
    • 缺点
      • 性能会受到影响且由于单线程只能使用一个处理器处理器的利用率较低。
  2. 多线程模型
    • 优点其结合了多线程与单线程的优点避开了它们的不足
    • 缺点并非是一个真正意义上的“多线程”因为真正处理“任务”的线程仍是单线程。其对性能有些影响

1.5 相关学习网站

1.6 补充【RDBAOF】

  • RDB
    • RDB是Redis的一种数据持久化到磁盘的策略是一种以内存快照形式保存Redis数据的方式。所谓快照就是把某一时刻的状态以文件的形式进行全量备份到磁盘这个快照文件就称为RDB文件其中RDB是Redis DataBase的缩写。
    • AOF 😦 append only file )持久化以独立日志的方式记录每次写命令并在 Redis 重启时在重新执行 AOF 文件中的命令以达到恢复数据的目的。AOF 的主要作用是解决数据持久化的实时性。

三 旧版Redis安装【Window环境】

  1. 下载安装包Redis下载地址
  2. 将下载下来的压缩包解压后放到自定义environment目录下【这里以本人为例当然放在一个规范的目录以保持整洁也是十分重要的】
    在这里插入图片描述
  3. 双击redis-server.exe运行redis
    在这里插入图片描述
  4. 使用客户端连接Redis
    在这里插入图片描述

四 最新版Redis安装【Linux环境】

4.1 GCC安装

  • GCC【(GNU Compiler Collection)GNU 编译器集合】。
  • **Redis 是由 C语言编写的而从官网下载的 Redis 安装包是需要编译后才可安装的所以对其进行编译就必须要使用相关编译器。**对于 C语言的编译器使用最多的是gcc所以首先要安装GCC编译器。
  • 安装gcc编译器命令
    # 这里提供两个安装的命令任选其一即可
    # 命令一
    yum install -y gcc tcl
    # 命令二
    yum -y install gcc gcc-c++
    
  • 演示【作者使用的是命令一】 在这里插入图片描述

4.2 Redis下载和解压

  1. Redis下载地址下载Redis安装文件并将压缩文件上传到/usr目录下
  2. 解压
    • 解压的命令为tar -zxvf redis-7.0.8.tar.gz
    [root@kongyue ~]# cd /usr
    [root@kongyue usr]# tar -zxvf redis-7.0.8.tar.gz 
    

4.3 Redis编译和安装

  1. 编译和安装的命令可以在一块执行【进入到解压目录中然后执行编译命令】
    make && make install 
    
    • 如果想一步步执行也可以请阅读下面的详细过程

  1. 编译过程是根据 Redis 解压包中 Makefile文件进行的所以可以直接进行编译
    在这里插入图片描述
  2. 进入到解压目录中然后执行编译命令 make
    [root@kongyue redis-7.0.8]# make
    
    • 编译成功标志
      在这里插入图片描述
  3. 对于编译过的安装包执行 make install 进行安装
    [root@kongyue redis-7.0.8]# make install
    
    在这里插入图片描述
  4. 查看 /usr/local/bin 目录
    [root@kongyue redis-7.0.8]# ll /usr/local/bin
    总用量 21524
    -rwxr-xr-x. 1 root root  5197776 22 22:08 redis-benchmark
    lrwxrwxrwx. 1 root root       12 22 22:08 redis-check-aof -> redis-server
    lrwxrwxrwx. 1 root root       12 22 22:08 redis-check-rdb -> redis-server
    -rwxr-xr-x. 1 root root  5411112 22 22:08 redis-cli
    lrwxrwxrwx. 1 root root       12 22 22:08 redis-sentinel -> redis-server
    -rwxr-xr-x. 1 root root 11426776 22 22:08 redis-server
    
    • 通过 echo $PATH 可以看到/usr/local/bin 目录是存在于该系统变量中这样这些命令就可以在任意目录中执行
      在这里插入图片描述

五 Redis启动与停止

5.1 前台启动式

  1. 在任意目录执行 redis-server命令即可启动Redis
    • 这种启动方式会占用当前命令行窗口
    [root@kongyue redis-7.0.8]# redis-server 
    
    在这里插入图片描述
  2. 查看启动的进程ps -aux|grep redis 在这里插入图片描述

5.2 停止进程的方式(一)

  • 通过 Ctrl + C 命令可以停止 Redis

5.3 命令后台启动式

nohup redis-server &
  • 使用 nohup redis-server & 命令使要启动的程序在后台以守护进程方式运行。
  • 进程启动后不会占用一个会话窗口且其还会在当前目录即运行启动命令的当前目录中创建一个 nohup.out 文件用于记录 Redis 的操作日志。
    在这里插入图片描述

5.4 停止进程的方式(二)

  • 通过 redis-cli shutdown 命令可以停止 Redis。
redis-cli shutdown

在这里插入图片描述

5.5 配置式启动

  1. 通过修改 Linux 中 Redis 的核心配置文件 redis.conf 达到后台启动的目的。
    • redis.conf 文件在Redis 的安装目录根下
    # 修改配置文件中的daemonize
    [root@kongyue /]# vim /usr/redis-7.0.8/redis.conf
    
    • 将 daemonize 属性值由 no 改为 yes使 Redis 进程以守护进程方式运行
      在这里插入图片描述
    • 修改后再启动 Redis就无需再键入 nohup 与&符了但必须要指定启动所使用的 Redis配置文件
    • 原因
      • 使用 nohup redis-server &命令启动 Redis 时启动项中已经设置好了 Redis 各个参数的默认值Redis 会按照这些设置的参数进行启动。但这些参数是可以在配置文件中进行修改的修改后需要在启动命令中指定要加载的配置文件这样配置文件中的参数值将覆盖原默认值。
      • Redis 已经给我们提供好了配置文件模板是 Redis 安装目录的根目录下的 redis.conf 文件。由于刚刚对 redis.conf 配置文件做了修改所以在开启 Redis 时需要显示指出要加载的配置文件。配置文件应紧跟在 redis-server 的后面。
        在这里插入图片描述
  • 注意要进入Redis目录进行配置否则命令无效

六 客户端链接前的配置

6.0 提示

6.1 配置客户端IP

  • Redis 可以通过修改配置文件redis.conf来限定可以访问自己的客户端 IP
  • 允许所有客户端访问配置方法将客户端IP限制注释掉
    vim /usr/redis-7.0.8/redis.conf
    

在这里插入图片描述

6.2 关闭保护模式

  • 默认保护模式是开启的。其只允许本机的客户端访问即只允许自己访问自己。
  • 但生产中应该关闭以确保其它客户端可以连接 Redis。
  • 通过修改配置文件redis.confprotected-mode的属性为no
    在这里插入图片描述

6.3 设置访问密码

  • 为 Redis 设置访问密码可以对要读/写 Redis 的用户进行身份验证。没有密码的用户可以登录 Redis但无法访问。
    在这里插入图片描述
  • 没有通过密码登录的用户无法读/写 Redis
    [root@kongyue /]# redis-cli
    127.0.0.1:6379> set name yang
    (error) NOAUTH Authentication required.
    127.0.0.1:6379> get name
    (error) NOAUTH Authentication required.
    
  • 对于密码的使用有两种方式
    • 登录时未使用密码则访问时先输入密码
    127.0.0.1:6379> auth 111
    OK
    127.0.0.1:6379> set name yang
    OK
    127.0.0.1:6379> get name
    "yang"
    
    • 登录时直接使用密码登录访问时无需再输入密码
    redis-cli -a 111
    
    • 退出时使用密码
    [root@kongyue redis-7.0.8]# redis-cli -a 111 shutdown
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    

6.4 禁止/重命名命令

  • flushal 与 flushdb都是用于直接删除整个 Redis数据库的
  • 若让用户可以随便使用它们可能会危及数据安全。Redis 可以通过修改配置文件来禁止使用这些命令或重命名这些命令。
  • 以下配置禁用了 flushallflushdb 命令
  • 在学习过程中暂时不禁用它们
    在这里插入图片描述

七 客户端

  • 记得先启动redis服务

7.1 命令行客户端

  • Redis 提供了基本的命令行客户端。
  • 打开命令行客户端的命令为 redis-cli
    • -h指定要连接的 Redis 服务器的 IP。
    • -p指定要连接的 Redis 的端口号。
      在这里插入图片描述
  • 若连接的是本机 Redis且端口号没有改变保持默认的 6379则-h 与-p 选项可以省略不写

7.2 图形界面客户端

7.2.1 RESP【推荐】

7.2.2 Resp链接失败问题的解决【开放Redis默认端口】

在这里插入图片描述

  1. 执行命令 查看端口状态

    firewall-cmd --query-port=6379/tcp
    
    [root@kongyue redis-7.0.8]# firewall-cmd --query-port=6379/tcp
    no
    
    • 目前Linux的6379端口为关闭状态
  2. 开放6379端口

    firewall-cmd --zone=public --add-port=6379/tcp --permanent
    
    [root@kongyue redis-7.0.8]# firewall-cmd --zone=public --add-port=6379/tcp --permanent
    success
    
  3. 永久打开端口

    firewall-cmd --reload
    
    [root@kongyue redis-7.0.8]# firewall-cmd --reload
    success
    
  4. 再执行命令,查看端口状态端口状态为yes说明成功

    firewall-cmd --query-port=6379/tcp
    
    [root@kongyue redis-7.0.8]# firewall-cmd --query-port=6379/tcp
    yes
    
  5. 重启虚拟机

    reboot
    
  6. 启动redis服务

    • 注意在redis目录下进行执行
    redis-server redis.conf
    

在这里插入图片描述

7.2.3 RedisPlus

  • RedisPlus 是为 Redis 可视化管理开发的一款开源免费的桌面客户端软件支持 Windows 、Linux、Mac 三大系统平台RedisPlus 提供更加高效、方便、快捷的使用体验有着更加现代化的用户界面风格。
  • RedisPlus 下载地址

7.2.4 Java 代码客户端

  • Java 代码客户端就是一套操作 Redis 的 API其作用就像 JDBC 一样所以 Java 代码客户端其实就是一个或多个 Jar 包提供了对 Redis 的操作接口。
  • 对 Redis 操作的 API 很多例如 jdbc-redis、jredis 等但最常用也是最有名的是 Jedis。
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: redis