🔥博客主页:fly in the sky - CSDN博客
🚀欢迎各位:点赞👍+收藏⭐️+留言✍️🚀🎆慢品人间烟火色,闲观万事岁月长🎆
📖希望我写的博客对你有所帮助,如有不足,请指正📖✍️
文章目录
- Redis 官网页面
- Redis 的简介
- 分布式系统
- 分布式的架构演进
- 常见概念
- Redis 的特性
- 1. In-memory data structures
- 2. Programmability
- 3. Extensibility
- 4. Persistence
- 5. Clustering
- 6. High availability
- Redis 最大的特性:快
- Redis 的应用
- 把 redis 当做了数据库
- 缓存和会话存储
- 消息队列
- Redis 客户端
- 客户端-服务器结构
- Redis 客户端的多种形态
Redis 官网页面
Redis官网链接
Redis 的简介
Redis 是一个在内存中存储数据的中间件
一方面用于作为数据库,另一方面用于作为数据缓存,适用于分布式系统中
Redis 基于网络,进行进程间通信,把自己内存中的变量给别的进程,甚至别的主机的进程进行使用
Redis 的初心: 是用来作为一个 “消息中间件” (消息队列)的,用于分布式系统下的生产者消费者模型,不过当前很少会直接使用 Redis 作为消息中间件了
Redis 通常和 MySQL 结合起来使用
MySQL 最大的问题在于,访问速度比较慢,很多互联网产品中,对于性能要求是很高;
Redis 可以作为数据库使用,最大的特点就是访问速度快!但是和 MySQL 相比,最大的劣势,就是存储空间有限;
通常情况下,最优的选择就是Redis 和 MySQL 的结合使用,当然还是要看使用场景的。
具体的使用原则采用“二八原则”:20%的热点数据,满足80%的访问需求
分布式系统
引入多个主机/服务器,协同配合完成一系列的工作
如 Web 服务器与数据库分别⼯作在不同的服务器上,或者多台 Web 服务器被分别部署在不同服务器上。
注:这里多个主机指的是物理上的多个主机
分布式的架构演进
请各位亲们,移步到博主的另一篇博客: docker 的八大技术架构(图解)
常见概念
应⽤(Application)/ 系统(System)
一个应用,就是一 个/组 服务器程序
模块(Module)/ 组件(Component)
—个应目里面有很多个功能,每个独立的功能,就可以称为是一个模块/组件
集群(Cluster)
引入多个主机/服务器,协同配合完成一系列的工作
注:这里的多个主机指的是逻辑上的多个主机
分布式 和 集群的区别:
分布式强调的是物理形态,即⼯作在不同服务器上并且通过⽹络通信配合完成任务;
⽽集群更在意逻辑形态,即是否为了完成特定服务⽬标。
主(Master)/ 从(Slave)
分布式系统中一种比较典型的结构:多个服务器节点,其中一个是主,另外的都是从。
从节点的数据要从主节点这里同步过来
中间件(Middleware)
提供和业务无关的服务的软件,比如:数据库;缓存;消息队列
评价指标(Metric)
- 可用性(Availability): 系统整体可用的时间 / 总的时间
- 响应时长(Response Time RT): 衡量服务器的性能,和具体服务器要做的业务密切相关的,数值越小越好
- 吞吐(Throughput)vs 并发(Concurrent): 衡量系统的处理请求的能力,也是属于衡量性能的一种方式
Redis 的特性
官网核心特性的介绍页面
1. In-memory data structures
在内存中存储数据
MySQL 主要是通过“表"的方式来存储组织数据的,属于"关系型数据库";
Redis 主要是通过“键值对"(key 都是 string, value 则是上述的strings, hashes, lists, sets, sorted sets, streams)
的方式来存储组织数据的,属于"非关系型数据库"
2. Programmability
可编程性
针对Redis的操作,可以直接通过简单的交互式命令进行操作,也可以通过一些脚本的方式,批量执行一些操作(可以带有一些逻辑),在 Redis 主要支持 Lua(“橹啊”)这个编程语言
3. Extensibility
扩展
可以在 Redis 原有的功能基础上再进行扩展,Redis 提供了一组API,可以使用 C,C++,Rust 这几个语言编写 Redis 扩展(本质上是一个动态链接库)
自己去扩展 Redis 的功能,在 Redis 自身已经提供了很多的数据结构和命令下,可以通过扩展,让 Redis支持更多的数据结构以及支持更多的命令
4. Persistence
持久化
Redis 把数据存储在内存上的,由于内存的数据是“易失"的,进程退出/系统重启都会导致内存中的数据消失
解决:Redis 会把数据存储在硬盘上,以内存为主,硬盘为辅(硬盘相当于对内存的数据备份了一下);
如果 Redis 重启了,就会在重启时加载硬盘中的备份数据使 Redis 的内存恢复到重启前的状态
5. Clustering
Horizontal scalability:水平扩展,这个水平扩展,类似于"分库分表";
Redis 作为一个分布式系统中的中间件,能够支持集群是很关键的;
一个 Redis 能存储的数据是有限的(内存空间有限),引入多个主机,部署多个 Redis 节点,每个 Redis 节点存储数据的一部分
6. High availability
高可用 => 冗余/备份
Redis 自身也是支持"主从”结构的,从节点就相当于主节点的备份
Redis 最大的特性:快
快的原因:
1.Redis 数据是在内存中,比访问硬盘的数据库,要快很多
2.Redis 核心功能都是比较简单的逻辑 => 核心功能都是比较简单的操作内存中的数据结构
3.从网络角度上,Redis 使用了 IO 多路复用(epoll)的方式:使用一个线程来管理很多个socket
4.Redis 使用的是单线程模型(虽然更高版本的Redis引入了多线程),这样的单线程模型,减少了不必要的线程之间的竞争开销
Redis 的应用
把 redis 当做了数据库
Real-time data store
Redis’ versatile in-memory data structures enable building data infrastructure for real-time applications that require low latency and high-throughput
大多数情况下,考虑到数据存储,优先考虑的是"大",但是仍然有一些场景,考虑的是"快",比如用于广告搜索/商业搜索的搜索引擎,对性能要求是非常高的,把所有需要检索的数据都存储在内存中,就是使用 Reids 及其类似的这样的内存数据库完成的
缓存和会话存储
Caching & session storage
Redis’ speed makes it ideal for caching database queries, complex computations, API calls, and session state.
Caching
背景:使用 MySQL 数据库存数据,大,慢
解决方法:使用二八原则,把热点数据分出来,存储在 redis 中的
Redis 存部分数据,全量数据的存储以 mysql 为主的,哪怕 Redis 的数据没了,还可以从 mysql 这边再加载回来
session storage
http 协议的 cookie :实现用户身份信息的保存,只是在浏览器这边存储了一个用户的身份标识 sessionld
session: 在服务器中真正的存储的用户数据
消息队列
Streaming & messaging
The stream data type enables high-rate data ingestion, messaging, event sourcing, and notifications.
基于消息队列可以实现一个网络版本的生产者消费者模型
分布式系统来说,服务器和服务器之间,有时候也需要使用到生产者消费者模型的
优势:1.解耦合 2.削峰填谷
如果当前场景中,对于消息队列的功能依赖的不是很多,并且又不想引入额外的依赖了,Redis 可以作为一个选择
Redis 的缺点:不能存储大规模的数据
Redis 客户端
客户端-服务器结构
Redis 同 Mysql 一样,也是一个客户端-服务器结构的程序,结构如下图:
注:Redis 客户端和服务器可以在同一个主机上,也可以在不同主机上
Redis 客户端的多种形态
-
自带的命令行客户端,通过
redis-cli
命令使用(学习中使用)redis-cli -h 127.0.0.1 -p 6379
-
图形化界面的客户端,有的是桌面程序,或者是web程序(不推荐使用)
-
基于 Redis 的 API 自行开发客户端(工作中最常用)