Redis长时间运行内存增加怎么优化?读取延迟问题怎么解决?内存管理清理策略有哪些?

文章导读
针对 Redis 长时间运行内存增加,可通过开启内存压缩、设置 maxmemory 配合 LRU 淘汰策略、定期清理过期 key 及使用 lazy free 异步删除大键来优化。读取延迟问题主要通过慢日志定位高复杂度命令、避免大 key 操作、使用 Pipeline 减少网络往返及优化网络链路解决。内存管理清理策略包括配置主动过期删除、被动过期删除、启用 LRU/LFU 淘汰算法、监控内存碎片率并
📋 目录
  1. Redis 实战:延迟问题排障指南
  2. Redis 如何做内存优化?
  3. 《吐血整理》Redis 性能优化的 13 条军规!史上最全
  4. 有哪些办法可以降低 Redis 的内存使用情况?
  5. FAQ
A A

针对 Redis 长时间运行内存增加,可通过开启内存压缩、设置 maxmemory 配合 LRU 淘汰策略、定期清理过期 key 及使用 lazy free 异步删除大键来优化。读取延迟问题主要通过慢日志定位高复杂度命令、避免大 key 操作、使用 Pipeline 减少网络往返及优化网络链路解决。内存管理清理策略包括配置主动过期删除、被动过期删除、启用 LRU/LFU 淘汰算法、监控内存碎片率并进行重启或碎片整理,同时避免使用 swap 交换分区以确保性能稳定。

Redis 实战:延迟问题排障指南

的实际使用过程中,我们经常会面对以下的场景:在 redis 上执行同样的命令,为什么有时响应很快,有时却很慢为什么 redis 执行 get、set、del 命令耗时也很久为什么我的 redis 突然慢了一波,之后又恢复正常了为什么我的 redis 稳定运行了很久,突然从某个时间点开始变慢了 这时我们还是需要一个全面的排障流程,不能无厘头地进行优化;全面的排障流程可以帮助我们找到真正的根因和性能瓶颈,以及实施正确高效的优化方案 这篇文章我们就从可能导致 redis 延迟的方方面面开始,逐步深入排障深水区,以提供一个「全面」的 redis 延迟问题排查思路需要了解的词 copy on write cow 是一种建立在虚拟内存重映射技术之上的技术,因此它需要 mmu 的硬件支持,mmu 会记录当前哪些内存页被标记成只读,当有进程尝试往这些内存页中写数据的时候,mmu 就会抛一个异常给操作系统内核,内核处理该异常时为该进程分配一份物理内存并复制数据到此内存地址,重新向 mmu 发出执行该进程的写操作 内存碎片 操作系统负责为每个进程分配物理内存,而操作系统中的虚拟内存管理器保管着由内存分配器分配的实际内存映射 如果我们的应用程序需求 1gb 大小的内存,内存分配器将首先尝试找到一个连续的内存段来存储数据;如果找不到连续的段,则分配器必须将进程的数据分成多个段,从而导致内存开销增加

Redis 如何做内存优化?

Redis 本身提供了一系列配置、算法和工具来实现内存优化。下面将介绍以下几个方面的技术和策略:1、Redis 的内存模型 Redis 的内存处理方式是基于"in-memory data structures"即将所有的数据都存放在内存中。如果到达了内存上限,则会发生 OOM 错误。Redis 会进行周期性的内存回收,包括 - 及不限于以下几个方面:删除过期键值 根据 LRU(Least Recently Used) 算法淘汰长时间未使用的键/值 数据库压缩 2、开启内存压缩 在 Redis 默认的内存回收机制中,虽然会清除过期的键值对,但是只有在访问键值对时才会真正删除。而如果在存储大量短生命期的数据 (比如计数器),就容易出现内存占满的情况。为了防止这种情况,可以开启 Redis 内存压缩功能,让所有键值对占用的内存更加紧凑。通过 Redis 提供的 Ziplist 和 Intset 等编码来压缩字符串和整数类型的数据。这些接口可以有效地减少 Redis 服务器上的内存使用。

《吐血整理》Redis 性能优化的 13 条军规!史上最全

Redis 是基于单线程模型实现的,也就是 Redis 是使用一个线程来处理所有的客户端请求的,尽管 Redis 使用了非阻塞式 IO,并且对各种命令都做了优化 (大部分命令操作时间复杂度都是 O(1)),但由于 Redis 是单线程执行的特点,因此它对性能的要求更加苛刻,本文我们将通过一些优化手段,让 Redis 更加高效的运行。本文我们将使用以下手段,来提升 Redis 的运行速度:缩短键值对的存储长度;使用 lazy free(延迟删除) 特性;设置键值的过期时间;禁用长耗时的查询命令;使用 slowlog 优化耗时命令;使用 Pipeline 批量操作数据;避免大量数据同时失效;客户端使用优化;使用物理机而非虚拟机安装 Redis 服务;检查数据持久化策略;禁用 THP 特性;1.缩短键值对的存储长度 键值对的长度是和性能成反比的,比如我们来做一组写入数据的性能测试,执行结果如下:从以上数据可以看出,在 key 不变的情况下,value 值越大操作效率越慢,因为 Redis 对于同一种数据类型会使用不同的内部编码进行存储,比如字符串的内部编码就有三种:int(整数编码)、raw(优化内存分配的字符串编码)、embstr(动态字符串编码),这是因为 Redis 的作者是想通过不同编码实现效率和空间的平衡,然而数据量越大使用的内部编码就越复杂,而越是复杂的内部编码存储的性能就越低。

有哪些办法可以降低 Redis 的内存使用情况?

在使用 Redis 时,随着数据量的不断增长,需要考虑如何降低 Redis 的内存占用情况。下面将介绍 Redis 降低内存使用的常见方法。1、清除过期 key 一般来说,Redis 中的 key 都有一个过期时间 (TTL),当一个 key 到达了过期时间后,Redis 会自动把它删除掉。如果切实情况下发现过期 key 很少被清理,可以通过手动扫描和清理的方式解决该问题。可以通过手动执行 DEL 命令或者设置自动定时清理已标记为过期的键值对。2、开启压缩机制 开启 Redis 的压缩机制是减少内存占用的一种有效方式。开启后,数据将被压缩后存储,Redis 就可以使用更小的空间来存储相同数量的数据。但是,在压缩数据时使用 CPU 势必会带来一定的系统负荷。因此,在开启前应该进行全面评估。3、启用 LRU 算法 大规模使用设置 Redis 的 maxmemory 属性最好开启 LRU 超出时删除策略,以确保 Redis 服务器不会无限添加项目并从而导致内存耗尽。Redis 可以根据“最近最少的访问时间”(Least Recently Used) 算法,删除过时的、很久没有使用过的键值对。

FAQ

Redis 内存碎片率过高如何优化?

Redis长时间运行内存增加怎么优化?读取延迟问题怎么解决?内存管理清理策略有哪些?

可以通过重启实例释放碎片,或者在业务低峰期使用 MEMORY PURGE 命令,同时检查是否开启了 THP 特性并禁用它,避免操作系统层面的内存管理干扰。

如何定位 Redis 读取延迟高的具体命令?

可以通过配置 slowlog-log-slower-than 阈值,然后使用 SLOWLOG GET 命令查看慢日志记录,分析耗时较长的命令及其参数,从而定位性能瓶颈。

删除大 Key 为什么会导致 Redis 阻塞?

因为 Redis 是单线程模型,删除大 Key 需要释放大量内存空间,这个同步操作会阻塞主线程处理其他请求,建议使用 UNLINK 命令进行异步删除。