Redis 内存优化主要通过合理配置最大内存限制、选择合适的数据结构、开启内存压缩机制以及设置键过期时间来实现。应对存储挑战时,应采用集群方案分散压力,利用持久化释放内存,并监控内存碎片率。避免大 Key 和热 Key 问题,使用异步删除和管道技术提升性能。同时,选择合适的内存分配器如 Jemalloc 能有效减少碎片,确保系统在高负载下稳定运行,防止 OOM 错误发生。
Redis 如何做内存优化?
Redis 如何做内存优化?Redis 是一款高性能的 key-value 存储系统,广泛被用于构建各种实时应用。在这些应用中,内存往往是 Redis 最重要的资源。因为 Redis 中的每一个 key,以及它所相关联的值都需要在内存中保存。如果不小心使用过多的内存会导致 Redis 服务器停掉并且应用程序崩溃。Redis 本身提供了一系列配置、算法和工具来实现内存优化。下面将介绍以下几个方面的技术和策略:1、Redis 的内存模型 Redis 的内存处理方式是基于"in-memory data structures"即将所有的数据都存放在内存中。如果到达了内存上限,则会发生 OOM 错误。Redis 会进行周期性的内存回收,包括 - 及不限于以下几个方面:删除过期键值 根据 LRU(Least Recently Used) 算法淘汰长时间未使用的键/值 数据库压缩 2、开启内存压缩 在 Redis 默认的内存回收机制中,虽然会清除过期的键值对,但是只有在访问键值对时才会真正删除。而如果在存储大量短生命期的数据 (比如计数器),就容易出现内存占满的情况。为了防止这种情况,可以开启 Redis 内存压缩功能,让所有键值对占用的内存更加紧凑。通过 Redis 提供的 Ziplist 和 Intset 等编码来压缩字符串和整数类型的数据。这些接口可以有效地减少 Redis 服务器上的内存使用。3、压缩字符串类型值 字符串是 Redis 最基础数据类型之一,在 Redis 中,一个字符串是一个二进制安全的序列。当需要存储大量的字符串类型的数据时,我们可以使用这些技巧:对于一些小的字符串类型值,可以使用 Redis 中的短字符串 (short string) 作为其数据结构 对于大字符串类型值,可以使用 Redis 的 sds、zmalloc_malloc()、jemalloc 等工具实现内存分配,此外还可以设置 maxmemory 参数,以定义 Redis 实例所消耗的最大内存 4、选择合适的数据结构 在 Redis 中有多种类型的数据结构可供选择。不同的数据结构之间,虽然贮存相同的数据,但它们所需的内存量可能会存在显著的差异。因此,选择最小化所需内存的数据结构非常重要。例如:在将许多非常小的 hash 数据结构存储在 Redis 中时,如果要从这些数据去除必要的分隔符,就可以使用 zipmap 格式而非 hashtable。当元素数量非常稀疏时,可以选择使用稀疏矩阵来存储数据 在需要进行 2D 和 3D 索引,以及地理数据查询时,可以使用 GeoHash 5、优化写入性能 数据的读取和存取操作是 Redis 中的两个最基本操作。系统的写入性能往往直接决定着其实际的处理能力。在常规的运行中,写入操作会因为数据的吸盘而慢慢变慢。但是我们可以通过以下几个措施来最大程度的优化 Redis 的写入性能:(来自 2025 年 10 月 31 日的资料)
【架构实战】Redis 性能调优与内存优化策略 - 腾讯云开发者社区 - 腾讯云
一、Redis 性能瓶颈分析 Redis 虽然是内存数据库,但在高并发场景下仍可能出现性能问题:常见性能问题:大 Key 导致操作阻塞 热 Key 导致单节点压力过大 内存不足触发淘汰策略 持久化影响性能 网络带宽成为瓶颈 二、Redis 性能监控 1. INFO 命令 # 查看所有信息 redis-cli INFO # 查看内存信息 redis-cli INFO memory # 查看统计信息 redis-cli INFO stats # 查看客户端信息 redis-cli INFO clients 关键指标:展开 # 内存使用 used_memory: 1073741824 # 已使用内存 (字节) used_memory_human: 1.00G # 人类可读格式 used_memory_peak: 1073741824 # 内存使用峰值 mem_fragmentation_ratio: 1.2 # 内存碎片率 (>1.5 需关注) # 命中率 keyspace_hits: 1000000 # 命中次数 keyspace_misses: 10000 # 未命中次数 # 命中率 = hits / (hits + misses) # 连接数 connected_clients: 100 # 当前连接数 blocked_clients: 0 # 阻塞的客户端数 # 操作统计 total_commands_processed: 10000000 # 总命令数 instantaneous_ops_per_sec: 10000 # 当前 QPS 2. MONITOR 命令 3. SLOWLOG 慢日志 代码语言:Bash # 配置慢日志阈值 (微秒)redis-cli CONFIG SET slowlog-log-slower-than 10000 # 10ms# 查看慢日志 redis-cli SLOWLOG GET 10 # 输出示例 1) 1) (integer) 1 # 日志 ID2) (integer) 1704067200 # 执行时间戳 3) (integer) 15000 # 执行耗时 (微秒)4) 1) "KEYS"# 命令 2) "*" 4. 大 Key 扫描 代码语言:Bash # 扫描大 Key(不阻塞)redis-cli --bigkeys # 输出示例 Biggest string found so far 'product:1001'with 102400 bytes Biggest list found so far 'order:list'with 100000 items Biggest hashfound so far 'user:hash'with 50000 fields 三、大 Key 问题 1. 大 Key 的危害 大 Key(如 value > 10KB,list > 10000 元素) ↓操作耗时长 (如 DEL 一个 100 万元素的 list) ↓ Redis 单线程阻塞 ↓其他命令排队等待 ↓响应时间飙升 2. 大 Key 处理方案 方案 1:拆分大 Key 展开 // 原来:一个大 Hash 存储所有用户属性 hset user:1001name "张三"age 28phone "138" // 优化:按属性分组拆分 hset user:1001:basic name "张三"age 28hset user:1001:contact phone "138"email ""hset user:1001:address city "北京"district "朝阳" 方案 2:异步删除大 Key 代码语言:Bash # Redis 4.0+ 支持异步删除 redis-cli UNLINK big_key # 异步删除,不阻塞# 配置自动异步删除 redis-cli CONFIG SET lazyfree-lazy-(2026 年 4 月 13 日)
Redis 高性能内存管理揭秘:zmalloc 库、碎片化解决方案与 Jemalloc 实战
Redis 作为当今最流行的高性能键值存储系统,其核心优势在于将数据完全存储在内存中,通过单线程事件循环模型避免了多线程上下文切换的开销,实现了极高的读写性能。根据 2025 年 Redis 官方性能基准测试报告,在理想条件下 Redis 能够达到每秒超过 80 万次的读写操作,这一表现远超同类内存数据库,很大程度上得益于其持续优化的精细化内存管理机制。在内存数据库架构中,内存管理不仅是性能的基础,更是稳定性的保障。以一个典型电商平台为例,在促销活动期间,Redis 需要处理数百万个临时键值对的快速分配和回收,同时必须尽可能减少内存碎片,确保系统在长期高负载运行后仍能保持 85% 以上的内存利用率。这就引出了 Redis 内存管理中的两个关键组成部分:zmalloc 内存分配库和针对内存碎片化的解决方案。zmalloc 库是 Redis 自主研发的内存管理模块,封装了不同平台下的内存分配函数,提供了统一的内存分配接口。在 zmalloc.h 和 zmalloc.c 这两个核心文件中,Redis 定义了内存分配、释放和统计的相关函数。通过这层封装,Redis 不仅能够跨平台运行,还能在内存分配时添加额外的控制信息,比如记录分配大小、进行内存越界检测等。这种设计使得 Redis 在内存使用上更加可控,为性能优化提供了基础。内存碎片化是每个内存管理系统都必须面对的挑战。随着内存的不断分配和释放,系统中会出现大量不连续的小块空闲内存,虽然总空闲内存可能很多,但无法满足较大内存块的分配请求,这就是内存碎片化问题。Redis 通过多种策略来缓解这个问题,包括使用特定大小的内存池、定期内存整理等。这些策略的实现在 zmalloc 库中都有体现,比如通过预分配内存池来减少频繁的小内存分配请求。值得注意的是,Redis 在内存分配器的选择上展现了很大的灵活性。虽然默认使用 libc 的 malloc,但在高并发场景下,Redis 推荐使用 Jemalloc 或 TCMalloc 这类现代内存分配器。特别是 Jemalloc,它在多线程环境下的表现尤为出色,能够有效减少锁竞争,提高内存分配效率。从 Redis 6.0 开始,Jemalloc 已经成为 Redis 的默认内存分配器,这反映了 Redis 团队对内存性能优化的持续追求。在高性能背景下,Redis 的内存管理不仅要考虑分配效率,还要关注内存使用的透明性。zmalloc 库提供了详细的内存使用统计功能,包括已分配内存总量、内存碎片率等指标。这些指标对于监控和调优 Redis 实例至关重要,管理员可以通过这些数据来判断是否需要进内存碎片整理或者调整内存分配策略。(搜索结果收录于 2026 年 4 月 13 日)
怎么样更好的优化 Redis 性能?
怎么样更好的优化 Redis 性能?1、尽量使用短的 key 当然在精简的同时,不要为了 key 的“见名知意”。对于 value 有些也可精简,比如性别使用 0、1。2、避免使用 keys keys , 这个命令是阻塞的,即操作执行期间,其它任何命令在你的实例中都无法执行。当 redis 中 key 数据量小时到无所谓,数据量大就很糟糕了。所以我们应该避免去使用这个命令。可以去使用 SCAN,来代替。3、在存到 Redis 之前先把你的数据压缩下 redis 为每种数据类型都提供了两种内部编码方式,在不同的情况下 redis 会自动调整合适的编码方式。4、设置 key 有效期 我们应该尽可能的利用 key 有效期。比如一些临时数据 (短信校验码),过了有效期 Redis 就会自动为你清除!5、选择回收策略 (maxmemory-policy) 当 Redis 的实例空间被填满了之后,将会尝试回收一部分 key。根据你的使用方式,强烈建议使用 volatile-lru(默认) 策略——前提是你对 key 已经设置了超时。但如果你运行的是一些类似于 cache 的东西,并且没有对 key 设置超时机制,可以考虑使用 allkeys-lru 回收机制,具体讲解查看。maxmemory-samples 3 是说每次进行淘汰的时候 会随机抽取 3 个 key 从里面淘汰最不经常使用的 (默认选项)。maxmemory-policy 六种方式 : volatile-lru:只对设置了过期时间的 key 进行 LRU(默认值) allkeys-lru :是从所有 key 里 删除 不经常使用的 key volatile-random:随机删除即将过期 key allkeys-random:随机删除 volatile-ttl :删除即将过期的 noeviction : 永不过期,返回错误 6、使用 bit 位级别操作和 byte 字节级别操作来减少不必要的内存使用 bit 位级别操作:GETRANGE, SETRANGE, GETBIT and SETBIT byte 字节级别操作:GETRANGE and SETRANGE 7、尽可能地使用 hashes 哈希存储 8、当业务场景不需要数据持久化时,关闭所有的持久化方式可以获得最佳的性能 数据持久化时需要在持久化和延迟/性能之间做相应的权衡。9、想要一次添加多条数据的时候可以使用管道 10、限制 redis 的内存大小 (64 位系统不限制内存,32 位系统默认最多使用 3GB 内存) 数据量不可预估,并且内存也有限的话,尽量限制下 redis 使用的内存大小,这样可以避免 redis 使用 swap 分区或者出现 OOM 错误。(使用 swap 分区,性能较低,如果限制了内存,当到达指定内存之后就不能添加数据了,否则会报 OOM 错误。可以设置 maxmemory-policy,内存不足时删除数据) 11、SLOWLOG [get/reset/len] slowlog-log-slower-than 它决定要对执行时间大于多少微秒 (microsecond,1 秒 = 1,000,000 微秒) 的命令进行记录。(2025 年 12 月 21 日的资料)
FAQ
Redis 内存碎片率过高怎么办?
可以通过重启实例或配置 activedefrag yes 来主动整理碎片,同时建议使用 Jemalloc 分配器。
如何避免大 Key 导致的阻塞?
使用 UNLINK 异步删除大 Key,或将大 Key 拆分为多个小 Key 存储,避免单次操作耗时过长。
Redis 内存满了会发生什么?
根据 maxmemory-policy 配置,可能会淘汰旧数据或拒绝写入,需合理设置淘汰策略防止 OOM。