先导课程
约 2508 字大约 8 分钟
2025-04-24
1.Redis 的概念
Redis
是一种开源的内存数据库,用于存储数据结构,例如字符串、哈希表、列表、集合、有序集合等。它被设计为快速、灵活,并支持多种数据结构的操作。Redis
通常用作缓存、消息代理、会话存储等用途。它支持多种编程语言,并有许多客户端库可供开发者使用。Redis 也有持久化选项,可以将数据保存到磁盘上,以便在重启时恢复数据。
2.Redis 的原理
Redis
所有数据都是存放在内存中的,把数据放在内存中是 Redis
速度快的最主要原因。另外 Redis
是 ⽤ C
语 ⾔ 实现的,⼀ 般来说 C
语 ⾔ 实现的最终程序会更快。另外 Redis
一开始采用的是单线程,预防了多线程可能产 ⽣ 的竞争问题。不够后面的 Redis
在 6.0
版本引 ⼊ 了多线程机制,但主要也是在处理 ⽹ 络和 IO
,不涉及到数据命令,即命令的执行仍然采 ⽤ 了单线程模式。
从网络角度上,Redis
还使用了 IO
多路复用的方式,实际上就是 ET
模式的 epoll
(Redis
的核心任务主要是操作内存的数据结构,不会吃很多的 CPU
资源)。
另外,Redis
的很多核心功能都是比较简单的逻辑,简单逻辑就代表简单执行,就会非常快速。
3.Redis 的特点
3.1.Redis 的优点
Redis
相对于传统的关系型数据库(如 MySQL
)或自定义内存中的变量有一些优势,这些优势可能导致选择 Redis
:
性能快速:这里的性能快速是和
MySQL
进行对比。(1)
Redis
是一个基于内存的数据库,因此读写速度非常快,适合需要快速响应的应用场景,如缓存系统或计数器(因此常常是MySQL
的一个替代方案,但是存储容量没有MySQL
多,不过有一种方案就是两者同时结合使用,热点数据使用Redis
,其余数据使用MySQL
)。数据结构:
Redis
支持丰富的数据结构,如字符串、哈希表、列表、集合、有序集合、GEO(地理信息定位)
...,这使得它可以更灵活地存储和操作数据,而不仅仅局限于关系型数据库的表结构(和MySQL
关系数据库不同,Redis
是基于键值对来组织数据的,是一种典型的非关系型数据库)。可编程的:可以使用命令行操作
Redis
,也可以使用编程语言脚本的方式批量执行一些操作(主要使用Lua
,也是一种较火的语言)。可拓展性:可以使用
C/C++、Rust
来为Redis
功能做拓展(本质是安装动态链接库,类似.so/.dll
等),例如支持更多数据结构和更多交互命令。持久化数据:虽然
Redis
是基于内存的,但它提供了持久化选项,可以将数据定期写入磁盘,确保数据不会因为系统崩溃而丢失。并且也有两种持久化方案,RDB
和AOF
,前者是基于快照数据的持久化,后者是基于日志数据的持久化。水平拓展:
Redis
支持主从复制和集群模式,可以在多个主机部署多个节点。高可用性:多个节点上可以复制数据(备份/冗余),提高系统的可用性和容错能力,从节点就相当于主节点的备份。
原子操作:
Redis
支持原子操作,能够保证多个操作的原子性,避免了多线程或多进程并发操作数据时可能出现的竞态条件。客户端语言多:客户端可以支持的语言非常多,包括但不限于
Cpp, Java, Python, Node.js...
,使用起来非常简单。主从复制功能:提供了复制功能,实现了多个相同数据的
Redis
副本。高可用:提供了哨兵机制,保证
Redis
的故障发现和故障自动转移。
总的来说,Redis
适用于需要高性能、低延迟、丰富数据结构和高可用性的应用场景,如缓存、实时数据分析、会话存储等。虽然在某些情况下使用传统的关系型数据库或自定义内存变量也可以实现类似的功能,但 Redis
提供了更好的性能和更丰富的功能。
进程间通信,如果是单机,就需要通过管道或者共享内存等机制来传递数据。而如果涉及到多台主机,就会涉及到网络通信。而 Redis
就是基于网络把内存中数据交给别的进程甚至是其他主机中进程来使用,并且一般是基于分布式系统的。
Redis
经常会被作为:
存储数据的非关系实时数据库(具有更低的存储和更高的效率)
使用
session
配合cookie
实现会话管理...消息队列消息中间件(这里不是进程通信中的消息队列),是网络中的生产者消费者模型(知名的消息队列就有
RabbitMQ、Kafka、RocketMQ
等,不过Redis
的不常使用,多是顺带方便才使用)重要
补充:
Redis
一开始是作为消息中间件(消息队列)的一个生产者-消费者模型解决方案,但是这种类似的解决方案已经有更优的方案了。
3.2.Redis 的缺点
数据量大的场景中无法使用,受限于内存空间存储空间不大等。
4.Redis 的版本
4.1.Redis 2.6 (2012 年发布)
- Lua 脚本支持:服务端支持执行
Lua
脚本。 - 移除虚拟内存功能。
- 去除客户端连接数硬编码限制。
- 键的过期时间支持毫秒。
- 只读功能:提供只读节点功能。
- 新增位图命令:
bitcount
和bitop
。 - redis-benchmark 增强:支持定制化压测,CSV 格式输出等。
- 基于浮点数的自增命令:
incrbyfloat
和hincrbyfloat
。 - redis-cli 支持 Lua 脚本执行:通过
--eval
参数。 - shutdown 命令增强。
- Info 命令优化:按 section 输出,新增统计项。
- 核心代码重构:去掉集群相关代码,Redis Cluster 将在 3.0 版本中支持。
- 优化 sort 命令。
4.2.Redis 2.8 (2013 年发布)
- 主从复制功能增强:降低网络问题引起的全量复制压力。
- IPv6 支持:初步支持
IPv6
。 - config set 支持设置
maxclients
。 - bind 命令支持多个 IP 地址绑定。
- 显式进程名:便于使用
ps
命令查看。 - config rewrite:将
config set
持久化到配置文件。 - 新增 pubsub 命令:增强发布订阅功能。
- Redis Sentinel 第二版:生产环境可用。
4.3.Redis 3.0 (2015 年发布)
- Redis Cluster:官方分布式实现。
- 优化对象编码:嵌入式字符串对象编码,优化内存访问,提升下载速度。
- LRU 算法优化:显著提升性能。
- migrate 命令优化:新增
copy
和replace
参数,提升迁移速度。 - client pause 命令:暂停客户端请求处理。
- bitcount 命令性能提升。
- config set 支持不同单位设置
maxmemory
。 - 日志优化:日志中反映实例角色(master 或 slave)。
- incr 命令性能提升。
4.4.Redis 3.2 (2016 年发布)
- GEO 功能:新增地理位置相关命令。
- SDS 优化:在速度和空间利用上进行优化。
- List 编码类型:新增
quicklist
编码类型。 - 一致性保证:从节点读取过时数据的一致性保证。
- 新增 hstrlen 命令。
- debug 命令增强:支持更多参数。
- Lua 脚本功能增强。
- Lua Debugger:调试
Lua
脚本。 - config set 支持更多配置项。
- RDB 格式优化:更新
RDB
格式,兼容旧格式。 - 加速 RDB 加载速度。
- spop 命令支持个数参数。
- cluster nodes 命令加速。
- 更新 Jemalloc 到 4.0.3。
4.5.Redis 4.0 (2017 年发布)
- 模块系统:引入模块系统,支持第三方扩展。
- PSYNC 2.0:优化主从切换,避免全量复制。
- LFU 缓存剔除算法:与
LRU
相比,LFU
基于访问次数,优化了缓存淘汰。 - 非阻塞
del
命令:新增unlink
命令,异步删除键。 - memory 命令:提供内存监控和统计。
- RDB-AOF 混合持久化格式:结合
RDB
和AOF
优点。 - Redis Cluster 兼容 NAT 和 Docker。
4.6.Redis 5.0 (2018 年发布)
- 流数据类型:新增
stream
数据类型。 - 新的 Redis 模块 API:包括定时器、集群和字典
API
。 - RDB 支持存储 LFU 和 LRU 信息。
- 集群管理器迁移至 C 语言:从
redis-trib.rb
移植到redis-cli
。 - 新增有序集合命令:
zpopmin
、zpopmax
及其阻塞变体。 - 升级 Active Defragmentation 到 v2 版本。
- HyperLogLog 优化。
- 内存统计报告增强。
- client unblock 命令。
- 弃用“slave”术语,改用“replica”。
- Lua 脚本优化:支持跨副本执行,并且可以超时。
4.7.Redis 6.0 (2020 年发布)
- 多线程 IO:仅用于处理网络数据的读写和协议解析,命令执行仍为单线程。
- client-side-caching(客户端缓存)功能。
- 支持 RESP 3:在兼容 RESP 2 的基础上引入 RESP 3 协议。
- 连接支持 SSL:增强安全性。
- 增强 ACL 权限控制:细化对命令和键的操作权限控制。
- Redis 集群代理模块:Redis Cluster Proxy。
- 提升 RDB 加载速度。
4.8.Redis 7.0 (2022 年发布)
- AOF 存储方式优化:改为在一个文件夹下存储多个文件。
- RDB 版本更新为 10:不再与旧版本兼容。
- ziplist 转 listpack:在读取旧的 RDB 文件或主节点复制文件时进行转换。
- 配置更改:
protected-mode
默认开启,防止未授权连接。 - ACL 中 pub/sub 频道默认阻塞。
- TTL 时间标识:从节点 TTL 时间标识为绝对时间。
- 不再支持 gopher 协议。
- 配置
replica-serve-stale-data=no
时,主节点不可用时ping
命令不返回值。
File not found