什么是Redis?它主要用来什么的?Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。与MySQL数据库不同的是,Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过10万次读写操作
什么是Redis?它主要用来什么的?
Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
与MySQL数据库不同的是,Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过10万次读写操作。因此redis被广泛应用于缓存,另外,Redis也经常用来做分布式锁。除此之外,Redis支持事务、持久化、LUA 脚本、LRU 驱动事件、多种集群方案。
Redis的基本数据结构类型
大多数小伙伴都知道,Redis有以下这五种基本类型:
String(字符串)
Hash(哈希)
List(列表)
Set(集合)
zset(有序集合)
它还有三种特殊的数据结构类型
Geospatial
Hyperloglog
Bitmap
Redis 的五种基本数据类型
String(字符串)
简介:String是Redis最基础的数据结构类型,它是二进制安全的,可以存储图片或者序列化的对象,值最大存储为512M
简单使用举例: setkeyvalue、getkey等
应用场景:共享session、分布式锁,计数器、限流。
内部编码有3种,int(8字节长整型)/embstr(小于等于39字节字符串)/raw(大于39个字节字符串)
C语言的字符串是char[]实现的,而Redis使用SDS(simple dynamic string) 封装,sds源码如下:
struct sdshdr{ unsigned int len; // 标记buf的长度 unsigned int free; //标记buf中未使用的元素个数 char buf[]; // 存放元素的坑 }
Redis为什么选择SDS结构,而C语言原生的char[]不香吗?
举例其中一点,SDS中,O(1)时间复杂度,就可以获取字符串长度;而C 字符串,需要遍历整个字符串,时间复杂度为O(n)
Hash(哈希)
简介:在Redis中,哈希类型是指v(值)本身又是一个键值对(k-v)结构
简单使用举例:hsetkeyfieldvalue 、hgetkeyfield
内部编码:ziplist(压缩列表) 、hashtable(哈希表)
应用场景:缓存用户信息等。
注意点:如果开发使用hgetall,哈希元素比较多的话,可能导致Redis阻塞,可以使用hscan。而如果只是获取部分field,建议使用hmget。
List(列表)
简介:列表(list)类型是用来存储多个有序的字符串,一个列表最多可以存储2^32-1个元素。
简单实用举例:lpushkey value[value ...] 、lrangekey start end
内部编码:ziplist(压缩列表)、linkedlist(链表)
应用场景:消息队列,文章列表,
list应用场景参考以下:
lpush+lpop=Stack(栈)
lpush+rpop=Queue(队列)
lpsh+ltrim=Capped Collection(有限集合)
lpush+brpop=Message Queue(消息队列)
Set(集合)
简介:集合(set)类型也是用来保存多个的字符串元素,但是不允许重复元素
简单使用举例:saddkeyelement[element...]、smembers key
内部编码:intset(整数集合)、hashtable(哈希表)
注意点:smembers和lrange、hgetall都属于比较重的命令,如果元素过多存在阻塞Redis的可能性,可以使用sscan来完成。
应用场景:用户标签,生成随机数抽奖、社交需求。
有序集合(zset)
简介:已排序的字符串集合,同时元素不能重复
简单格式举例:zaddkeyscoremember[scoremember...],zrankkeymember
底层内部编码:ziplist(压缩列表)、skiplist(跳跃表)
应用场景:排行榜,社交需求(如用户点赞)。
Redis 的三种特殊数据类型
Geo:Redis3.2推出的,地理位置定位,用于存储地理位置信息,并对存储的信息进行操作。
HyperLogLog:用来做基数统计算法的数据结构,如统计网站的UV。
Bitmaps :用一个比特位来映射某个元素的状态,在Redis中,它的底层是基于字符串类型实现的,可以把bitmaps成作一个以比特位为单位的数组
Redis有什么优势?
极高性能
Redis是一个基于内存的数据存储系统,能够提供极快的读写速度,通常以微秒到毫秒级别的延迟完成操作。这使得Redis非常适用于需要快速响应的场景,如缓存、实时分析等。
多样化数据结构
Redis不仅仅是一个简单的键值存储,它支持字符串、哈希、列表、集合、有序集合等多种复杂数据结构,这为处理各种不同类型的数据提供了极大的灵活性,并且这些数据结构可以很好地降低业务开发复杂度。
持久性及可靠性
Redis提供RDB和AOF两种持久化机制,并且可以灵活地根据需要配置持久化策略。
高可用性和分布式支持
Redis提供了哨兵(Sentinel)和集群(Cluster)模式,支持自动故障恢复和数据分片,这些特性为构建高可用和可扩展的系统提供了强有力的支持。
简单易用
Redis的设计以简单易用为核心,它提供了简洁直观的命令集,使得开发者可以快速上手并进行数据操作。同时,Redis的客户端库在多种编程语言中可用,进一步降低了学习成本和开发难度。
生态和社区支持
Redis有一个非常活跃的社区,提供了丰富的文档、客户端库和支持资源。这使得Redis能够在多种编程环境中快速集成,并不断推出新特性和性能改进。
Redis有哪些实际应用?
缓存系统
Redis通过提供超高速的数据访问,常用于缓存网站内容,减轻后端数据库的负担,提高响应速度。它可以缓存网页、数据库查询结果和常用对象。例如,网站可以将热门文章的内容缓存在Redis中,以快速向用户展示,避免每次访问都查询数据库。
会话存储
在Web应用中,Redis被用来存储用户会话信息。它能够快速读写用户的会话数据,支持大量并发的访问。例如,在线购物平台可将用户的登录信息和购物车状态存储在Redis中,实现快速会话恢复。
消息队列
Redis的发布/订阅模式和列表数据结构使其成为实现消息队列的理想选择。它能够在生产者和消费者之间高效地传递消息。例如,一个应用可以用Redis来处理发送邮件的任务队列,确保邮件按顺序发送。
实时分析
Redis的速度使其非常适合于需要实时分析的应用场景,如计数器、实时监控和事件分析等。例如,一个网站可能使用Redis来追踪每个页面的实时访问次数。
排行榜和计数器
利用Redis的有序集合,可以有效地实现排行榜系统。它允许快速更新和检索排名信息。例如,游戏应用可以用Redis来维护玩家的分数排行榜,实时更新玩家排名。
地理空间数据处理
Redis提供了地理空间索引功能,可以快速进行地理位置存储和查询。这适用于需要处理地理位置信息的服务。例如,一个位置基础的服务可以用Redis来追踪和查询附近的兴趣点或用户。
Redis的工作原理是什么?
基于内存的数据存储
Redis是一个内存中的数据结构存储系统,意味着它使用计算机的主内存(RAM)来存储所有的数据。这种内存优先的设计使得Redis能够提供极高的性能,因为内存的数据访问速度远远超过了传统硬盘存储。
由于存储在内存中,Redis能够以微秒级别的延迟对数据进行读写操作,这对于需要快速响应的应用来说至关重要,如缓存系统、实时分析平台和高频交易系统等。然而,内存资源相对有限且价格较高,因此Redis也提供了数据驱动的逐出策略(如LRU—最近最少使用算法)和精细的内存管理功能,确保有效利用可用内存。
数据结构与操作命令
Redis提供了丰富的数据结构,每种结构都有专门的操作命令:
字符串(String):最基本的数据类型,用于存储文本或二进制数据。常用命令包括 GET、SET 用于存取数据,INCR、DECR 用于原子性递增或递减操作。
哈希(Hash):用于存储对象,由字段和字段值组成的映射表。HGET、HSET 用于获取和设置字段值,HGETALL 用来获取哈希表的所有字段和值。
列表(List):有序集合,支持双端插入和删除操作。LPUSH、RPUSH 用于从左端或右端插入元素,LPOP、RPOP 用于从两端弹出元素,LRANGE 用于获取列表片段。
集合(Set):无序且元素唯一的集合。SADD、SREM 用于添加或移除元素,SMEMBERS 用于获取所有元素,SINTER、SUNION 和 SDIFF 用于集合运算。
有序集合(Sorted Set):类似 Set,但每个元素关联一个分数值,按分数有序排列。ZADD 添加元素,ZRANGE 按照分数范围查询元素,ZREM 删除元素。
Redis还支持位操作、地理空间索引、HyperLogLogs等高级数据结构,通过一系列特定的命令进行操作,使得Redis能够应用于广泛的场景中。
持久化机制
为了保证内存中的数据在断电或故障时不会丢失,Redis提供了两种主要的持久化机制:RDB(Redis Database)和AOF(Append Only File)。
RDB:通过创建数据集的时间点快照来实现持久化。这是通过周期性地执行一个称为“BGSAVE”的操作来完成的,它会产生一个包含了Redis在某一时刻所有数据的二进制文件。RDB文件是一个压缩的二进制文件,可以用来在需要的时候,快速恢复整个数据集。它适合于数据备份和灾难恢复,但在发生故障后,自上次快照以来的所有数据都有可能丢失。
AOF:记录每一个写操作命令到一个日志文件中,命令以追加的方式保存。AOF文件以纯文本格式存储,提供了更好的数据安全性,因为它可以配置为每次写操作后同步到磁盘,或者每秒同步一次。在Redis重启时,AOF文件中的命令会被重新执行,以重建内存中的数据状态。通过AOF恢复数据通常比RDB更慢,但可以更频繁地记录数据状态,减少数据丢失的可能性。
单线程架构
Redis的单线程架构指的是它的核心数据操作是由一个单一的线程来执行的。这种设计带来了简单性和效率,因为避免了多线程上下文切换的开销,并简化了并发控制,因为不需要考虑数据在多个线程间的同步问题。尽管Redis处理命令的主循环是单线程的,它还是能利用IO多路复用技术来同时处理多个客户端的请求。此外,对于某些耗时操作,如持久化和部分网络IO处理,Redis会使用后台线程来避免阻塞主线程,确保了服务的响应性。单线程架构使得Redis可以高效地处理大量的请求,同时保持操作的原子性和一致性。
哨兵和集群机制
为了实现高可用性和水平扩展,Redis提供了哨兵(Sentinel)机制和集群(Cluster)模式。
Redis哨兵(Sentinel)是一个高可用性解决方案。哨兵系统可以监测Redis主从服务器的健康状态,自动执行故障转移,选举新的主服务器,并通知应用程序新主服务器的地址。哨兵还负责通知管理员,发送警报,并执行自定义脚本响应各种事件。
Redis集群(Cluster)提供了一个数据分区(sharding)和自动管理的环境,支持在多个节点间进行数据共享。它能够在节点间自动分配数据,并在节点故障时提供自动的故障转移功能。集群通过分片来提高数据库的可扩展性,并能在不中断服务的情况下,动态地添加或移除节点。
redis 8.2.0 最新版
2025年8月4日,Redis官方发布了Redis开源版本8.2.0,这是在Redis 8.0基础上的一个重要升级版本。此次版本不仅包含了丰富的新功能和命令,还带来了多项性能优化及关键安全修复,进一步巩固了Redis作为领先内存数据库和缓存系统的地位。本文将结合官方发布的更新细节,全面深入讲解Redis 8.2.0的亮点及改进内容,帮助开发者快速理解和应用新版功能。
一、Redis 8.2.0发布背景与总体概述
Redis作为面向高性能场景的键值数据库,历经多年发展已经广泛应用于缓存、消息队列、计数器、实时分析等领域。本次8.2.0版本是在广受欢迎的8.0版本基础上打磨而成,关注点不仅在功能创新,也重视系统稳定性、安全性以及资源利用效率。
Redis 8.2.0版本正式宣布一般可用(GA),意味着这一版本经过充分测试和验证,可用于生产环境部署。新版本日志的更新立即引起Redis社区和用户广泛关注,特别是对其新增的流(Streams)命令、矢量索引支持、监控指标丰富化和安全漏洞修复尤为重视。
二、核心新功能详解
Redis 8.2.0在多方面进行了功能增强,下面从Streams命令扩展、Bitmap新操作符、查询引擎新向量索引类型等关键模块做详细拆解。
1. Streams命令升级:新增XDELEX和XACKDEL,扩展XADD和XTRIM
流(Streams)作为Redis提供的强大消息流处理机制,支持高效的日志收集、事件驱动和消息队列场景。此次8.2.0版加入的命令和扩展极大丰富了流数据操作手段:
• XDELEX
这是Redis Streams新增的删除消息命令,允许用户从流中按ID删除指定消息。这使得在长时间运行的流内,可以主动清理历史消息,减少内存占用,提高流数据的可管理性。
• XACKDEL
是对消费者组确认消息(XACK)的增强版,支持同时删除已确认消息,解决传统仅作为确认标记无法清理数据的限制。
• XADD和XTRIM的扩展
扩展后的XADD支持更灵活的消息添加方式,XTRIM增加了更强大的修剪策略,优化流长度控制,有利于管理持续增长的流数据。
整体来看,这些流命令的新颖特性进一步提升了Redis在实时流处理和事件驱动架构中的应用便捷性和灵活性。
2. Bitmap命令BITOP新增4种操作符:DIFF、DIFF1、ANDOR、ONE
Bitmap数据结构是高效的位图操作工具,常用于数据分析、用户画像等场景。词条BITOP命令新增四个操作符:
• DIFF
计算两个Bitmap之间的差异,得到第一个Bitmap但不在第二个Bitmap中的bit位。
• DIFF1
只返回差异中为1的位,用于更精确的位比差异计算。
• ANDOR
结合AND和OR两种逻辑操作,一次指令完成复杂位操作。
• ONE
返回至少有一位为1的结果,帮助快速判断Bitmap是否包含有效信息。
这些新的位操作符扩展将大幅提高Bitmap数据处理表达能力和场景适用广度。
3. 查询引擎新增SVS-VAMANA向量索引支持向量压缩
当下向量搜索成为机器学习、推荐系统的重要技术,Redis在查询引擎方面也紧跟趋势,发布了全新向量索引类型:
• SVS-VAMANA向量索引
新增索引类型内建支持向量压缩,不仅提升索引存储效率,也带来查询速度上的明显改进。
这一特性使得Redis能够胜任更大规模、更高维度的向量数据检索任务,为AI等领域提供底层数据存储和检索的有力支撑。
4. 更多监控指标与资源利用状态统计
为便于运维和性能调优,Redis 8.2.0新增及完善了多个关键运行指标:
• 每槽位使用情况指标
帮助用户洞察集群中各槽位负载分布,优化数据均衡。
• 基本数据类型键大小分布
统计字符串、列表、集合等基础数据类型的键大小,有助于分析内存使用情况和数据结构选择。
除此之外,还有15项以上的性能和资源利用改进,使得Redis 8.2不仅更快更稳,也更易监控和管理。
三、系统支持的安装方式和运行环境
Redis 8.2.0提供了灵活多样的安装方式,满足不同操作系统用户的需求:
• 官方二进制发行版
• Docker镜像支持Alpine和Debian(详见官方Docker Hub)
• Snap包安装(基于GitHub redis-snap项目)
• Homebrew支持在macOS上的一键安装
• RPM包支持主流Linux发行版
• Debian的APT源包安装
测试支持的操作系统包括多种Linux发行版(Ubuntu 22.04和24.04,Rocky Linux 8.10及9.5,AlmaLinux 8.10及9.5,Debian 12),以及macOS多个版本(Ventura、Sonoma、Sequoia),确保跨平台稳定运行。
四、关键安全修复
Redis 8.2.0针对之前条件下的几项安全漏洞进行了重要修补:
• CVE-2025-32023 HyperLogLog命令中的越界写错误修复
该漏洞可能导致程序崩溃或数据破坏,修复提升系统稳定性。
• CVE-2025-48367 连接接收过程的错误处理增强
改进重试策略,防止连接夹带异常状况影响服务可用性。
及时响应和修复安全问题,对于保障生产环境的数据库安全和稳定至关重要,建议所有用户尽快升级。
五、事件通知功能增强
Redis键空间通知机制在8.2.0版本中增加了两种新的事件类型:
• OVERWRITTEN
表示一个键的值被完全覆盖,适用于记录数据被完全替换的业务需求。
• TYPE_CHANGED
当键类型发生改变时触发,方便监控数据结构变更。
这为开发者提供更丰富的事件感知能力,便于构建更加智能和灵活的响应机制。
六、重要Bug修复与稳定性改进
版本修正了一些此前发布候选版本中存在的关键缺陷:
• 修复了使用evport模型时I/O线程导致的崩溃问题
• 消除Lua脚本执行过程中无错误表时引发的崩溃风险
• 解决大端机器上矢量集合(Vector sets)RDB格式兼容性问题
• 防止阻塞命令导致客户端无限阻塞的问题
• 修正CLIENT UNBLOCK错误解除客户端暂停的异常行为
• 修复SET操作未正确移除TTL的缺陷
• 修正HINCRBYFLOAT命令在复制环境中不应去除字段过期时间的错误
这些修复保障了Redis在多样化使用场景下的高可靠性。
七、性能和资源利用的显著提升
借助此次版本中15项以上的优化,Redis 8.2在性能和资源使用方面表现出明显进步:
• 更多SVS-VAMANA压缩变体,使向量索引查询更加高效
• Redis集群中的KNN向量查询(SHARD_K_RATIO参数) 支持调整在网络延迟和查询精度之间做权衡,尽管此功能尚处于不稳定阶段,但展现了未来的发展方向
• 矢量集合结构优化,通过存储“最差链接”信息改进RDB加载及RESTORE速度
综上,Redis 8.2能够以更低资源消耗支撑更大规模负载,帮助用户显著提升集群性能与响应速度。
八、模块开发API拓展
针对Redis模块生态,8.2.0引入了多项API扩展,提升模块的功能丰富度:
• RedisModule_Get 和 RedisModule_Set**
模块可以直接访问和修改Redis的配置参数,增强模块的灵活性和自定义能力。
• RM_UnsubscribeFromKeyspaceEvents
允许模块取消订阅指定的键空间通知事件,便于模块动态调整监听行为,减少不必要的资源消耗。
这些API的增强将推动Redis模块生态的丰富与成熟,也让第三方功能扩展开发更为便捷高效。
九、Redis 8.2.0详细功能解析与应用实践
1. 流(Streams)命令细节与典型应用
XDELEX命令
XDELEX支持用户根据消息ID删除流中的具体消息,与传统只能截断流不同,这为复杂应用中精准删除任务提供了可能。例如,某一消息内容敏感需移除时,系统后台可调用XDELEX精准剔除,无需影响流其他消息。
XACKDEL命令
结合消息确认和删除,XACKDEL优化了消费者组消费后消息的清理流程。在高吞吐消费场景中,这能有效缩减内存负载和流长度,防止流数据无节制膨胀。
扩展的XADD和XTRIM
XADD升级增加了更灵活的参数支持,比如在一定条件下自动移除旧数据,保持流长度稳定。XTRIM增强后的修剪策略包含更智能的裁剪规则,如最大长度阈值、时间窗口剪裁,适合实时日志和事件流的管理。
2. Bitmap BITOP 新操作符应用示例
• DIFF和DIFF1(差异计算)
适合做用户标签变化分析,如用户群体从一个名单排除后的快照,精准剔除营销黑名单。
• ANDOR
结合多个条件过滤,适合复杂多维度用户画像,比如同时满足兴趣A或者兴趣B但排除兴趣C。
• ONE
快速判断一组Bitmap是否包含有效用户,提升了过滤条件判断效率。
3. SVS-VAMANA向量索引应用探讨
向量搜索在推荐系统、语义检索、图像识别等领域应用日渐普及。Redis引入的SVS-VAMANA索引类型带来了:
• 向量的自动压缩,节约内存和存储空间
• 保持较高的检索精度和响应速度
• 适配大规模、多维度向量数据集,支持机器学习系统实时搜索需求
通过此索引,Redis不仅作为缓存/存储,还能承担智能应用的关键检索层。
4. 新增监控指标的实用价值
• 监控每槽的使用状况,有助于Redis集群管理员通过调整槽分配实现负载均衡,预防热槽问题。
• 键大小分布监控能提示不同数据结构的内存消耗特征,辅助架构师做合理数据建模与压缩策略。
结合这些指标,企业可以更有针对性地调整资源配置,有效降低运营成本。
十、升级建议与注意事项
1. 升级前备份数据
RDB和AOF持久化文件进行完整备份,防止因升级过程出现异常而导致数据丢失。
2. 测试环境预先验证
新版的流命令、向量索引及模块API等新特性可能引入行为差异,建议先在测试环境全面验证兼容性和性能表现。
3. 注意向量集合RDB兼容性
8.2.0修复了大端机器兼容性问题,但仍需确认多平台集群一致性。
4. 关注客户端和模块升级
客户端库和第三方模块需要升级支持Redis 8.2的新命令和配置接口,避免出现不兼容问题。
十一、总结
Redis 8.2.0版本以其流命令的扩展、位图新操作、先进的向量索引支持、丰富的监控指标以及安全修复,彰显了开源内存数据库在新一代高性能计算、智能搜索及实时数据处理领域的强大生命力。新版本不仅为Redis带来更高的性能和可用性,也为开发者提供了更广阔的扩展空间和应用可能。