Redis 官方文档
Redis 是由意大利程序员 Salvatore Sanfilippo 开发的,最初是为了提高 LLOOGG.com 网站的性能。现在由 Redis Labs 维护,并得到了社区和企业的广泛支持。
Redis 最显著的特点是:
Redis 是一个非常流行的开源内存数据库(In-memory Data Store) ,它被广泛用于缓存、消息队列、实时数据处理等场景。Redis 的全称是 REmote DIctionary Server ,即远程字典服务器
Redis 是定义变量,即在内存中存储数据,适用于分布式系统,如果是单机程序,直接通过变量存储数据的话比 Redis 更好
Redis VS MySQL
MySQL
确实是一个很不错的数据库软件,但是它最大的问题在于,它的访问速度比较慢,这个慢是相较于在内存当中的,因为 MySQL
本质上是存储在磁盘上的,而如果使用 Redis
作为数据库,必然会比在 磁盘 上要快很多,因为这是在 内存 当中的Redis
就一定比 MySQL
要强吗?这必然也不是的,Redis 和 MySQL 比起来最大的劣势在于,它的存储空间是有限的,这是一个很严重的问题,这就意味着,虽然有很多需要用到高性能的地方,但是终究是少数,大多数的业务其实都不需要用到特别高的性能补充:
那么有什么特别好的方案呢?可以中和一下 Redis 和 MySQL 的优点,并且还能有一个比较好的解决方案?那就是把 Redis 和 MySQL 结合起来进行使用,也就是我们平时所说的 “二八原则”
二八原则(理解)
Redis
当中,这样就能对于大多数的请求都能得到数据,而对于不常用的数据再到对应的磁盘去读取,这就是一个比较不错的解决方案Redis 是工作在分布式系统中的,它在这个环境中才能发挥出它应有的实力,如果只是单纯的单机程序,那么本质上来说如果使用变量来进行数据的存储其实是一个比较不错的解决方式,此时其实是比使用 Redis 更加优秀的选择
我们在学习操作系统的时候知道,在进行进程的通信时,不能直接进行数据的访问,这是因为进程和进程之间是可以进行数据的隔离的,数据要被进程进行隔离的,而有一种进程通信是借助网络进行通信,所以 Redis 本质上来说就可以把自己内存中的变量给其他的进程,甚至可以直接用其他主机的进程来进行数据的访问,这样就解决了刚才所说的场景,这也是 Redis 的一个使用场景
特性 | 描述 |
---|---|
内存优先 | 数据主要存储在内存中,读写速度极快(微秒级响应) |
多种数据类型 | 支持字符串、哈希、列表、集合、有序集合、位图、HyperLogLog、地理空间等 |
原子操作 | 所有操作都是原子的,支持事务 |
持久化 | 提供 RDB 和 AOF 两种持久化方式,可将内存数据保存到磁盘 |
主从复制 | 支持读写分离,提升系统可用性和扩展性 |
高可用(Sentinel) | 可通过哨兵机制实现自动故障转移 |
分布式集群 | 支持 Redis Cluster,自动分片数据 |
发布/订阅 | 支持消息发布与订阅功能,可用于构建消息队列 |
In-memory data structures
在内存中存储数据
support for strings, hashes, lists, sets, sorted sets, streams, and more.
MySQL 中主要是通过表的方式来进行存储组织数据的,这种也叫做是一种关系型数据库,而在 Redis
中,则更多的是使用一种 键值对 的方式来进行数据的组织和存储,这种叫做是非关系型数据库
Redis 支持的数据类型🧱
1)String(字符串):最基本的类型,可以是文本或二进制数据。示例:SET name "Tom"
、GET name
2)Hash(哈希):存储对象,类似 Map。示例:HSET user:1000 name Tom age 25
3)List(列表):有序的字符串列表,常用作队列或栈。示例:LPUSH queue item1
4)Set(集合):无序不重复的字符串集合。示例:SADD tags redis database
5)Sorted Set(有序集合):类似 Set,但每个元素都有一个分数用于排序。示例:ZADD leaderboard 100 Tom
6)Bitmaps(位图):对 String 的位操作,适合统计类场景(如用户登录天数)。
7)HyperLogLog:用于基数统计,比如统计独立访问人数。
8)Geospatial(地理空间):存储地理位置信息,支持距离计算、范围查询等。
9)Streams(流):Redis 5.0 引入的消息队列结构,支持消息持久化和消费者组。
针对于 Redis
的操作,可以通过一些简单的交互式的命令来进行操作,也可以通过一些脚本的方式,批量化的执行一些操作,或者是带有逻辑,更重要的是,可以使用一个 Lua 的脚本语言,来进行编写
Redis
还提供了一组原生的API,借助这个API就可以使得在原有的基础上进行扩展,例如可以使用C、C++或者是 Rust 来进行编写扩展,本质上来说就是一个动态链接库(dll、so),通过扩展,就可以让 Redis 支持更多的数据结构和和命令
Redis 的数据是存储在内存中的,但是内存是有弊端的,比如它的内容是很容易被丢失的,当进程退出或者是系统重启的时候,就会把信息进行丢失,那为了解决这样的问题
Redis 将数据持久化到磁盘的功能如下:
.rdb
文件。通常建议同时启用 RDB 和 AOF,兼顾性能与安全性。
Redis 作为是一个分布式系统的中间件,它的另外一个能力是可以支持集群,这是一个相当重要的能力,这代表的是可以进行 水平扩展,换句话说就是 支持分表 和 分库 这样的类似操作
本质上来说,这是因为 Redis 能够存储的数据是有限的(内存空间有限),这就意味着如果有太多的数据是不能放在一个 Redis 当中的,因此就有了集群的概念,操作方式:可以引入多个主机,部署多个 Redis 节点,每个 Redis 的节点来存储数据的一部分
Redis
自身也是支持主从结构的,从属节点就相当于是对于主节点的备份,那这就意味着当主节点出现问题的时候,可以直接让从属节点对于主节点进行替换,这样就可以满足主节点的要求,而不会导致程序出错
这个我们一直都在提,那么 为啥 Redis 快呢?原因如下:
**注意:**在对 redis 的优点进行理解,很多都是相较于 mysql 的
是否引入一个技术,一定要想清楚来龙去脉,想清楚能够解决啥问题,引入了啥问题。
千万不能 “无脑” 使用。不能有“锤子思维”
是否要使用 redis? ===> 对症下药,具体问题具体分析,要结合实际的需求来确定!!!
例如:
此时引入 redis 的缺点,会更慢,但是也有如下的优势
补充:💬 为什么说 “使用 C 语言开发” 是原因之一?
✅ C 语言的优势:
🔍 举个例子对比
语言 | 特点 | 性能表现 |
---|---|---|
C | 接近硬件、手动内存管理、无垃圾回收 | 极快、低延迟 |
Java | 自动内存管理、JVM 抽象层 | 中等偏快,有 GC 延迟风险 |
Python | 动态类型、易开发 | 慢,不适合高性能场景 |
如果 Redis 是用 Python 或 Java 实现的,即使逻辑一样,性能也会大打折扣,尤其是在高并发场景下。
场景 | 说明 |
---|---|
缓存 | 减少对后端数据库的压力,提升访问速度 |
会话管理 | 存储用户的 session 数据 |
消息队列 | 使用 List 或 Stream 实现异步任务队列 |
排行榜 | 利用 Sorted Set 快速获取排名 |
限流器 | 利用计数器 + 过期时间限制请求频率 |
分布式锁 | 多节点协调资源访问,如 Redlock 算法 |
实时数据分析 | 如在线人数、热点数据统计等 |
在大多数情况下,考虑到数据存储,优先考虑的是 容量(大数据存储),但是在一些极端的场景下,也不排除需要比较快的场景
例如
注意:Redis 当中存储的是全量数据,这里的数据是不可以进丢弃的
使用 MySQL 进行存储数据,优点是内存大,但是缺点是很慢,由于二八原则的存在,所以我们可以把 热点数据 从 MySQL 中拿出来,存储在 Redis 中,而 Redis 就提供了这样 缓存 的功能。
在 HTTP 的学习中,知道了 HTTP 是一个无状态的协议,因此引入的解决方案是使用了一个 cookie来进行解决,cookie 可以实现用户身份信息的保存,此时就在浏览器的这一段存储了一个用户的身份标识(sessionID),再通过 session 配合,才能够在服务器端这里真正存储的用户数据
用户访问网页的思考如下:
那这意味着什么?假设现在有一个浏览器想要进行登录操作,而在服务端是采用的是负载均衡的模式,那么在负载均衡器要分配到各个应用服务器,那么服务器怎么进行 cookie 的识别呢?
下面提供两种解决的方式
Redis
作为消息队列的场景其实不多,因为 Redis
的初心虽然是设计为一个消息队列,来支持一个生产者和消费者的模型,但是事实上,它并没有被广泛的使用,因此 Redis
作为消息队列的这场景在实际的应用场景中并不多
强调:这里的消息队列(服务器)不是 Linux 进程间通信的那个消息队列
Linux 消息队列 和 Redis 消息队列区别
特性 | Linux 消息队列 | Redis 消息队列 |
---|---|---|
所属层级 | 内核层(系统级) | 应用层(网络服务) |
使用范围 | 同一台机器的进程间通信 | 跨机器、跨网络的客户端通信 |
消息大小限制 | 一般较小(如 8KB) | 很大(取决于内存) |
持久化 | 不支持 | 支持(可选) |
容错性 | 弱(系统重启丢失) | 强(可持久化) |
分布式支持 | 不支持 | 支持(Redis Cluster 或哨兵) |
易用性 | 较复杂(需要系统调用) | 简单(Redis 协议 + 客户端 API) |
性能 | 极快(无网络开销) | 快(受网络影响) |
典型用途 | 进程协作、系统内部通信 | 分布式任务调度、事件通知、异步处理 |
小结:Linux 消息队列 是操作系统为本地进程间通信提供的高效机制,而 Redis 消息队列 则是基于内存数据库构建的应用层消息系统,适用于跨网络、分布式的场景