目录
前言
一、Redis 的特性(优点)
1. Redis 是在内存中存储数据的
2.可编程性
3.可扩展性
4.持久化
5.支持集群
6.高可用
二、Redis 为什么快?
三、 Redis 使用场景
优势场景
1.将 Redis 当作数据库
2.作为缓存和存储 session 信息
3. 消息队列
劣势场景
四、Redis不能做的事情?
前言
主要是,她是真的快啊!!!
Redis 是一个使用内存存储数据的中间件,一般作为 内存数据库、缓存、消息队列,接下来就具体带你了解一下她的特性以及使用场景,是真的香~
一、Redis 的特性(优点)
1. Redis 是在内存中存储数据的
在内存中存储数据相比于在硬盘中存储数据最大的优点就是 “快” !
并且我们知道, MySQL 主要是通过 “表” 的方式来存储组织数据的 “关系型数据库”,而 Redis 主要是通过 “键值对” 的方式来存储组织数据的 “非关系型数据库” ,Redis 这样处理数据带来的好处就是底层数据操作简单,访问和存储的速度快!
Redis 存储的 key 都是 string 类型,value 则可以是上图中描述的数据结构~
2.可编程性
如何理解可编程性呢?针对 Redis 的操作可以直接通过见到那的交互命令进行操作,也可以通过一些脚本的方式(比如说 lua "读作:撸啊" 这个编程语言来实现),批量执行一些操作(可以带有一些逻辑)。
3.可扩展性
可扩展性也就是说可以在 Redis 原有的功能基础上通过 C、C++、Rust 这些语言编写 Redis 扩展(本质上就是动态链接库,也就是 windows 上的 .dll ,可以让 .exe 去调用里面很多的代码,Linux 上的动态库是 .so 虽然和 .dll 格式不同,但本质是一样的),比如 Redis 自身已经提供了很多数据结构和命令,通过扩展让 Redis 支持更多的数据结构和更多的命令~
4.持久化
如果单纯的再内存中存储数据是很容易丢失的(进程退出/系统重启),因此 Redis 可以把数据存储字硬盘上(内存为主、硬盘为辅),硬盘相当于是对数据备份了一下,如果 Redis 重启了,就会再重启时加载硬盘中备份的数据,加载到内存中,使数据恢复如初~
5.支持集群
Redis 作为一个分布式系统中间件,能够支持集群式很关键的, 上图中提到的 Horizontal 就是它具有水平扩展能力,类似于 “分库分表”。
具体的,一个 Redis 能存储的数据是有限的(内存空间有限)引入多个主机,部署多个 Redis 结点,每个 Redis 存储数据的一部分。
6.高可用
Redis 是支持 “主从” 结构的,从节点相当于对主节点的备份,这样即使哪一个 Redis 主结点挂了也不至于整体瘫痪,可以将从节点提升为主节点,因而更快的修复~
二、Redis 为什么快?
- Redis 数据在内存中,就比访问硬盘的数据库要快很多.
- Redis 核心功能都是一些比较简单的逻辑,都是简单的操作内存中的数据结构.
- Redis 从网路角度上,使用了 IO 多路复用的方式(epoll),也就是使用一个线程管理多个 socket.
- Redis 使用的是单线程模型(更高的版本使用的多线程),这样的单线程模型,减少了不必要的线程之间竞争的开销(线程并不是越多越好,多线程提高效率的前提是,CPU 密集型任务,使用多个线程可以充分利用 CPU 多核资源,当你的 CPU 吃满了,再多的线程来了不但浪费,而且还会提高加锁竞争的概率,大大降低效率)。
- 网上还有一种说法是 Redis 是使用 C 语言开发,所以快。这点我个人不是很认可,因为 MySQL 也是同样也是 C 语言开发的,凭什么 Redis 就更快呢?
三、 Redis 使用场景
优势场景
1.将 Redis 当作数据库
虽然大多数情况下数据的存储有限考虑到是 “大”,但是仍然有些场景考虑的是 “快”,“快”的这些场景就需要使用 redis 作为数据库来进行存储了~
2.作为缓存和存储 session 信息
作为缓存,使用 “二八原则”,也就是说,使用 MySQL 用来存储全量数据,把热点数据提取出来存储在 redis 上,这样不仅充分利用了两者的优点,还使得 redis 一旦宕机数据丢失,还可以从 mysql 这边再加载回来.
作为 session 信息存储的仓库,是因为我们之前 session 信息是存储在应用服务器上的,而对于有多个应用服务器的分布式系统来说就存在一个问题,当用户再次发起登录请求时,负载均衡该去哪个应用服务器上寻找 session 信息?如下图:
解决办法有以下两种:
1.想办法让负载均衡器把同一个用户的请求始终打到同一个机器上(通过 userid 的方式来分配),但存在一个问题就是应用程序一旦重启,会话就会丢失.
2.把会话单独拎出来,放在一独立的机器 Redis 上来存储,即使应用程序重启了,会话也不丢失,如下图
3. 消息队列
基于这个就可以实现一个网络版的 生产者 消费者 模型~
对于分布式系统来说,服务器和服务器之间,有时也需要使用生产者和消费者模型,因为他是针对香,有以下两个优势:
- 1.解耦合
- 2.削峰填谷
但是业界也有很多知名中间件,提供了更强劲的消息队列: RabbitMQ、Kafka...... 那为什么还要使用 Redis 的消息队列呢?
如果当前场景中,对于消息队列的功能依赖不是很多,但又不想引入额外的依赖了, redis 可以作为一个选择~
劣势场景
咱么说 redis 快,是相对于 mysql 这种关系型数据库的,但是相比较于在直接在内存中操作变量(例如创建一个变量并赋值)相比就要慢很多了,因为 redis 是先通过网络,再操作内存.
例如场景:存储用户访问量,点赞数量,那么是使用 redis 来存,还是直接在内存中创建一个 hashmap 来存呢?
对于上述场景,是否需要使用 redis 是要根据实际的需求来确定的:
- 劣势:引入 redis 的缺点就是会更慢 .
- 优势:1.有了 redis 之后,就可以把数据单独存储,后续应用服务器重启也不会影响到数据内容。2.未来要扩展成分布式系统,使用 redis 自然是更好的~
四、Redis不能做的事情?
存储大规模的数据~
实际的开发中,我们还是主要以 MySQL 为主(存储全量数据), Redis 为辅的(存储热点数据,例如 session 信息)~