Linux 系统安装 Redis7 —— 超详细操作演示!

内存数据库 Redis7

    • [一、Redis 概述](#一、Redis 概述)
      • [1.1 Redis 简介](#1.1 Redis 简介)
      • [1.2 Redis 的用途](#1.2 Redis 的用途)
      • [1.3 Redis 特性](#1.3 Redis 特性)
      • [1.4 Redis 的IO模型](#1.4 Redis 的IO模型)
    • [二、Redis 的安装与配置](#二、Redis 的安装与配置)
      • [2.1 Redis 的安装](#2.1 Redis 的安装)
      • [2.2 连接前的配置](#2.2 连接前的配置)
      • [2.3 Redis 客户端分类](#2.3 Redis 客户端分类)
      • [2.4 Redis 配置文件详解](#2.4 Redis 配置文件详解)
    • [三、Redis 命令](#三、Redis 命令)
    • [四、Redis 持久化](#四、Redis 持久化)
    • [五、Redis 主从集群](#五、Redis 主从集群)
    • [六、Redis 分布式系统](#六、Redis 分布式系统)
    • [七、Redis 缓存](#七、Redis 缓存)
    • 八、Lua脚本详解
    • 九、分布式锁

一、Redis 概述

1.1 Redis 简介

Redis Remote Dictionary Server ,远程字典服务 , 由意大利人 Salvatore Sanfilippo (又名 Antirez 开发, 是一个使用 ANSI C 语言 编写、支持网络、可基于 内存 亦可 持久化日志型NoSQL 开源内存数据库 ,其提供多种语言的 API 。从 2010 年 3 月 15 日起, Redis 的开发工作由 VMware 主持。从2013 年 5 月开始, Redis 的开发由 Pivotal 赞助。

2008 年时 Salvatore Sanfilippo 自己开发一个叫 LLOOGG 的网站。

Redis 之所以称之为 字典服务 ,是因为 Redis 是一个 key-value 存储系统 。支持存储的 value 类型 有很多,包括 String(字符串) 、 List(链表) 、 Set(集合) 、 Zset(sorted set 有序集合) 和 Hash(哈希类型) 等 。

Redis 的国际知名用户有, Twitter 、 GitHub 、 Facebook 等,国内知名用户有,阿里巴巴、腾讯、百度、搜狐、优酷、美团、小米等。熟练使用和运维 Redis 已经成为开发运维人员的一个必备技能。

⭐️ NoSQL

  • NoSQL ("non relational", "Not Only SQL"),泛指 非关系型的数据库 。随着互联网 web2.0网站的兴起,传统的关系数据库在处理 web2.0 网站,特别是 超大规模 和 高并发 的 SNS (社交) 类型的 web2. 0 纯动态网站 已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。 NoSQL 数据库的产生就是为了解决 大规模数据集合 多重数据种类 带来的挑战,特别是大数据应用难题。

(1) 键值存储数据库

  • 就像 Map 一样的 key-value 对。典型代表就是 Redis

(2) 列存储数据库

  • 关系型数据库 是典型的 行存储数据库
    • 其存在的问题是,按行存储的数据在 物理层面 占用的是 连续存储空间 ,不适合海量数据存储
  • 而按 列存储 则可实现 分布式存储 ,适合海量存储 。典型代表是 HBase

(3) 文档型数据库

  • 其是 NoSQL关系型数据 的结合,最像关系型数据库 的 NoSQL 。典型代表是MongoDB
    • 该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如 JSON

(4) 图形(Graph)数据库

  • 用于存放一个 节点关系 的数据库,例如描述不同人间的关系。典型代表是Neo4J

1.2 Redis 的用途

Redis 在生产中使用最多的场景就是 做数据缓存 。即客户端从 DBMS 中查询出的数据首先写入到 Redis 中,后续无论哪个客户端再需要访问该数据,直接读取 Redis 中的即可,不仅减小了 RT ,而且降低了 DBMS 的压力。

根据 Redis 缓存的数据与 DBMS 中数据的同步性划分,缓存一般可划分为两类: 实时同步缓存 与 阶段性同步缓存 。

  • 实时同步缓存 是指,DBMS 中 数据更新 后, Redis 缓存中的存放的相关数据会被 立即清除,以促使再有对该数据的访问请求到来时,必须先从 DBMS 中查询获取到最新数据,然后再写入到 Redis 。
  • 阶段性同步缓存 是指,Redis 缓存中的数据允许在一段时间 (生存时长) 内与 DBMS 中的数据不完全一致。而这个时间段就是这个缓存数据的 过期时间

1.3 Redis 特性

能够做缓存的技术中间件 很多,例如,MyBatis 自带的二级缓存Memched 等。只所以在生产中做缓存的产品几乎无一例外的会选择 Redis ,是因为它有很多其它产品所不具备的特性。

  • 性能极高: Redis 读的速度可以达到 11w次/s ,写的速度可以达到 8w次/s 。只所以具有这么高的性能,因为以下几点原因:
    *
    1. Redis 的所有操作都是在内存中发生的。
      1. Redis 是用 C 语言 开发的。
      1. Redis 源码非常精细 (集性能与优雅于一身)。
  • 简单稳定 : Redis 源码很少。早期版本只有 2w 行左右。从 3.0 版本开始,增加了集群功能,代码变为了 5w 行左右。
  • 持久化: Redis 内存中的数据可以进行持久化,其有两种方式: RDBAOF
  • 高可用集群: Redis 提供了高可用的主从集群功能,可以确保系统的安全性。
  • 丰富的数据类型: Redis 是一个 key-value 存储系统 。支持存储的 value 类型很多,包括 String(字符串) 、 List(链表) 、 Set(集合) 、 Zset(sorted set 有序集合) 和 Hash (哈希类型)等,还有 BitMapHyperLogLogGeospatial 类型。
    • BitMap :一般用于 大数据量二值性统计
    • HyperLogLog :其是 Hyperlog Log ,用于对数据量超级庞大日志去重统计
    • Geospatial :地理空间,其主要用于地理位置相关的计算
  • 强大的功能: Redis 提供了数据过期 功能、发布/订阅 功能、简单事务 功能,还支持 Lua 脚本扩展功能。
  • 客户端语言广泛: Redis 提供了简单的 TCP 通信协议,编程语言可以方便地的接入 Redis 。所以,有很多的开源社区、大公司等开发出了很多语言的 Redis 客户端。
  • 支持 ACL 权限控制: 之前的权限控制非常笨拙。从 Redis6 开始引入了 ACL 模块,可以为不同用户定制不同的用户权限

ACL ,Access Control List ,访问控制列表,是一种 细粒度 的权限管理 策略,可以针对 任意用户与组 进行权限控制

  • 目前大多数 Unix 系统与 Linux 2.6 版本已经支持 ACL 了。
  • Zookeeper 早已支持 ACL 了。
  • Unix与 Linux 系统默认使用是 UGO (U ser 、G roup 、O ther) 权限控制策略 ,其是一种 粗粒度 的权限管理策略。
  • 支持多线程 IO 模型: Redis 之前版本采用的是单线程模型 ,从 6.0 版本开始 支持 了多线程模型

1.4 Redis 的IO模型

Redis 客户端提交的各种请求是如何最终被 Redis 处理的?

  • Redis 处理客户端请求所采用的 处理架构 ,称为 Redis 的 IO 模型
  • 不同版本的 Redis 采用的 IO 模型 是不同的。

⭐️ 1)、单线程模型

  • 对于 Redis 3.0 及其以前版本, Redis 的 IO 模型采用的是 纯粹的单线程模型 。即所有客户端的请求全部由一个线程处理。
  • Redis 的单线程模型采用了 多路复用技术

对于多路复用器 的 多路复用技术 常见的有三种: select 模型(数组)、 poll 模型(链表)、 epoll 模型。

  • select 模型底层是数组,性能较低,不常见。
  • poll 模型的选择算法:采用的是轮询算法 。该模型对客户端的就绪 处理是 有延迟的 。
  • epoll 模型的选择算法:采用的是回调方式 。 根据就绪事件发生后的处理方式 的不同,又可分为 LT 模型与 ET 模型。
  • 每个客户端 若 要向 Redis 提交请求,都需要与 Redis 建立一个 socket 连接,并向 事件分发器 注册一个事件。一旦该事件发生就表明该连接已经就绪 。而一旦连接就绪 ,事件分发器就会感知到,然后获取客户端通过该连接发送的请求,并将由该事件分发器 所绑定的这个 唯一的线程 来处理。如果该线程还在处理多个任务,则将该任务写入到任务队列等待线程处理。
  • 只所以称为事件分发器 ,是因为它会根据不同的就绪事件,将任务交由不同的事件处理器去处理。

⭐️ 2)、混合线程模型

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

⭐️ 3)、多线程模型

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

⭐️ 4)、优缺点总结 (面试)

(1) 单线程模型

  • 优点 :可维护性高,性能高。不存在 并发读写 情况,所以也就 不存在 执行顺序 的不确定性,不存在 线程切换 开销,不存在 死锁问题 ,不存在 为了数据安全而进行的 加锁/解锁开销
  • 缺点 :性能会受到影响,且由于单线程 只能使用一个处理器(现在都是多处理器),所以会形成 处理器浪费

内存的响应时长(RT): 100 n s 100ns 100ns

Redis 每秒处理的读写请求数量应该可以达到 1 s / 100 n s = 1 0 9 n s / 100 n s = 1 0 7 = 1 k w 1s/100ns = 10^9ns/100ns = 10^7 = 1kw 1s/100ns=109ns/100ns=107=1kw

实际情况是,Redis 每秒可以处理 8 w − 11 w 8w - 11w 8w−11w 的读写请求

(2) 多线程模型

  • 优点 :其结合了 多线程单线程 的优点,避开了它们的所有不足。
  • 缺点 :该模型没有显示不足。如果非要找其不足的话就是,其并非是一个真正意义上的 "多线程" ,因为 真正处理任务的线程 仍是单线程。所以,其对性能也是有些影响的。

二、Redis 的安装与配置

这里是要将 Redis 安装到 Linux 系统中。

我的是 CentOS7,已经关闭防火墙,安装好了jdk,以及常用的命令工具。

2.1 Redis 的安装

⭐️ (2.1.1)、安装前的准备工作

1)、安装 gcc

  • 由于 Redis 是由 C/C++ 语言编写的, 而从官网下载的 Redis 安装包是需要 编译后 才可安装的, 所以对其进行编译就必须要使用相关编译器。对于 C/C++ 语言的编译器,使用最多的是 gccgcc-c++,而这两款编译器在 CentOS 7 中是没有安装的,所以首先要安装这两款编译器。
  • GCC, GNU Compiler Collection, GNU 编译器集合。
shell 复制代码
yum -y install gcc gcc-c++ 

2)、下载 Redis


3)、上传到 Linux

  • 将下载好的压缩包上传到 Linux 的 /opt/tools 目录中 。

⭐️ (2.1.2)、安装 Redis

1)、解压 Redis

  • 将 Redis 解压到 /opt/apps 目录中。
shell 复制代码
tar -zxvf redis-7.2.1.tar.gz -C /opt/apps/
  • 进入到 /opt/apps 目录中 再将 Redis 解压包目录更名为 redis (不更名也无所谓,改名是为了简化目录名)。
shell 复制代码
mv redis-7.2.1/ redis

2)、编译

  • 编译过程是根据 Makefile 文件进行的,而 Redis 解压包中已经存在该文件了。所以可以直接进行编译 了 。
  • 在解压目录下,执行编译命令 make 进行编译。

如果没有准备好C语言编译环境,make 会报错 --- Jemalloc/jemalloc.h:没有那个文件

解决办法:

  • 首先看:gcc 是否安装成功,成功后
  • 运行 make distclean, 将编译文件清除掉,然后再在 redis 目录下再次执行 make 命令(只是编译好)
  • 当看到如下提示时,表示编译成功。

3)、安装

  • 在 Linux 中对于编译过的安装包执行 make install 进行安装。
  • 可以看到,共安装了三个组件: redis 服务器客户端 与 一个性能测试工具 benchmark

4)、查看 bin 目录

  • 安装完成后,打开 /usr/local/bin 目录,可以看到出现了很多的文件。
  • 通过 echo $PATH 可以看到,/usr/local/bin 目录是存在于该 系统变量 中的, 这样这些命令就可以在任意目录中执行了。

⭐️ (2.1.3)、Redis 启动与停止

1)、前台启动

  • 在任意目录执行 redis-server 命令即可启动 Redis 。 这种启动方式会 占用当前命令行窗口
  • 再开启 一个会话窗口,可以查看到当前的 Redis 进程 ,默认端口号为 6379
shell 复制代码
ps aux | grep redis
  • 通过 Ctrl + C 命令可以停止 Redis 。

2)、命令式后台启动

  • 使用 nohup 命令,最后再添加一个 & 符,可以使要启动的程序在后台以守护进程方式运行
shell 复制代码
 nohup redis-server &
  • 这样的好处是,进程启动后不会占用一个会话窗口,且其还会在当前目录,即运行启动命令的当前目录中创建一个 nohup.out 文件用于记录 Redis 的操作日志。

3)、Redis 的停止

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

4)、配置式后台启动

  • 使用 nohup 命令可以使 Redis 后台启动,但每次都要键入 nohup& 符,比较麻烦。
  • 可以通过修改 Linux 中 Redis 的核心配置文件 redis.conf 达到后台启动的目的。
  • redis.conf 文件在 Redis 的安装目录根下。
  • daemonize 属性值由 no 改为 yes ,使 Redis 进程以守护进程方式运行
shell 复制代码
vim redis.conf
:set nu 	#显示行号
/daemonize 	#搜索daemonize

修改后再启动 Redis ,就无需再键入 nohup 与 符 &了,但必须要指定启动所使用的 Redis配置文件。 这是为什么呢?

  • 使用 nohup redis-server & 命令启动 Redis 时,启动项中已经设置好了 Redis 各个参数的默认值, Redis 会按照这些设置的参数进行启动。但这些参数是可以在配置文件中进行修改的,修改后,需要在启动命令中指定要加载的配置文件,这样,配置文件中的参数值将覆盖原默认值。
  • Redis 已经给我们提供好了配置文件模板,是 Redis 安装目录的根目录下的 redis.conf 文件。由于刚刚对 redis.conf 配置文件做了修改,所以在开启 Redis 时需要显示指出要加载的配置文件 。配置文件应紧跟在 redis-server 的后面。
shell 复制代码
redis-server /opt/apps/redis/redis.conf

ps aux | grep redis

2.2 连接前的配置

  • Redis 是一个内存数据库服务器 ,就像 MySQL 一样,对其操作也需要通过 客户端 进行。
  • 若要使 远程主机上的客户端 能够连接并访问到 服务端 的 Redis ,则服务端首先要做如下配置。

⭐️ (2.2.1)、绑定客户端 IP

  • Redis 可以通过修改配置文件 来限定可以访问自己的 客户端 IP
  • 以上设置后,只允许当前主机访问当前的 Redis ,其它主机均不可访问。 所以,如果不想限定访问的客户端 ,只需要将该行 注释掉 即可。

⭐️ (2.2.2)、关闭保护模式

  • 默认保护模式是开启的。 其只允许本机的客户端访问 , 即只允许自己访问自己。但生产中应该关闭, 以确保其它客户端可以连接 Redis 。
shell 复制代码
#命令模式下输入
:noh 	#去掉搜索出来的黄标

⭐️ (2.2.3)、设置访问密码

  • 为 Redis 设置访问密码,可以对要读 写 Redis 的用户进行身份验证 。没有密码的用户可以登录 Redis ,但无法访问

1)、密码设置

  • 访问密码的设置位置在 redis.conf 配置文件中。默认是被注释掉的,没有密码
  • 没有通过密码登录的用户,无法读/写 Redis

2)、使用密码

  • 对于密码的使用,有两种方式:登录时 未使用密码,则访问时先输入密码;登录时直接使用密码登录,访问时无需再输入密码。
    • A、 登录时未使用密码
    • B、 登录时使用密码
    • C、 退出时使用密码

3)、注意

  • 为了方便后面的学习,我们这里就 不设置访问密码 了,直接将其 注释掉 即可。

⭐️ (2.2.4)、禁止 / 重命名命令

  • 后面要学习两个非常危险的命令:flushalflushdb
    • 它们都是用于直接删除整个 Redis 数据库的。若让用户可以随便使用它们,可能会危及数据安全。
    • Redis 可以通过修改配置文件来禁止使用这些命令,或重命名这些命令。
    • 以下配置 ,禁用了 flushall 与 flushdb 命令。
      当然,在学习过程中暂时不禁用它们。

⭐️ (2.2.5)、启动 Redis

  • 当然,若要使客户端 能够连接 Redis,则必须开启服务端的 Redis 。

2.3 Redis 客户端分类

Redis 客户端 也像 MySQL 客户端一样有多种类型:命令行客户端、图形界面客户端、 Java代码客户端。

⭐️ (2.3.1)、命令行客户端

  • Redis 提供了基本的命令行客户端。打开命令行客户端的命令为 redis-cli
  • -h :指定要连接的 Redis 服务器的 IP
  • -p :指定要连接的 Redis 的 端口号

若连接的是本机Redis ,且端口号没有改变 ,保持默认的 6379 ,则 -h-p 选项可以省略不写。

⭐️ (2.3.2)、图形界面客户端

1)、Redis Desktop Manager

  • Redis 的图形界面客户端很多, 其中较出名的是 Redis Desktop Manager 的客户端。 不过,该软件原来是免费软件, 从 0.8.8 版本 后变为了商业化收费软件。
  • 官网为: https://resp.app/(原来是 http://redisdesktop.com )。

2)、RedisPlus

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

百度网盘链接:https://pan.baidu.com/s/1xnmm4TMuNd8eqslJ0rRm9A?pwd=e316

提取码:e316

⭐️ (2.3.3)、Java 代码客户端

  • 所谓 Java 代码客户端就是一套操作 Redis 的 API ,其作用就像 JDBC 一样,所以 Java 代码客户端其实就是一个或多个 Jar 包,提供了对 Redis 的操作接口。
  • 对 Redis 操作的 API 很多 ,例如 jdbc-redisjredis 等 ,但最常用也是最有名的是 Jedis

2.4 Redis 配置文件详解

  • Redis 的核心配置文件 redis.conf 在安装根目录下,默认包含 2000 多行。 这些内容根据功能被划分为了很多部分。下面将一些重要部分进行介绍。

⭐️ (2.4.1)、基础说明

⭐️ (2.4.2)、includes

⭐️ (2.4.3)、modules

⭐️ (2.4.4)、network

⭐️ (2.4.5)、general

⭐️ (2.4.6)、security

⭐️ (2.4.7)、clients

⭐️ (2.4.8)、memory management

⭐️ (2.4.9)、threaded I/O

三、Redis 命令

四、Redis 持久化

五、Redis 主从集群

六、Redis 分布式系统

七、Redis 缓存

八、Lua脚本详解

九、分布式锁

相关推荐
struggle20256 分钟前
Trinity三位一体开源程序是可解释的 AI 分析工具和 3D 可视化
数据库·人工智能·学习·3d·开源·自动化
laimaxgg39 分钟前
Dockerfile
linux·运维·服务器·ubuntu·docker
江沉晚呤时39 分钟前
CAP 定理与 BASE 定理在 .NET Core 中的应用
java·服务器·开发语言·前端·.netcore
GalaxyPokemon1 小时前
LINUX基础 [四] - Linux工具
linux·运维
与passion共存1 小时前
Linux系统下Docker安装
linux·docker
曼岛_1 小时前
若依框架前后端分离版部署全流程详解(本地+服务器+高级配置)
运维·服务器·框架搭建
敲敲敲-敲代码2 小时前
【数据库系统概论】第3章 SQL(四)视图(超详细)
数据库
易保山2 小时前
MIT6.S081 - Lab7 Locks(锁优化 | 并发安全)
linux·操作系统·c
王闯写bug2 小时前
oracle查询锁表和解锁
数据库·oracle
洛神灬殇2 小时前
【Redis技术进阶之路】「原理分析系列开篇」探索事件驱动枚型与数据特久化原理实现(文件事件驱动执行控制)
redis·后端·架构