目录
Redis 的介绍
Redis 用作缓存和存储 session 信息
Redis 用作数据库
消息队列
消息队列是什么?
Redis 用作消息队列
Redis 的介绍
特点:
- 内存中存储数据:奠定了 Redis 进行访问和存储时的快
- 可编程性:支持使用 Lua 编写脚本,这些脚本可以在 Redis 服务器端执行。通过脚本,可以实现复杂的数据操作和逻辑,比如批量操作、事务、原子性操作等
- 可扩展性:Redis 原有的功能基础上通过 C、C++、Rust 这些语言编写 Redis 扩展,Redis自身已经提供很多数据结构和命令,可通过扩展让 Redis 支持更多数据结构和命令
- 持久化:在内存中存储数据可能因为进程退出或系统重启导致数据的丢失,但Redis以内存为主、硬盘为辅,硬盘对数据进行备份,Redis 重启则会重新加载硬盘中备份数据到内存上,从而保证持久化
- 支持集群:Redis 提供了一种分布式架构,允许将数据分布在多个节点上,以实现数据的水平扩展和高可用性。一个 Redis 的所能存储的数据空间是有限的,引入多个主机,部署多个 Redis 节点,对数据进行分散存储,扩大存储空间
- 高可用性:Redis 支持主从结构,从节点相当于主节点的备份,当哪一个节点故障时,Redis 集群可以自动进行故障转移,将一个从节点提升为新的主节点,以保持服务的可用性。故障转移过程中,集群会重新分配数据槽,并重新配置主从关系
基本解释:
相较于单机程序直接通过变量在内存中存储数据,当我们想在分布式系统中让多个服务器共享同一份数据又想让数据存储在内存中,Redis 便是一个很好的选择!
具体解释:
进程具有隔离性,每个进程都是被隔离开的,进程 A 无法直接读进程 B 中的数据,但一个分布式系统往往会涉及到多个进程,且这多个进程都分布在不同的主机上,那么当我们想访问其他进程中的变量,这是十分困难的。而 Redis 则针对我们上述的需求点进行了一个封装。网络作为进程间的通信关键介质,Redis 就是基于网络可以把自己内存中的变量给别的进程,甚至别的主机的进程进行使用!
设计初心:
Redis 最初就是用来作为一个“消息中间件”(消息队列)来使用的,分布式系统下的生产者消费者模型,但很少会使用 Redis 来作为消息中间件,因为业界有更多专业的消息中间件进行使用!当前 Redis 主要还是被用作数据库和缓存!
Redis 用作缓存和存储 session 信息
在 Web 应用程序中,session 用于跟踪和存储用户的会话状态信息!
传统做法:
- 将 session 信息存储在应用程序的内存中,但是当进行分布式部署应用程序时便会存在问题,当用户再次发起登录请求时,负载均衡器应该去哪台服务器上寻找用户之前登录的 session 信息
- 当然我们可用通过 userId 来进行服务器的分配,每个 userId 绑定一个服务器,从而该用户的所有请求将访问同一台服务器,。但是一旦程序重启,便会丢失会话!
Redis 缓存做法:
- 将所有 session 会话都存储到 Redis 上,让所有服务器从 Redis 中拿去相应的 session 信息,同时即使程序重启,由于 Redis 的持久性,会话也不会消失!
Redis 用作数据库
基本点:
- 因为 Redis 是在内存中进行存储,所以其访问速度十分的快,相较于 MySQL 是在硬盘中进行存储,其访问速度是十分慢的。从而当在一些对性能要求很高的互联网产品中,Redis 也能被当作数据库进行使用!
- Redis 与 MySQL 相比 其最大的劣势为存储空间有限,从而对于一些性能要求不高且需要较多存储空间的互联网产品,MySQL 还是作为首要选择!
- 当然我们也可以将 Redis 和 MySQL 结合起来使用,从而达到存储空间又大且访问速度又快的需求。‘ 二八原则 ’ ——> 20% 的热点数据能满足 80% 的访问需求。从而我们可以将热点数据放到 Redis 中进行存储,以满足我们大部分的访问需求!但是我们还得承担相应的代价,其一是系统的复杂程度大大提高!,其二是当数据发生修改,还涉及到 Redis 和 MySQL 之间的数据同步问题!可利用该点将 Redis 用作缓存!
场景模拟:
存储用户访问量、点赞数量,我们选择使用 Redis 进行存储还是直接在内存中创建一个 Hashmap 存储呢?
- 引入 Redis 进行存储会更慢,因为 redis 的存储 先通过网络再操作内存,而变量可直接在内存操作
- 引入 Redis 可以保持数据持久化,同时也利于扩展为分布式系统
总结:
我们可以根据互联网产品具体的情况进行分析和取舍,权衡利弊选择一个合适的存储方式!
消息队列
消息队列是什么?
基本解释:
- 消息队列是一种通信模式,用于应用程序和系统组件之间传递消息,其提供了一种可靠的、异步的通信机制,使得不同的应用程序或系统之间能够解耦、可靠地交换数据
特点:
- 异步通信:发送者和接收者之间是异步的,发送者不需要等待接收者处理消息即可执行后续操作
- 解耦:发送者和接收者之间通过消息队列进行通信,互不直接依赖或了解对方存在,这种解耦使得系统组件能够独立地进行扩展
- 可靠性:消息队列通常提供持久化机制,确保消息在接收过程中不会丢失,即使接收者当前不可用,消息也会在其重新上线后被接收
- 削峰填谷:消息队列能够平衡系统的负载,当消息发送过快,队列可以缓冲消息并按照接收者的处理能力进行消费,从而防止系统过载
- 顺序保证:有些消息队列支持按照特定的顺序发送和接收消息,确保消息按照发送的顺序被接收和处理
应用场景:
- 分布式系统
- 微服务框架
- 异步处理
- 任务调度
- 日志处理
- 事件驱动系统
Redis 用作消息队列
- Redis由于其高性能和支持丰富的数据结构,它也被广泛用于构建轻量级的消息队列系统
利用方式:
- 列表诗句结构:Redis 的列表(List)数据结构非常适合实现简单的消息队列。通过将消息作为元素插入到列表的头部或尾部,并使用 rpush(从尾部插入)和 lpop(从头部弹出)等操作,可以实现消息的入队和出队
- 利用发布/订阅功能:Redis 的发布/订阅(Pub/Sub)功能可以用于实现更复杂的消息队列。发布者将消息发布到指定的频道,而订阅者可以订阅感兴趣的频道,以接收相应的消息。这种方式可以支持多个订阅者同时接收消息,并且允许发布者和订阅者之间解耦。但需要注意的是,Redis的发布/订阅功能是一种广播机制,即一个消息会被所有订阅了相应频道的订阅者接收到
总结:
相对于更高级功能和更复杂的消息处理逻辑,需要用到专门的消息队列中间件,如RabbitMQ、Apache Kafka等,这些中间件提供了更丰富的功能和更强大的扩展性,适用于更复杂的消息处理场景!