云计算百科
云计算领域专业知识百科平台

【Redis】背景知识 + 环境搭建

背景知识 + 环境搭建

  • 一. Redis 特性
  • 二. Redis 应用场景
  • 三. 环境搭建
  • 四. Redis 客户端介绍
  • 五. Redis 总结

Redis 是一个在内存中存储数据的中间件,用于作为数据库,用于作为数据缓存,用于作为消息队列,在分布式系统中能够大展拳脚。

一. Redis 特性

  • 在内存中存储数据:
    • MySQL 主要通过 “表” 的方式来存储组织数据的,称为 “关系型数据库”。
    • Redis 主要通过 “键值对” 的方式来存储组织数据的,key 都是 strings,value 可以是 strings、hashes、lists、sets 等,称为 “非关系型数据库”。
  • 可编程的:
    • 针对 Redis 的操作,可以直接通过简单的交互命令进行操作,也可以通过一些脚本 (Lua) 的方式,批量执行一些操作。
  • 扩展能力:
    • 可以在 Redis 原有的功能基础之上再进行扩展,Redis 提供了一组 API (本质上就是动态链接库),通过 C/C++、Rust 语言编写 Redis 扩展。
    • 自己去扩展 Redis 的功能,比如:Redis 自身已经提供了很多的数据结构和命令,通过扩展让 Redis 支持更多的数据结构已经支持更多的命令。
  • 持久化:
    • Redis 是把数据存储在内存上的,但是内存的数据是 “易失” 的,进程退出/系统重启,数据就丢失了。
    • Redis 会把数据存储在硬盘上,内存为主,硬盘为辅,硬盘相当于对内存的数据备份了一下,如果 Redis 重启了,就会在重启的时候加载硬盘中的备份数据,使 Redis 的内存恢复到重启前的状态。
  • 集群:
    • Redis 作为分布式系统中的中间件,能够支持集群的很关键的,水平扩展,类似于 “分库分表”。
    • Redis 能存储的数据是有限的 (内存空间有限),引入多个主机,部署多个 Redis 节点,每个 Redis 存储数据的一部分。
  • 高可用:
    • Redis 自身也是支持 “主从” 结构的,从节点相当于主节点的备份,主节点如果挂了,从节点就开始发挥作用。
  • 速度快:
    • Redis 存储的数据在内存中,就比访问硬盘的数据库要快很多。
    • Redis 核心功能都是比较简单的逻辑,核心功能都是比较简单的操作内存中的数据结构。
    • Redis 从网络角度上,使用的是 IO 多路复用的方式 (epoll),使用一个线程管理很多个 socket
    • Redis 使用的是单线程模型 (虽然更高版本的 Redis 引入了多线程),这样的单线程,减少了不必要的线程之间的竞争开销。多线程提高效率的前提是,CPU 密集型任务,使用多个线程可以充分的利用 CPU 多核资源,但是 Redis 的核心任务,主要就是操作内存的数据结构,不会吃很多的 CPU 资源。
    • Redis 使用的是 C 语言开发的,相较于其他语言效率要快。

二. Redis 应用场景

  • 数据库:
    • 大多数情况下,考虑到数据存储,优先考虑的是 “大”,但是仍然有一些场景,考虑的是 “快”。
    • 搜索引擎:广告搜索 (商业搜索),对于性能的要求是非常高的,搜索系统中没有使用 MySQL 这样的数据库。而是把所有需要检索的数据都存储在内存中,使用的就是类似于 Redis 这样的内存数据库来完成的,在某些场景下,需要对 Redis 进行优化,所以需要研发类似于 Redis 这样的内存数据库。
    • 当然使用这样的数据库,存储大量的数据,需要不少的硬件资源,一般都是一些大厂。
    • Redis 存储的是全量数据,这里的数据是不能够随便丢失的。
  • 缓存:
    • 使用 MySQL 存储数据量大,但是慢,遵循 “二八原则”,把热点数据存储在 Redis 中。
    • Redis 存储的是部分热点数据,全量数据都是以 MySQL 为主的,哪怕 Redis 的数据没了,还可以从 MySQL 中加载回来。
    • 相较于数据库,更多的情况还是用 Redis 来作为缓存。
  • 消息队列:
    • 此处的消息队列,不是 Linux 进程间通信的那个消息队列,而是一个消息队列服务器,基于这个可以实现网络版本的 “生产者消费者模型”。
    • 对于分布式系统来说,服务器和服务器之间,有时候页需要使用要 “生产者消费者模型”,优势:解耦合、削峰填谷。
    • 业界中也存在很多知名的消息队列,例如:RabbitMQ、Kafka、RocketMQ 等等,Redis 也是提供了消息队列的功能,如果当前场景中,对于消息队列的功能依赖不是很多,并且又不想引入额外的依赖,Redis 就可以作为一个选择。

缓存中还存在 session 存储:cookie 实现用户身份的保存,在浏览器中存储了一个用户的身份标识 sessionId,需要存储在应用服务器的 session 配合,服务器这里真正存储了用户数据。

在这里插入图片描述

  • 如果如上图,会话存储在不同的应用服务器中的话,如果一个用户登入时,会话存储在应用服务器1中,那么第二次登入时,会话就可能存储在应用服务器2中,此时需要重新登入,这样用户的体验就不太好。
  • 解决方案:
    • 想办法让负载均衡器,把同一个用户的请求始终打到同一台机器上 (不能用轮询了,而是通过 userId 之类的方式来分配机器,求余数)
    • 把会话数据单独拎出来,放到独立的机器上 (Redis),应用服务器重启后,会话不会丢失,如下图所示:

在这里插入图片描述

Redis 不能做的事情:无法存储大规模的数据。

三. 环境搭建

我们安装 Redis 5.0 版本,原因是 5.0 已经支持了大部分的功能特性,而且相比较于 7.0 版本,更容易进行安装使用。开始学习的时候,现在本机上安装,后面学到 Redis 集群相关的功能的时候,再使用 Docker 安装。

  • 使用 su 命令切换到 root 用户。
  • 使用 apt search redis 命令来搜索 Redis 相关的软件包。
  • 使用 apt install redis 命令来安装 Redis 相关的软件包。
  • 使用 netstat -nlpt | grep redis 查看 Redis 服务器。
  • 在这里插入图片描述

  • 需要手动修改配置文件,修改 ip,绑定 127.0.0.1 的 ip 意味着只能由当前主机上的 Redis 客户端访问 Redis 服务器,跨主机就无法访问,6379 是 Redis 服务器绑定的端口号。
  • 在这里插入图片描述

    在这里插入图片描述

  • 使用 service redis-server restart 命令来重启 Redis 服务器。
  • 使用 service redis-server status 命令来查看 Redis 服务器运行状态。
  • 在这里插入图片描述

  • 使用 redis-cli 命令来用 Redis 自带的客户端来连接 Redis 服务器在,之后使用 ping 命令来查看是否连接成功。
  • 在这里插入图片描述

  • 使用 quit / Ctrl + d 退出 Redis 客户端。
  • 配置文件:很多软件都是有配置文件的,一个很大的软件,里面包含很多的功能,有很多可以定制化的操作,就可以通过配置文件选择开启或关闭设定某些功能。

    四. Redis 客户端介绍

    Redis 与 MySQL 一样,也是一个 客户端-服务器 结构的程序,Redis 客户端与服务端的交互过程如下:

    在这里插入图片描述

    Redis 客户端和服务器可以在同一台主机上,也可以在不同的主机上,Redis 客户端否则发送请求给 Redis 服务器,Redis 服务器负责存储和管理数据,同时执行 Redis 客户端发来的命令,并返回结果给 Redis 客户端。

    Redis 客户端也有很多种形态:

    • Redis 自带的命令行客户端。
      • redis-cli 登入 Redis 客户端。
      • redis-cli -h 127.0.0.1 -p 6379 登入 Redis 客户端。
    • 图形化界面的客户端 (桌面程序,Web 程序)
      • 这样的图形化程序,依赖 Windows 系统,而未来在实际工作中,用来办公的 Windows 系统,连接到服务器肯呢个会有诸多限制,你的 Windows 上的图形化界面客户端能不能连接上服务器的 Redis,是个未知数,和 MySQL 同理,中间可能会经历很多的跳板机、堡垒机、权限校验。
    • 基于 Redis 的 API 自行开发 Redis 客户端 (工作中最主要的形态)
      • 非常类似于 MySQL 的 C 语言 API 开发的 MySQL 客户端。

    五. Redis 总结

    • 我们谈到的 Redis 的速度快,是相对于 MySQL 这样的关系型数据库,但是如果是直接和内存中操作的变量相比,就没有优势了,甚至更慢了!
    • 比如,应用程序中药存储一些数据,用户点赞量,视频 id,点赞个数,通过 “键值对” 的方式存储,用 Redis 存储是先通过网络,再操作内存,而直接在内存中使用 unordered_map 是直接操作内存。
    • 是否要使用 Redis,需要结合业务需求来确定,引入 Redis 的缺点会更慢,但是有了 Redis 之后,就可以把数据单独存储,后续应用服务器重启,不会影响到数据内容,未来要扩展成分布式系统,使用 Redis 是更佳的。
    • 是否引入一个技术,一定要想清楚来龙去脉,想清楚能够解决啥问题,引入了啥问题,千万不能无脑使用。
    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 【Redis】背景知识 + 环境搭建
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!