Redis的缓存机制用法及说明

 更新时间:2026年03月16日 15:40:52   作者:灰阳阳  
Redis缓存可以有效提高高并发场景下的数据库性能,通过定期生成热数据、实时生成热数据、缓存淘汰策略以及解决缓存预热、穿透、雪崩和击穿等问题,可以更好地利用Redis缓存

Redis缓存介绍

在高并发的场景下,直接使用传统的面向内存的数据库,资源开销会非常大,性能也非常低,数据库服务器很容易崩溃。因此可以把一些经常用到的数据(热数据:使用频率很高,但是占总数据量较少)统一放到Redis中,当客户端查询时,先查询Redis,查询不到,再去查询数据库。

这便是Redis缓存,它就像一个保护罩,为数据库抵达掉了大部分请求:

那么问题就来了:

  • 我们怎么知道那些数据是热数据?
  • 怎么保证Redis中存储的一直都是热数据?

以上便是我们接下来要讨论的问题。

缓存策略

1)定期生成

每个一定的周期,对于访问数据库数据的频率进行统计,选出前N%的数据,放到Redis缓存中。

这种方式操作最简单,对于数据的掌控也更加稳定。缺点也很明显,就是时效性非常低。

2)实时生成

先给缓存设定容量上限(可以通过 Redis 配置⽂件的 maxmemory 参数设定)。

接下来按照这个流程执行:

  1. 先从Redis中查询,查到了直接返回
  2. 查不到从数据库中查,返回结果的同时,把这个数据写入Redis

当缓存达到上线,我们根据可靠的缓存淘汰策略,删除Redis中相对不那么“热”的数据。以此达到热数据的动态平衡。

3)缓存淘汰策略

包括但不限于Redis,缓存淘汰策略基本上涵盖了以下这四点:

  1. FIFO (First In First Out) 先进先出
    把缓存中存在时间最久的 (也就是先来的数据) 淘汰掉
  2. LRU (Least Recently Used) 淘汰最久未使用的
    记录每个 key 的最近访问时间. 把最近访问时间最老的 key 淘汰掉
  3. LFU (Least Frequently Used) 淘汰访问次数最少的
    记录每个 key 最近⼀段时间的访问次数. 把访问次数最少的淘汰掉
  4. Random 随机淘汰
    从所有的 key 中抽取幸运⼉淘汰掉

Redis中提供的缓存淘汰策略:

  • volatile-lru
    当内存不足以容纳新写入数据时,从设置了过期时间的 key 中使用 LRU(最近最少使用)算法进行淘汰。

  • allkeys-lru
    当内存不足以容纳新写入数据时,从所有 key 中使用 LRU(最近最少使用)算法进行淘汰。

  • volatile-lfu
    4.0 版本新增,当内存不足以容纳新写入数据时,在过期期的 key 中,使用 LFU 算法进行淘汰 key。

  • allkeys-lfu
    4.0 版本新增,当内存不足以容纳新写入数据时,从所有 key 中使用 LFU 算法进行淘汰。

  • volatile-random
    当内存不足以容纳新写入数据时,从设置了过期时间的 key 中,随机淘汰数据。

  • allkeys-random
    当内存不足以容纳新写入数据时,从所有 key 中随机淘汰数据。

  • volatile-ttl
    在设置了过期时间的 key 中,根据过期时间的剩余大小,提前淘汰剩余时间最短的 key(相当于 FIFO,只要过期最早的 key)。

  • noeviction
    默认策略,当内存不足以容纳新写入数据时,新写入操作会报错

Redis中的缓存淘汰策略也都是围绕LCU,LFU来进行的,只不过分为allkeys(全部数据)和volatile(设置过期时间的数据)

缓存中需要考虑的问题

1)缓存预热

试想以下,加入Redis刚启动,里面还没有任何数据写入,那么发过来的请求,直接就进入到了数据库中,数据库仍然会面临很大的压力。

解决办法很简单,就是按照定期生成热数据的方式,把热数据先写入Redsi。即使时效性不高,能为数据库(如MySQL)抵挡大部分请求就可以。

2)缓存穿透 (Cache penetration)

定义:

  • 由于发送过来的key是无效的。
  • 数据库和Redis缓存中肯定都没有,频繁的这种无效key请求,一定会压垮数据库。

产生原因:

  • 业务代码出现漏洞,对参数的校验出了问题
  • 开发/运维不小心删除了某个热数据key,自己却没有发现
  • 黑客恶意攻击

解决办法:

  • 针对数据库查询的参数进行严格校验,避免无效key请求
  • 对于数据库中不存在的key,在Redis缓存中设置一个""值,直接拦截非法key请求
  • 使用布隆过滤器,判定key是否存储在,存在才进行查询

布隆过滤器

  • 是一种高效查询元素是否存在的数据结构。
  • 简单的可以认为是hash+位图方式实现,不存储实际值,占用的内存很少

3)缓存雪崩(Cache avalanche)

定义:

  • 短时间内大量key同时过期,导致数据库查询操作激增

出现原因:

  • 设置key,时使用了统一的过期时间

解决办法:

  • 不给key添加过期时间或者添加随机过期时间因子

4) 缓存击穿(Cache breakdown)

定义:

  • 缓存雪崩是大量key同时失效,Cache breakdown是某一个或者多个热数据的key失效。而这些热数据访问频率很高,导致数据库查询次数激增
  • 在 Redis 和缓存系统的语境下,“缓存 Breakdown”通常指 缓存击穿

简单来说,就是某一个热点 Key(比如双 11 的秒杀商品)在过期的瞬间,同时有海量的请求打过来。因为缓存失效了,这些请求会像洪流一样直接冲向数据库,可能导致数据库瞬间宕机。

处理这个问题,核心思路只有两个:不让请求全都去查数据库,或者干脆不让热点 Key 过期

1. 设置互斥锁 (Mutex Lock)

这是最常用的方案。当缓存失效时,不是每个请求都去查数据库,而是先让请求尝试获取一个“锁”(通常用 Redis 的 SETNX 命令)。

  • 原理:只有拿到锁的那个请求能去数据库查数据并回写缓存,其他没拿到锁的请求要么等待重试,要么返回空值。
  • 优点:保证了数据库的安全性,数据一致性高。
  • 缺点:代码逻辑稍微复杂,且在高并发下会有一定的等待延迟。

2. 热点数据“永不过期”

从物理上或者逻辑上让这个 Key 永远存在。

  • 物理永不过期:在 SET 的时候不设置过期时间。这种方式最稳,但占用内存且无法自动更新。
  • 逻辑永不过期(后台异步更新):给数据设置一个逻辑上的过期时间(存放在 Value 里)。
  • 当程序发现逻辑时间快到期时,由一个后台线程异步去数据库更新这个 Key,并延长逻辑时间。
  • 在更新完成前,所有请求继续读取旧的数据。

总结

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

相关文章

  • redis实现分布式session的解决方案

    redis实现分布式session的解决方案

    session存放在服务器,关闭浏览器不会失效,本文主要介绍了redis实现分布式session的解决方案,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • php结合redis实现高并发下的抢购、秒杀功能的实例

    php结合redis实现高并发下的抢购、秒杀功能的实例

    下面小编就为大家带来一篇php结合redis实现高并发下的抢购、秒杀功能的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • Redis Cluster的图文讲解

    Redis Cluster的图文讲解

    今天小编就为大家分享一篇关于Redis Cluster的图文讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 浅谈Redis的几个过期策略

    浅谈Redis的几个过期策略

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

    使用Redis的List实现缓存分页信息

    Redis List 是基于双向链表实现的有序集合(按插入顺序排序),借助 lrange 命令可快速实现分页查询,相比传统数据库(如 MySQL)的 limit offset 分页,Redis List 分页在热点数据、小范围分页场景下性能更稳定,本文给大家介绍了如何使用Redis的List实现缓存分页信息
    2026-02-02
  • Linux上安装Redis详细教程

    Linux上安装Redis详细教程

    这篇文章主要给大家详细介绍了在Linux上安装Redis详细教程,文中有详细的代码示例和安装步骤,对我们学习安装redis有一定的帮助,需要的朋友可以参考下
    2023-07-07
  • Redis集群的三种部署方式及三种应用问题的处理

    Redis集群的三种部署方式及三种应用问题的处理

    这篇文章主要介绍了Redis集群的三种部署方式及三种应用问题的处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Redis缓存问题与缓存更新机制详解

    Redis缓存问题与缓存更新机制详解

    本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更新策略和内存淘汰机制,并对比了它们的优缺点
    2025-01-01
  • Redis Cluster集群收缩主从节点详细教程

    Redis Cluster集群收缩主从节点详细教程

    集群收缩的源端就是要下线的主节点,目标端就是在线的主节点,这篇文章主要介绍了Redis Cluster集群收缩主从节点详细教程,需要的朋友可以参考下
    2021-11-11
  • Redis排序命令Sort深入解析

    Redis排序命令Sort深入解析

    这篇文章主要为大家介绍了Redis排序命令Sort深入解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12

最新评论