有道无术,术尚可求,有术无道,止于术。
本系列Redis 版本 7.2.5
源码地址:https://gitee.com/pearl-organization/study-redis-demo
1. 简介
Redis
的全称为Remote Dictionary Server
,即远程字典服务。使用ANSI C
语言编写,是一个开源、基于内存、可持久化、分布式、高性能的Key-Value
数据结构服务器,并提供了多种语言的API
。
相关文档:
一句话概述:Redis
是一个K-V
键值对内存数据库。
2. Redis 之父
Redis
作者是Salvatore Sanfilippo
,网名为Anirez
,一般称为安特雷兹。
1977
年出生于意大利的西西里岛,电影 《西西里的美丽传说》 …女神莫尼卡·贝鲁奇🥰🥰🥰
Anirez
进入IT
行业时,是一个系统安全管理员,干着运维的活。但是业余时间自学编程,并发明了不少技术工具。在2007
年创办LLOOGG.com
访客信息追踪网站。为了节省成本以及高性能扩展性,Antirez
意识到需要一种支持多种复杂数据结构的内存数据库,并且支持快速操作,于是便在2009
年开源并发布了Redis
。
之后Anirez
就职于Pivotal
,主导Redis
的开发的维护工作。在2020
年,Anirez
在个人博客发布了将隐退的消息,退出代码的日常开发维护,以后只充项目顾问(在我看来,大佬已经财富自由、功成身退,实名羡慕…):
3. 功能
Redis
提供了丰富的数据结构:
String
:字符串Hash
:哈希表List
:列表Set
:集合SortedSet
:有序集合Bitmaps
:位图Bitfiled
:位域Hyperloglog
:基数统计Geospatial
:地理信息Stream
:流
此外还包括以下主要功能:
- 过期自动删除
Key
- 事务
- 发布订阅
LUA
脚本- 内存回收
- 持久化
- 自动故障转移
- 主从、哨兵、集群等高可用部署模式
4. 版本
Redis
偶数版本号表示稳定的版本,例如6.2
、7.0
、7.2
,奇数版本号用来表示非标准版本,例如2.9
、5.1
。
Redis
发展史简图:
Redis
到目前为止,已经很成熟了,后续几个版本主要是优化,大版本发布时间表及核心特性如下:
2009
年3
月发布Redis 1.0
版本,基于内存存储数据,并引入了一些基本的数据结构和操作命令,支持RDB
(快照)持久化机制。基本版本为以后的发展奠定了基础。2010
年4
月发布Redis 2.0
版本,引入虚拟内存,实现Lua
脚本语言,支持哈希类型,提供慢查询日志。除了新增的功能外大幅提升了性能和稳定性。2011
年5
月发布Redis 2.2
版本,引入有序集合(SortedSet
),支持Lua
脚本,并新增对应的操作命令。支持大数值的整型、增加了对IPv6
的支持,并支持强化调试。2011
年9
月发布Redis 2.4
版本,引入了主从复制、发布订阅、提供管道和事务支持等新特性。此外对性能、稳定性和错误处理能力等方面进行了大幅优化和改进。2012
年8
月发布Redis 2.6
版本,引入了虚拟内存、AOF
持久化、到期键(EXPIRE
)等新特性。此外还引入了内存优化机制,可靠性和稳定性大幅提升。2014
年4
月发布Redis 2.8
版本,增强的Lua
脚本支持,支持优化增量重写,引入哨兵模式,支持高可用性和自动故障转移。性能、可扩展性、容错性和灵活性等方面都有很大提升,2015
年5
月发布Redis 3.0
版本,引入了多条新命令,Redis Cluster
集群模式,支持GEO
、HyperLogLog
数据类型。针对持久化机制、Lua
脚本、配置方面都进行了增强。2016
年8
月发布Redis 3.2
版本,引入了对Redis
集群的完整支持,支持高可用性、数据复制和分片。支持Stream
流,此外包含了其他许多方面的稳定性提升。2017
年9
月发布Redis 4.0
版本,更加强大和高效的集群功能、更加安全和可靠的持久化机制、新的数据类型、事务和流水线批处理等功能。2018
年10
月发布Redis 5.0
版本,更加强大和高效的模块化架构,更加安全和可靠的持久化机制、新的数据类型、多种集群模式、新增命令等等。2020
年4
月发布Redis 6.0
版本,针对集群、性能、内存管理、可伸缩性、安全性新方面进行了大幅优化提升。2022
年4
月发布Redis 7.0
版本(下文会详细介绍)。
5. Redis 7 新特性
2022
年 4
月 27
日,Redis 7.0.0 GA
版于正式发布,新增了50
多个新命令,包含了大量核心新特性与改进,是改变最多的一个大版本。接下来主要介绍一些比较重要的新特性。
5.1 Redis Functions
Redis 2.x
开始支持Lua
脚本,但是存在一定的局限性,比如Lua
脚本存储在客户端,重启时需要重新加载加载,增加了维护成本;脚本可以被缓存,但是会存在丢失问题。
Redis 7
引入了Redis Functions
(函数),是一种全新的脚本方案。通过持久化和复制保证可用性,不依赖于客户端,允许通过服务端加载自定义的函数库,并且会进行主从复制和持久化存储。支持多种语言,目前仅支持LUA
,后续计划支持JavaScript
、Python
等。
5.2 Multi-part AOF
AOF
(Append Only File
)是Redis
数据持久化方案之一,以日志的形式来记录每个写操作,重启时会读取该文件重新构建数据。在之前的AOF
机制中,在数据重写期间的增量数据需要在内存中保留,结束后再把这部分增量数据写入新的AOF
文件中,以保证数据完整性。这种方式会会额外消耗内存和磁盘IO
。
Redis 7
引入了Multi-part AOF
机制来解决上述问题,采用两种类型的文件进行独立存储:
base files
:基本文件incr files
:增量文件
采用多个文件进行分类存储,彻底解决内存和IO
资源的浪费,同时也支持对历史AOF
文件的保存管理。
5.3 ACL V2
在6.0
版本之前,Redis
只有一种简单的密码机制,甚至没有用户名。Redis 6.0
引入了ACL
访问控制列表机制,允许创建用户并分配权限,但是权限粒度较粗,实用性并不强。
Redis 7
引入了ACL v2
,支持KEY
粒度的权限访问控制。
5.4 Client Eviction
为了防止Redis
占用过多的内存,支持以下配置:
maxmemory
:允许占用的最大内存值maxmemory-policy
:占用超过最大值时的内存淘汰策略
maxmemory
控制的是整个Redis
运行内存,包括数据、客户端、脚本等,其中非数据内存client buffer
消耗最大,在大流量场景下,可以因为client buffer
消耗太多内存,导致触发淘汰策略删除数据,实际应该针对client buffer
进行单独配置。
Redis 7
引入了专门针对客户端内存占用的限制:
# 方式1:允许客户端占用最大内存
maxmemory-clients 1g
# 方式2:允许客户端占用 maxmemory 的百分比
maxmemory-clients 10%
5.5 Sharded Pub/Sub
Redis 2.x
开始支持发布订阅,但是在大规模集群中存在广播风暴问题。Redis 7
引入了Sharded-pubsub
机制,一个分片节点只负责处理属于自己的通道而不会进行广播,避免了资源的浪费。
5.6 其他
其他的一些特性包括:
config
命令增强,支持在一次调用过程中传递多个配置参数。listpack
替代ziplist
RDB
保存时间调整- 主动碎片整理
V2
- 性能资源利用率、安全、等改进
5.7 Redis 7.2
自2022
年发布Redis 7
距今已经两年了,目前最新的版本为7.2.5
,主要是在7.0
的版本上进行了漏洞修复、BUG
优化、底层优化等:
6. 应用场景
Redis
诞生于Web 2.0
时代,应用场景十分广泛,包括:
- 缓存加速:最经典的应用场景之一,将热点查询数据存入到
Redis
,减少数据库压力 - 分布式锁:分布式场景下的锁
- 计数器:计数器功能,例如文章的阅读量、微博点赞数等,允许一定的延迟后同步到数据库
- 分布式会话:使用
Redis
存储Session
- 分布式
ID
:分库分表的场景中,实现全局唯一ID
- 定时失效:短信、验证码过期
7. 扩展模块
基于核心的 Redis
,官方也提供了很多扩展模块,以适应更多的开发场景:
- RediSearch:基于
Redis
的全文搜索引擎。提供了高性能的全文搜索功能,支持复杂的查询和过滤,并且可以无缝地集成到现有的Redis环境中。 - RedisJSON:用于在
Redis
中存储和操作JSON
数据的模块。它提供了高效的JSON
序列化和查询功能,使得在Redis
中处理JSON
数据变得更加简单和高效。 - RedisInsight:用于管理和监控
Redis
实例的可视化工具。它提供了直观的界面,可以轻松地查看和分析Redis
的数据、内存使用和性能指标。 - RedisGraph:基于
Redis
的图数据库扩展,它使用图结构来存储和查询数据,提供了快速的图遍历和图分析功能。它适用于处理复杂的关联数据和图数据分析任务,可以轻松地进行路径查找、社交网络分析等操作。 - RedisBloom:在
Redis
上实现的布隆过滤器和其他数据结构的扩展,可以提供高效的元素查找和去重功能,适用于大规模数据集的快速筛选和过滤,具有较低的误判率和高效的存储利用率。 - RedisTimeSeries:在
Redis
上实现的的时间序列数据库扩展,它提供了高性能的时间序列数据存储和查询功能。它能够处理大规模的时间序列数据,支持聚合查询、降采样和数据压缩等功能,是构建实时分析和监控系统的理想选择。 - RedisOM:目标是为使用
Redis
生态提供多语言/跨平台的高级抽象客户端。它提供了简化Redis
操作的功能,使得在Spring
应用中使用Redis
变得更加便捷。目前已支持多种语言像Node
、Python
、.net
和Spring
等。
8. Redis Stack
2022
年3
月发布了 Redis Stack
,将多个领先的 Redis
模块集成为单个产品, 使得用户可以更轻松地利用基于 Redis
构建的搜索、文档存储、图数据和时间序列能力。Redis
是核心的开源技术, Redis Stack
并不是 Redis
的替代品。是为了开发者能够快速、轻松地开发完全基于 Redis
的现代应用。
Redis Stack
是由一下三个组件组成的集成套件:
- 服务器:将开源的
Redis
和RedisSearch
、RedisJSON
、RedisGraph
、RedisTimeSeries
和RedisBloom
进行整合。 - 可视化管理工具:
RedisInsight
是一个强大的工具,用于可视化和优化Redi
s 数据,使实时应用开发比以前更容易、更有趣。 - 客户端
SDK
:包含Java
、JavaScrip
t 和Python
官方客户端以及新推出的对象映射库套件Redis OM
。