Redis内存优化技巧有哪些?如何设置过期时间和淘汰策略

 更新时间:2026年08月28日 08:44:39   作者:qq_65709394  
还在为Redis内存占用高和性能瓶颈发愁吗?本文为你详细讲解Redis内存优化技巧,包括数据结构选择、过期时间设置和淘汰策略;同时分享性能优化方法,如批量操作和连接池调优,更有集群分片、主从复制和故障切换的实战指南,助你构建高性能高可用的Redis架构

一、内存优化

1.1 优化数据结构和存储方式

使用合适的数据类型:例如,在存储用户的点赞列表时,如果只需要记录点赞与否,使用 Redis 的 Set 数据结构比使用 List 更节省空间。Set 存储元素是无序且不重复的,而 List 会存储所有元素,包括重复的。对于一些有过期时间的简单键值对数据,考虑使用带有过期时间的 String 类型,避免数据长期占用内存。

数据压缩:如果存储的数据有一定的规律或者冗余,如存储大量日志信息,且日志格式相对固定,可以考虑在将数据存入 Redis 之前进行压缩。在读取数据时再进行解压。例如,可以使用 Snappy 或 LZ4 等高效的压缩算法。不过要注意压缩和解压带来的 CPU 开销。

1.2 设置合理的过期时间和淘汰策略

过期时间策略:检查 Redis 中所有键的过期时间设置。对于那些不再需要长期保存的数据,如临时的用户登录验证码、缓存的热点新闻等,合理设置较短的过期时间。例如,用户登录验证码可以设置为 5 - 10 分钟过期。

淘汰策略选择:Redis 提供了多种淘汰策略,如noeviction(不淘汰,当内存满时写入操作会报错)、volatile - lru(从设置了过期时间的键中使用最近最少使用算法淘汰)、allkeys - lru(从所有键中使用最近最少使用算法淘汰)等。根据业务场景选择合适的淘汰策略。如果业务允许部分数据丢失,且数据访问有冷热之分,像缓存系统,allkeys - lru可能是一个比较好的选择。它会优先淘汰那些最近最少使用的键,为新的数据腾出空间。

二、性能优化

2.1 减少不必要操作和命令

批量操作:如果需要对多个键进行相同的操作,如同时获取多个用户的缓存信息,尽量使用批量操作命令(如MGET、MSET),而不是逐个发送命令。这样可以减少网络开销和 Redis 处理单个命令的开销。例如,一次获取 10 个用户的缓存配置信息,使用MGET命令比发送 10 个单独的GET命令效率更高。

避免复杂的命令和事务:减少使用复杂度高的命令,如SORT命令,因为它的执行成本较高。对于事务操作,确保事务中的操作是必要的,因为事务会占用一定的资源。如果只是简单的读写操作,能不使用事务就尽量不使用。

2.2 优化网络和连接池

网络带宽优化:检查 Redis 服务器的网络带宽使用情况。如果发现网络带宽接近饱和,可以考虑增加网络带宽或者优化网络拓扑结构。例如,将 Redis 服务器迁移到更高带宽的网络环境中,或者使用更高效的网络设备。

连接池设置:在客户端应用程序中,合理设置连接池的大小。如果连接池过大,会浪费资源;如果过小,会导致频繁地创建和销毁连接,影响性能。通过性能测试,确定一个合适的连接池大小,使得客户端能够高效地与 Redis 服务器进行通信。例如,根据应用程序的并发请求量和 Redis 服务器的处理能力,设置连接池大小为 100 - 200 之间。

三、集群和分布式优化

3.1 数据分片和集群扩展

3.1.1 数据分片原理与实现方式

哈希分片:这是一种常见的数据分片方法。例如,Redis Cluster 使用哈希槽(Hash Slot)来实现数据分片。Redis Cluster 共有 16384 个哈希槽,当向 Redis 写入一个键值对时,通过对键进行 CRC16 算法计算得到一个哈希值,再将这个哈希值对 16384 取模,得到这个键应该存储在哪个哈希槽中。不同的 Redis 节点负责不同范围的哈希槽,这样就将数据均匀地分布到了各个节点上。这种方式可以有效地将数据负载分散,避免单个节点存储过多的数据。

范围分片:根据数据的范围来划分存储节点。比如,对于一个存储用户订单数据的 Redis 集群,可以按照订单编号的范围来划分。将订单编号在 1 - 10000 的存储在一个节点,10001 - 20000 的存储在另一个节点,以此类推。不过这种方式可能会导致数据分布不均匀,因为数据的增长可能不是均匀分布在各个范围内的。

3.1.2  集群扩展策略与注意事项

节点增加流程:当需要扩展 Redis 集群时,首先要准备新的 Redis 节点。以 Redis Cluster 为例,在添加新节点后,需要将部分哈希槽从其他节点迁移到新节点上。这个过程可以通过 Redis - CLI 等工具来操作,将指定范围的哈希槽从源节点移动到新节点。在迁移过程中,要注意对业务的影响,尽量选择在业务低峰期进行操作。

数据重新分布影响:数据重新分布会消耗一定的网络资源和 Redis 节点的 CPU 资源。因为在迁移哈希槽的过程中,需要将数据从一个节点复制到另一个节点。同时,在数据重新分布期间,应用程序对 Redis 的读写操作可能会受到一定程度的影响,例如,部分键可能在短时间内无法正常读取或者写入,需要做好相应的缓存策略和降级方案,以应对可能出现的问题。

3.2 主从复制和读写分离

3.2.1 主从复制架构与工作原理

全量复制与部分复制:在 Redis 主从复制中,从节点会向主节点发送同步请求。一开始,主节点会将自己的全部数据发送给从节点,这是全量复制。之后,主节点在执行写操作时,会将写命令发送给从节点,从节点会执行相同的写命令来保持与主节点的数据同步,这是部分复制。例如,主节点接收到一个SET key value的命令,会将这个命令发送给所有的从节点,从节点也会执行这个命令来更新自己的数据。

数据一致性保证:通过这种主从复制机制,可以在一定程度上保证数据的一致性。但是,由于网络延迟等因素,从节点的数据更新可能会有一定的延迟。为了减少这种延迟对业务的影响,可以通过优化网络环境、增加主从节点之间的心跳检测频率等方式来提高数据同步的及时性。

3.2.2 读写分离实现与性能提升效果

读写分离配置方式:在应用程序端,可以通过配置连接池或者使用代理服务器来实现读写分离。例如,将读操作的请求发送到从节点,写操作的请求发送到主节点。在 Spring Boot 应用中,可以通过配置数据源来实现,对读操作使用从节点的数据源,对写操作使用主节点的数据源。

性能提升效果:由于读操作通常在应用程序中占比较大的比例,通过读写分离,将读操作的负载分散到多个从节点上,可以显著提高系统的整体性能。假设一个电商系统,商品详情页的访问是大量的读操作,通过将这些读操作分配到多个 Redis 从节点上,可以大大提高商品详情页的加载速度,提升用户体验。

3.3 监控和故障切换机制

监控指标与工具:需要对主从节点进行实时监控,主要监控指标包括主节点的写操作频率、从节点的读操作频率、主从节点之间的延迟、节点的内存使用情况等。可以使用 Redis - Sentinel 等工具来进行监控。Redis - Sentinel 可以监控 Redis 主从节点的健康状态,当主节点出现故障时,它可以自动发现并进行故障切换。

故障切换过程与影响:当主节点出现故障时,Redis - Sentinel 会选举一个从节点作为新的主节点。这个过程中,应用程序对 Redis 的写操作可能会短暂中断,需要在应用程序中做好相应的重试机制或者降级策略。同时,新的主节点需要尽快与其他从节点完成数据同步,以保证数据的一致性。在故障切换后,要及时对故障节点进行修复和重新加入集群的操作。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Redis实现排名功能的示例代码

    Redis实现排名功能的示例代码

    本文主要介绍了Redis实现排名功能的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 关于redis Key淘汰策略的实现方法

    关于redis Key淘汰策略的实现方法

    下面小编就为大家带来一篇关于redis Key淘汰策略的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 一文弄懂Redis Stream消息队列

    一文弄懂Redis Stream消息队列

    本文主要介绍了一文弄懂Redis Stream消息队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Redis连接池配置方式

    Redis连接池配置方式

    文章介绍了Redis连接池的配置方法,包括与数据库连接时引入连接池的必要性、Java中使用Redis连接池的示例、jar包准备、编写配置代码以及连接池参数的设置
    2024-12-12
  • Redis进行验证码登录的项目实践

    Redis进行验证码登录的项目实践

    本文主要介绍了Redis进行验证码登录的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-09-09
  • 通过kubesphere部署redis的方法

    通过kubesphere部署redis的方法

    这篇文章主要介绍了通过kubesphere部署redis的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 64位Windows下安装Redis教程

    64位Windows下安装Redis教程

    这篇文章主要介绍了64位Windows下安装Redis教程,本文使用Microsoft Open Tech group 在 GitHub上开发的一个Win64版本的Redis,需要的朋友可以参考下
    2014-09-09
  • Redis高阶之容错切换的实现

    Redis高阶之容错切换的实现

    本文主要介绍了Redis高阶之容错切换的实现,当一台主节点宕机后,从节点会自动接管成为新的主节点,当原主节点恢复后,它不会自动成为主节点,需要通过手动操作将其重新设置为从节点,感兴趣的可以了解一下
    2025-02-02
  • Redis+PHP实现用户消息推送每天最多通知2次的功能

    Redis+PHP实现用户消息推送每天最多通知2次的功能

    在开发应用程序中,经常需要向用户推送消息通知,但是为了避免过多的打扰用户,我们希望限制每天最多通知2次,本篇博文将介绍如何使用PHP和Redis实现这一功能,文中有详细的代码示例,需要的朋友可以参考下
    2023-10-10
  • 浅谈Redis的几个过期策略

    浅谈Redis的几个过期策略

    在使用redis时,一般会设置一个过期时间,当然也有不设置过期时间的,也就是永久不过期。当设置了过期时间,redis是如何判断是否过期,以及根据什么策略来进行删除的。
    2021-05-05

最新评论