有道无术,术尚可求,有术无道,止于术。
本系列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替代ziplistRDB保存时间调整- 主动碎片整理
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是一个强大的工具,用于可视化和优化Redis 数据,使实时应用开发比以前更容易、更有趣。 - 客户端
SDK:包含Java、JavaScript 和Python官方客户端以及新推出的对象映射库套件Redis OM。