文章标题:
Redis:关键功能与多元应用场景
文章内容:


从本篇起正式开启对 Redis
的介绍与研习。
🔥 初识 Redis
在展开 Redis
的学习之前,有必要先对其进行认识。
Redis
的设计目标是将其当作数据库、缓存或是消息中间件等,其核心目的在于能够在内存中进行数据的存储。
那此时就会产生一个疑问,既然已经有像 MySQL 这样的数据库了,为何还需要 Redis 呢?
🦋 Redis 与 MySQL
不可否认,MySQL 是一款很不错的数据库软件,但其最大弊病在于访问速度较为迟缓,这是相较于内存存储而言的,因为 MySQL 本质上是存储在磁盘上的,而使用 Redis 作为数据库,必然会比磁盘存储快上许多,毕竟它是基于内存的。
但 Redis 就一定比 MySQL 更具优势吗?显然并非如此,Redis 相较于 MySQL 的最大劣势在于其存储空间有限,这是一个严峻的问题,意味着虽然有诸多需要高性能的场景,但毕竟是少数,大多数业务其实并不需要极高的性能。
那有没有一个好的方案能综合 Redis 和 MySQL 的优势呢?答案是将二者结合使用,也就是我们常说的二八原则。
🦋 二八原则
所谓二八原则,指的是 20% 的热点数据能够满足 80% 数据的需求,所以一个较好的解决方案是,把 MySQL 中常用的数据缓存到Redis
里,如此一来,大部分请求都能从缓存中获取数据,而不常用的数据则到对应的磁盘中读取,这是一个不错的解决方案。
🦋 Redis 的应用场景
Redis
是在分布式系统中运行的,唯有在这样的环境下才能充分发挥其作用,倘若只是单机程序,从本质上讲,用变量存储数据或许是更优的选择,此时甚至比使用 Redis 更为划算。
我们在学习操作系统时了解到,进程通信不能直接访问数据,因为进程之间存在数据隔离,而有一种进程通信是借助网络进行的,所以 Redis 从本质上来说能够将自身内存中的变量提供给其他进程,甚至可以被其他主机的进程访问,这就是 Redis 的一个应用场景。
🦋 Redis 的设计理念
Redis 设计的初衷是将其当作消息中间件来使用,也就是消息队列,以便在分布式系统下采用生产者消费者模型,但遗憾的是,如今这样的使用场景较少,已有更为专业的消息中间件取代了 Redis 的该功能,但 Redis 依旧是应用广泛的中间件。
🔥 Redis 的特性与优势
Redis 是一种内存数据存储中间件,接下来分析它作为数据库、数据缓存在分布式系统中的工作方式及能力。
🦋 内存存储数据
MySQL 主要通过表的方式组织存储数据,属于关系型数据库,而 Redis 更多地采用键值对的方式组织存储数据,属于非关系型数据库,是内存数据存储。
🦋 编程能力
对 Redis 的操作可以通过简单的交互式命令进行,也能通过脚本批量执行操作或加入逻辑,更重要的是,可使用 Lua 脚本语言进行编写。
🦋 扩展能力
Redis 提供了一组原生 API,借助它能够进行扩展,例如可用 C、C++ 或 Rust 编写扩展,本质上是动态链接库。
🦋 持久化
Redis 的数据存储在内存中,然而内存存在易丢失的弊端,进程退出或系统重启时会丢失信息,为解决此问题,Redis 会将数据在硬盘上存储一份,以内存为主、硬盘为辅,硬盘中的数据相当于对 Redis 内存数据的备份,Redis 重启时会加载硬盘中的备份数据,使内存恢复到重启前的状态。
🦋 支持集群
作为分布式系统的中间件,Redis 的另一重要能力是支持集群,意味着可以进行水平扩展,也就是支持分表分库类似操作。
本质上,这是因为 Redis 能存储的数据有限,过多数据无法存于一个 Redis 中,于是有了集群概念,可引入多台主机部署多个 Redis 节点,每个节点存储部分数据。
🦋 高可用
Redis 自身支持主从结构,从属节点是主节点的备份,这意味着主节点出现问题时,可由从属节点替换主节点,保证程序正常运行。
🦋 速度快
这是 Redis 的一大特点。
为何速度快?
- Redis 数据存储在内存中,相比磁盘数据库,速度快很多。
- Redis 的核心功能较为简单,属于基础项目逻辑,核心功能基于操作内存的数据结构,无需像 MySQL 那样调用复杂接口和进行条件判断。
- 从网络角度看,Redis 使用 IO 多路复用方式,能提高效率。
- 从线程模型来讲,虽高版本 Redis 引入多线程操作,但单线程模型可减少线程间不必要的竞争开销。
- Redis 用 C 语言开发,这也可算作其速度快的一个缘由。
🔥 Redis 的应用场景
下面介绍 Redis 的一些应用场景。
🦋 Redis 充当数据库
多数情况下,考虑数据存储优先考虑容量,但在极端场景下,也有对速度要求高的情况。
比如在一些搜索引擎项目中,对搜索性能要求极高,从数据库读取效率低,不能使用 MySQL,所以需将要检索的数据存储在内存中,借助 Redis 这样的内存级数据库来实现。
当然这需要硬件资源支持。Redis 存储的是全量数据,不可丢弃。
🦋 Redis 作为缓存
MySQL 存储数据的优点是内存大,但缺点是慢,基于二八原则,可将热点数据从 MySQL 取出存储到 Redis 中,Redis 提供缓存功能,其存储的是部分数据,全量数据仍以 MySQL 为主,即便 Redis 数据丢失,也可从 MySQL 中获取,这与作为数据库的情况不同,作为数据库是对硬盘级数据库内容的备份。
🦋 Redis 作为会话存储
在 HTTP 学习中知其为无状态协议,引入 cookie 解决,cookie 可保存用户身份信息,服务器端存储用户数据即 session。
假设浏览器登录,服务端用负载均衡模式,服务器如何识别 cookie?有两种解决方式:
1. 让负载均衡器将同一用户请求始终分配到一台机器,如用 ID 取模分配机器。
2. 将会话数据单独存储在一台或多台独立机器上,这就是 Redis,应用程序重启时会话不会丢失。
🦋 Redis 作为消息队列
Redis 作为消息队列的场景较少,尽管其设计初衷是消息队列支持生产者消费者模型,但实际应用中不多。
🦋 总结
Redis 是一种内存数据存储中间件,通常可作为内存级数据库、缓存或消息队列使用,更关键的是,Redis 速度很快。
🔥 共勉
😋 以上便是我对 Redis:功能特性和应用场景
的理解,觉得本文对你有帮助的,可点赞收藏关注支持呀~ 😉