Redis 缓存的高效方法主要包括合理设置过期时间、选择合适的淘汰策略(如 allkeys-lru)、解决缓存穿透/击穿/雪崩问题(如空值缓存、互斥锁、逻辑过期)、优化数据结构(使用 Hash 代替 String)、避免大 Key 以及使用 Pipeline 批量操作。选择缓存策略时,应根据业务场景区分冷热数据,热点数据采用主动更新或逻辑过期,一般数据采用 TTL 过期,同时需监控内存使用率和命中率,确保缓存容量合理配置,避免内存交换导致性能下降。
【黑马点评日记 02】Redis 缓存优化:商户查询性能提升百倍
本文介绍了商户查询缓存功能的实现原理与应用场景。首先阐述了缓存的基本概念,通过做饭和冰箱的类比形象说明了缓存的作用。文章详细分析了缓存的优势 (提升性能、减轻数据库压力) 和挑战 (数据一致性、缓存穿透等),并比较了本地缓存与 Redis 缓存的区别。在技术实现部分,提供了完整的代码示例展示如何为商铺信息和类型添加 Redis 缓存,包括查询逻辑和更新策略。重点讲解了三种缓存更新策略 (主动更新、TTL 过期、双写模式),推荐采用"先更新数据库再删除缓存"的最佳实践以避免数据不一致问题。最后总结了不同缓存策略的适用场景,强调主动更新策略在保证数据一致性方面的优势。商户查询缓存功能:什么是缓存:简单说,缓存就是临时存储数据的地方,目的是为了以后能更快地获取它。想象一下:没有缓存:就像每次做饭都要从种菜、养猪开始,效率极低。有缓存:就像把做好的饭菜放在冰箱里,饿了直接拿出来热一下就能吃,又快又方便。在计算机世界里,CPU 有缓存,浏览器有缓存,而黑马点评项目用的就是 Redis 缓存,用来存储像商铺信息、用户会话这类数据。缓存的核心原理:快慢分层 计算机存储是一个金字塔结构,越往上越快,但容量越小、成本越高。L1/L2/L3 缓存:速度极快 (纳秒级),集成在 CPU 内部。内存 (如 Redis):速度快 (微秒级),容量较大。硬盘 (如 MySQL):速度慢 (毫秒级),容量巨大。缓存的目标就是:把最常用的数据从慢速的硬盘 (MySQL) 搬到快速的内存 (Redis) 中,从而加速访问。使用缓存的好处 1. 性能飙升,用户体验好 读内存:通常只需几十微秒 读硬盘:通常需要几毫秒甚至几十毫秒 差距:内存比硬盘快 100-1000 倍。用户打开页面从等 2 秒变成瞬间打开。2. 减轻数据库压力,系统更稳 数据库的连接数是有限的 (比如 200 个)。如果没有缓存,所有请求都冲击数据库,很容易把数据库压垮。有了缓存后,80% 以上的读请求都被缓存拦截,数据库的压力骤降,系统更稳定。3. 应对高并发,支撑大流量 像双 11 这样的场景,每秒百万级请求,数据库根本无法承受。(撰于 2026 年 4 月 22 日)
Redis 缓存淘汰策略
在使用 Redis 时,我们一般会为 Redis 的缓存空间设置一个大小,不会让数据无限制的放入 Redis 缓存。对于 Redis 来说,一旦确定了缓存最大容量,比如 4GB,你就可以使用下面这个命令来设定缓存的大小了:CONFIG SET maxmemory 4gb Redis 设置了缓存的容量大小,那么缓存被写满是不可避免的。我们需要面对缓存写满时的替换操作。缓存替换需要解决两个问题:决定淘汰哪些数据,如何处理那些被淘汰的数据。Redis 有哪些淘汰策略 Redis 共提供了 8 中缓存淘汰策略,其中 volatile-lfu 和 allkeys-lfu 是 Redis 4.0 版本新增的。noevction:一旦缓存被写满了,再有写请求来时,Redis 不再提供服务,而是直接返回错误。Redis 用作缓存时,实际的数据集通常都是大于缓存容量的,总会有新的数据要写入缓存,这个策略本身不淘汰数据,也就不会腾出新的缓存空间,我们不把它用在 Redis 缓存中。volatile-ttl 在筛选时,会针对设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除。volatile-random 就像它的名称一样,在设置了过期时间的键值对中,进行随机删除。volatile-lru 会使用 LRU 算法 (下文具体介绍) 筛选设置了过期时间的键值对。volatile-lfu 会使用 LFU 算法 (下文具体介绍) 选择设置了过期时间的键值对。allkeys-random 策略,从所有键值对中随机选择并删除数据。allkeys-lru 策略,使用 LRU 算法在所有数据中进行筛选。allkeys-lfu 策略,使用 LFU 算法在所有数据中进行筛选。通常情况下推荐优先使用 allkeys-lru 策略。这样,可以充分利用 LRU 这一经典缓存算法的优势,把最近最常访问的数据留在缓存中,提升应用的访问性能。如果你的业务数据中有明显的冷热数据区分,我建议你使用 allkeys-lru 策略。如果业务应用中的数据访问频率相差不大,没有明显的冷热数据区分,建议使用 allkeys-random 策略,随机选择淘汰的数据就行。Redis 中的 LRU 和 LFU 算法 LRU 算法 LRU 算法的全称是 Least Recently Used,从名字上就可以看出,这是按照最近最少使用的原则来筛选数据,最不常用的数据会被筛选出来,而最近频繁使用的数据会留在缓存中。LRU 会把所有的数据组织成一个链表,链表的头和尾分别表示 MRU 端和 LRU 端,分别代表最近最常使用的数据和最近最不常用的数据。我们看一个例子。如果有一个新数据 45 要被写入缓存,但此时已经没有缓存空间了,也就是链表没有空余位置了,那么,LRU 算法做两件事:数据 45 是刚被访问的,所以它会被放到 MRU 端;算法把 LRU 端的数据 5 从缓存中删(消息于 2026 年 4 月 11 日发布)
【黑马点评日记】封装 Redis 缓存工具类:三大方案全解析
摘要:整体来说就是把我们之前对一个业务的操作抽象出一个类,然后从特殊性到普遍性。本文介绍了 Redis 缓存工具类的设计与实现,重点解决缓存穿透、击穿和雪崩三大问题。通过泛型化和函数式接口实现通用性,提供三种核心方案:空值缓存应对穿透、互斥锁防止击穿、逻辑过期优化性能。工具类采用包装类存储逻辑过期时间,支持异步更新和双检机制,并详细对比了各方案的适用场景。文章还包含线程池配置、死锁预防等注意事项,以及形象化的快递柜比喻帮助理解。该工具类可灵活应用于店铺查询等场景,实现高性能缓存管理。Redis 缓存工具类全解析 一、整体架构概览 这个工具类解决三个核心问题:缓存穿透:查询不存在的数据,绕过缓存直接打数据库 缓存击穿:热点数据过期,大量请求同时打到数据库 缓存雪崩:大量缓存同时过期 (工具类未直接处理,通过设置随机过期时间解决) 二、核心数据结构 RedisData 包装类 代码语言:javascript AI 代码解释 java public class RedisData { private LocalDateTime expireTime; // 逻辑过期时间 private Object data; // 实际数据 } 为什么需要这个包装类?传统 Redis 过期是物理删除 (时间到了自动删),逻辑过期是自己维护过期标志:代码语言:javascript AI 代码解释 json // 存入 Redis 的实际格式 { "expireTime": "2024-12-31T23:59:59", "data": {"id": 1, "name": "海底捞"} } 好处:过期不删除数据,还能继续用旧数据 可以异步刷新,不影响用户请求(搜索结果收录于 2026 年 4 月 22 日)
Redis 性能优化 18 招
redis 性能优化的方法有哪些?如何提高 redis 的响应速度?redis 内存管理如何优化?前言 redis 作为一个高性能的键值存储系统,在现代应用中扮演着越来越重要的角色。无论是在 web 应用,移动应用,游戏还是 大数据分析 等领域,redis 都能提供快速的数据访问速度和优秀的性能。然而,随着数据量的不断增长,如何优化 redis 的性能成为了一个重要的课题。这篇文章将分享 redis 性能优化的 18 招,希望对你会有所帮助。选择合适的数据结构 redis 支持多种 数据结构,包括字符串,哈希,列表,集合,有序集合等。选择合适的数据结构可以提高性能和存储效率。例如,如果要存储用户信息,使用哈希结构而不是多个字符串可以更高效地存储和访问多个属性:代码语言:javascript ai 代码解释 jedis . hset ( "user:1001" , "name" , "alice" ) ; jedis . hset ( "user:1001" , "age" , "30" ) ; 这样可以减少内存的使用,并且提高数据操作的效率。避免使用过大的 key 和 value 过长的 key 和 value 会占用更多的内存空间,并且可能影响性能。保持 key 简短,并使用简洁的命名约定。例如,将"user:1001:profile"简化为"u:1001:p"。此外,还可以考虑对 value 进行压缩,以减少存储空间的占用。使用 redis pipeline 对多个命令的批量操作,使用 pipeline 可以显著降低 网络延迟,提升性能.pipeline 允许客户端一次发送多个命令,服务器 端集中处理后一次性返回结果,减少了网络往返次数。例如,批量设置 key 可以这样做:代码语言:javascript ai 代码解释 pipeline p = jedis . pipelined ( ) ; for ( int i = 0 ; i < 1000 ; i ++ ) redis 性能优化的 18 招(来自 2024 年 12 月 10 日的资料)
FAQ
Redis 缓存穿透如何解决?
可以通过空值缓存应对穿透,即查询不存在的数据也写入缓存(空值),并设置较短过期时间。
什么是缓存击穿?
缓存击穿是指热点数据过期,大量请求同时打到数据库,可通过互斥锁防止。
如何选择 Redis 淘汰策略?
如果有明显冷热数据区分建议使用 allkeys-lru 策略,如果没有明显区分建议使用 allkeys-random 策略。