爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      深入学习 Redis - 如何使用 Redis 作缓存?缓存更新策略?使用需要注意哪些问题(工作/重点)

      首页 知识中心 存储 文章详情页

      深入学习 Redis - 如何使用 Redis 作缓存?缓存更新策略?使用需要注意哪些问题(工作/重点)

      2024-03-29 09:48:26 阅读次数:47

      redis,缓存

      一、Redis 作为缓存


      1.1、缓存的基本概念

      1.1.1、理解

      缓存可以理解为,将常用的数据从放到一个访问速度更快的的地方,方便更快的随时读取.

      也就是说,速度快的设备,可以作为速度慢的设备的缓存,加快读取速度。在计算机硬件中的访问速度如下:

      • CPU 寄存器 > 内存 > 硬盘 > 网络

      最常见的就是,使用 内存 作为 硬盘 的缓存,比如 redis.....  

      当然 硬盘 也可以作为 网络 的缓存,比如浏览器通过 http/https 从服务器上获取数据(html、css、js、图片、视频......)并进行展示,像这样体积大,但又不经常改变的数据,就可以保存到浏览器本地硬盘上,后续在打开这个页面,就不必重新从网络获取上述数据了.

      1.1.2、缓存存什么样的数据?二八定律

      缓存速度虽然快,但是空间小,因此大部分情况,缓存只存放一些热点数据,就非常有用了.

      这里就不得不提一下二八定律了,就是说缓存 只需要存储 20% 的热点数据,就可以应对 80% 的请求.

      1.2、如何使用 redis 作为缓存

      我们通常使用 redis 作为 数据库(mysql)的缓存.

      这是由于,数据库是非常重要的组件,但是速度又很慢,一旦短时间内有大量请求来临,就有可能使数据库压力过大,导致宕机.

      为什么会压力过大,导致宕机?

      服务器每次处理一个请求,都要消耗一些硬件资源(cpu、内存、硬盘、网络......),任何一种资源的消耗超出了机器提供的上限,就很容易出现故障了.

      如何提高 mysql 能承担的并发量?

      1. 开源:引入更多的机器,构成数据库集群,例如 主从复制(即使主节点宕机,也可以通过提升从节点为主节点来解决)、分库分表.....

      2. 节流:引入缓存,就是典型的方案. 把一些频繁的读取的热点数据保存到缓存上,后续再查询数据的时候,如果缓存已经存在了,就直接把从缓存上读到的数据返回,也就不在访问 mysql 了.

      深入学习 Redis - 如何使用 Redis 作缓存?缓存更新策略?使用需要注意哪些问题(工作/重点)

      1.3、缓存更新策略(redis 内存淘汰机制 / 重点)

      实际的工作中,如何知道 redis 中应该存储哪些数据?如何知道哪些数据使热点数据?

      这就得看你使用缓存的哪种更新策略了~

      1.3.1、定期生成

      每隔⼀定的周期 (比如⼀天/⼀周/⼀个⽉) , 对于访问的数据频次进⾏统计,并以日志的形式记录下来,最后挑选出访问频次最⾼的前 N% 的数据,放到缓存中.

      例如搜索引擎.

      搜索引擎的 “查询词” 就是要关注的 “访问的数据”,通过日志,把每天(也可以按一周、一月)都使用到了哪些词,给记录下来,就可以针对这些日志进行统计(这里的统计数据量非常大,需要写个程序来统计,数量大到可能需要使用分布式系统来存储日志 HDFS),统计这一天中,每个词出现的频率,再根据频率降序排序,提取出 前 20% 的词,就可以认为这些词是 “热点词” .

      接下来就可以把这些热点词,以及涉及到的搜索结构都提前拎出来,放到类似 “ redis” 这样的缓存中了。

      如何定期统计呢?

      可以写一套离线流程(往往使用 shell,python 写脚本代码),然后通过 定时任务 来触发(一天更新一次、一个月更新一次......),具体的:

      a)完成统计热词的过程.

      b)根据热词,找到搜索结果的数据.

      c)把得到缓存数据同步到缓存服务器上.

      d)控制这些缓存服务器自动重启.

      定期生成的优缺点

      优点:实现起来比较简单,过程可控(缓存中有什么东西,是比较固定的),方便排查问题.

      缺点:实时性不够,如果出现一些突发性的事件,出现了一些新的热点词,新的热词就可能对数据库带来较大的压力(缓存中查询没有,直接打到数据库),例如,过年的前几天,“春节晚会” 这个词就会变的特别高频、或者是某个突发的新闻......

      1.3.2、实时生成

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

      接着,之后用户每次查询:

      • 如果在 Redis 中查到了,就直接返回.
      • 如果 Redis 中没有,就从数据库查询,在把查到的结果写入 Redis.

      经过一段时间的 “动态平衡” ,redis 中的 key 就逐渐变成了 热点数据.

      但是这样不停的写,redis 中的数据就会越来越多,达到 redis 配置的容量上限之后怎么办?

      内存淘汰策略(经典面试)

      为了解决上述问题,就可以使用以下四种 “内存淘汰策略” (以下淘汰策略不局限于 redis):

      1. FIFO (First In First Out) :先进先出

      把缓存中存在时间最久的 (也就是先来的数据) 淘汰掉.

      2. LRU (Least Recently Used) :淘汰最久未使⽤的

      记录每个 key 的最近访问时间. 把最近访问时间最⽼的 key 淘汰掉.

      3. LFU (Least Frequently Used) :淘汰访问次数最少的

      记录每个 key 最近⼀段时间的访问次数. 把访问次数最少的淘汰掉

      4. Random 随机淘汰

      从所有的 key 中抽取幸运儿被随机淘汰掉

      深入理解淘汰策略:

      假如在 甄嬛传 中,你是那个皇上,后宫佳丽三千,但实际上,你能宠幸的妃子也就那么几个(精力有限),相当于热点数据.

      今天选秀一批新的小主,而你看上了其中的一个,那么就意味着后宫必有人失宠,那么到底要冷落谁呢?

      FIFO:皇后最老,先冷落了.

      LRU:找个太监统计最近的宠幸时间,比如,皇后(10天前)、华妃(一个月前)、熹妃(一天前),那么华妃失宠.

      LFU:找个太监统计最近的宠幸次数,比如,皇后(6次)、华妃(1次)、熹妃(10次),那么华妃失宠.

      Random:随机冷落一个妃子.

      redis 中采用的淘汰策略
      • volatile-ttl(相当于 FIFO, 只不过是局限于过期的 key) 在设置了过期时间的key中,根据过期时间进行淘汰,越早过期的优先被淘汰. 
      • volatile-lru(就是 LRU,只不过局限于过期的 key) 当内存不足以容纳新写⼊数据时,从设置了过期时间的key中使⽤LRU(最近最少使用)算法进行淘汰.
      • allkeys-lru(就是 LRU,针对所有 key) 当内存不⾜以容纳新写⼊数据时,从所有key中使⽤LRU(最近最少使用)算法进行淘汰
      • volatile-lfu(就是 LFU,只不过局限于过期的 key) 4.0版本新增,当内存不⾜以容纳新写⼊数据时,在过期的key中,使⽤LFU算法 进行删除key.
      • allkeys-lfu(就是 LFU,针对所有 key) 4.0版本新增,当内存不⾜以容纳新写⼊数据时,从所有key中使⽤LFU算法进行淘汰.
      • volatile-random 当内存不⾜以容纳新写⼊数据时,从设置了过期时间的key中,随机淘汰数据.
      • allkeys-random 当内存不⾜以容纳新写⼊数据时,从所有key中随机淘汰数据.
      • noeviction 默认策略,当内存不⾜以容纳新写⼊数据时,新写⼊操作会报错.

      1.4、缓存使用的注意事项(重点)

      1.4.1、缓存预热(Cache preheating)

      这里主要针对缓存更新策略是 实时生成的(定期生成 不涉及 “预热” ).

      为什么要预热?

      redis 服务器首次接入之后,服务器是没有数据的,此时所有请求都会直接打给 mysql,在 redis 上没查到,而在 mysql 上查到的数据会继续写入 redis,随着时间推移,redis 上的数据越积累越多 mysql 承担的压力才逐渐变小 .

      那么没预热前,mysql 的压力是相当大的.

      如何解决上述问题?

      通过缓存预热,就可以解决. 主要就是,把缓存 定期生成 和 实时生成 结合一下.

      具体的,先通过离线的方式,通过一些统计途径,统计一些热点数据,导入到 redis 中,此时导入的这批热点数据,就能帮 mysql 承担很大压力了.

      随着时间的推移,逐渐就使用新的热点数据淘汰旧数据了.

      1.4.2、缓存穿透(Cache penetration)

      查询某个 key ,在 redis 中没有,mysql 中也没有,这个 key 也就不会更新到 redis 中。

      这就导致,这次查询没有,下次查,还是没有....... 如果这样的数据很多,并且反复查询,一样会给 mysql 带来很大压力.

      如何处理?

      首先是一种亡羊补牢的方式:通过改进业务/加强监控警报,但这都是出现事故,才采取的行为.

      更靠谱的方案(降低问题的严重性):

      1. 如果这个 key 在 redis 和 mysql 上都不存在,仍然把这个 key 写入 redis,value 设置成一个非法值,比如 "".

      2. 引入布隆过滤器. 每次查询 redis / mysql 之前都先判定一下 key 是否在 布隆过滤器 上存在(布隆过滤器本质上是结合 hash + bitmap 实现的,以比较小的空间开销和比较快的速度,针对 key 是否存在进行判定),不存在就没必要查了.

      1.4.3、缓存雪崩(Cache avalanche)

      在短时间内,redis 中大规模的 key 失效,导致缓存命中率陡然下降,并且 mysql 的压力迅速上升,甚至直接宕机.

      redis 上为什么会出现 大规模的 key 失效?

      1. redis 直接挂了,比如 redis 宕机,或者 redis 集群模式下大量节点宕机.

      2. redis 好着呢,但是可能之前短时间内设置了很多相同过期时间的 key.

      如何处理?

      1) 加强监控警报,例如采取集群的监控,或者哨兵监控的方式,加强 redis 集群可用性.

      2)不给 key 设置过期时间,或者设置过期时间的时候,添加一些随机因子,来避免同时过期.

      1.4.4、缓存击穿(Cache breakdown)

      这里翻译成 “击穿” 实际上不太合适,以至于一些面试官也分不清击穿和穿透(这种情况,最好两种都说明一下).

      这里更适合的翻译成 “瘫痪”.

      缓存击穿 相当于 雪崩 的特殊情况. 针对热点 key,如果过期了,导致大量请求直接访问到数据库上,甚至引起数据库宕机.

      如何处理?

      1. 基于统计的方式发现热点 key,设置为永不过期. 这种方式往往需要服务器结构做出比较大的调整.

      2. 进行必要的服务降级(例如服务器的功能本来有 10 个,特定情况下,会关闭一些不重要的功能,只保留核心功能.  类似于手机的省电模式),例如访问数据库的时候使用分布式锁,限制数据库的访问频率.

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/CYK_byte/article/details/133029259,作者:陈亦康,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:深入理解Linux内核(2)---内存寻址

      下一篇:深入学习 Redis - 渐进式遍历 scan 命令、数据库管理命令

      相关文章

      2025-05-14 10:03:13

      【Mybatis】-防止SQL注入

      【Mybatis】-防止SQL注入

      2025-05-14 10:03:13
      SQL , 执行 , 日志 , 注入 , 缓存 , 编译 , 语句
      2025-05-14 10:02:48

      互斥锁解决redis缓存击穿

      在高并发系统中,Redis 缓存是一种常见的性能优化方式。然而,缓存击穿问题也伴随着高并发访问而来。

      2025-05-14 10:02:48
      Redis , 互斥 , 数据库 , 线程 , 缓存 , 请求
      2025-05-13 09:50:28

      分隔链表-146. LRU 缓存

      给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

      2025-05-13 09:50:28
      int , key , LinkedHashMap , 缓存 , 节点 , 链表
      2025-05-12 08:43:47

      LRU 缓存

      请你设计并实现一个满足  LRU (最近最少使用) 缓存 约束的数据结构。

      2025-05-12 08:43:47
      int , key , lt , 关键字 , 缓存
      2025-05-08 09:04:25

      DS初阶:时间复杂度和空间复杂度

      算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。                                                      

      2025-05-08 09:04:25
      CPU , 复杂度 , 数据 , 时间 , 空间 , 算法 , 缓存
      2025-05-07 09:08:42

      springboot系列教程(十三):基于Cache注解模式,管理Redis缓存

      springboot系列教程(十三):基于Cache注解模式,管理Redis缓存

      2025-05-07 09:08:42
      Cache , key , 方法 , 注解 , 缓存
      2025-05-07 09:08:08

      面试题 : Spring循环依赖问题及其解决方案

      面试题 : Spring循环依赖问题及其解决方案

      2025-05-07 09:08:08
      代理 , 依赖 , 循环 , 缓存
      2025-05-06 09:19:12

      redis高可用集群搭建

      redis高可用集群搭建

      2025-05-06 09:19:12
      master , redis , 服务器 , 节点 , 集群
      2025-05-06 09:18:38

      【Linux 从基础到进阶】Redis缓存服务安装与调优

      Redis 是一个开源的内存数据结构存储系统,广泛应用于缓存、会话管理和实时分析等场景。它支持多种数据结构,如字符串、哈希、列表、集合和有序集合,因其高性能和灵活性,成为开发者的首选缓存解决方案。

      2025-05-06 09:18:38
      Redis , Ubuntu , 安装 , 缓存 , 调优
      2025-04-22 09:40:08

      【ETL工具】Kettle 调优 (使用阻塞组件的同时数据量大)

      【ETL工具】Kettle 调优 (使用阻塞组件的同时数据量大)

      2025-04-22 09:40:08
      组件 , 缓存 , 队列
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5235733

      查看更多

      最新文章

      【Mybatis】-防止SQL注入

      2025-05-14 10:03:13

      分隔链表-146. LRU 缓存

      2025-05-13 09:50:28

      LRU 缓存

      2025-05-12 08:43:47

      DS初阶:时间复杂度和空间复杂度

      2025-05-08 09:04:25

      springboot系列教程(十三):基于Cache注解模式,管理Redis缓存

      2025-05-07 09:08:42

      【Linux 从基础到进阶】Redis缓存服务安装与调优

      2025-05-06 09:18:38

      查看更多

      热门文章

      Redis持久化存储策略(RDB、AOF)

      2023-05-24 08:11:04

      查看Redis的默认设置的过期策略和内存淘汰机制

      2022-12-28 07:22:30

      leetcode数据结构-LRU

      2023-03-02 10:21:35

      精华推荐 | 【深入浅出RocketMQ原理及实战】「底层原理挖掘系列」透彻剖析贯穿RocketMQ的存储系统的实现原理和持久化机制

      2023-02-24 10:12:47

      elasticsearch预加载数据到文件系统缓存

      2024-09-25 10:13:57

      jedis工具类

      2023-02-16 08:14:03

      查看更多

      热门标签

      存储 缓存 内存 数据库 数据 redis mysql 服务器 数据恢复 Redis linux java 链表 MySQL sql
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      python中functools.cache用法详解及缓存策略问题

      缓存一致性设计思路

      redis中什么是缓存击穿?该如何解决?

      nginx架构

      什么是缓存击穿

      Redis高频面试基本问题整理

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号