Redis相关问题-01

简介: 本文介绍了Redis中的三大缓存问题及其解决方案,包括缓存穿透(数据库和缓存无数据)、缓存击穿(热点数据失效)和缓存雪崩(大量缓存同时失效)。此外,还讲解了Redis的数据持久化策略(RDB和AOF)、常用数据类型(String、Hash、List、Set、ZSet及高级类型如Bitmap、HyperLogLog、Geo)以及数据过期处理策略(定期删除、惰性删除和内存淘汰机制)。

Q:Redis三剑客(缓存穿透,缓存击穿,缓存雪崩)

1.缓存穿透

缓存穿透:是指用户查询的数据,在数据库和Redis中都没有记录,然后就会一直查询数据库,增加对数据库的访问压力。

解决方案

  • 缓存空对象:代码维护较简单,但是效果不好。
  • 布隆过滤器:代码维护复杂,效果很好

扩展:什么是布隆过滤器?

布隆过滤器是一个很长的二进制向量和一系列随机映射函数

布隆过滤器的优点:

  • 时间复杂度低,增加和查询元素的时间复杂为O(N),(N为哈希函数的个数,通常情况比较小)
  • 保密性强,布隆过滤器不存储元素本身
  • 存储空间小,如果允许存在一定的误判,布隆过滤器是非常节省空间的(相比其他数据结构如Set集合)

布隆过滤器的缺点:

  • 有点一定的误判率,但是可以通过调整参数来降低
  • 无法获取元素本身
  • 很难删除元素



2.缓存击穿

缓存击穿:就是热点数据在高并发的时候,数据到期,此时大量的访问同时访问数据库,导致数据库的压力剧增

解决方案

  • 热点数据提前预热
  • 设置热点数据永远不过期。
  • 加锁 , 限流

3.缓存雪崩

缓存雪崩:既多个热点数据的缓存在同一时期失效,导致大量的用户访问到数据库,造成数据库压力飙升

解决方案

  • 在缓存数据的Key设置随机值,使缓存不会同时失效
  • 可以设置熔断机制,既当用户的流量达到一定阈值时,对后来请求到数据库的用户直接返回系统繁忙,防止过多的数据直接访问数据库



Q:Redis的数据持久化策略有哪些 ?

  1. RDB 持久化(全量),是指在指定的时间间隔内将内存中的数据集快照写入磁盘。
  2. AOF持久化(增量),以日志的形式记录服务器所处理的每一个写、删除操作



Q:Redis常用的数据类型

基础数据类型
  • String:比如存储商品库存、万能的就可以用string结构
  • Hash:像我过去存储一些对象结构,比如购物车这种,也用过hash
  • List:  一些列表的场景,比如用户浏览历史,我之前都是用的list
  • Set:  而对于一些高并发的点赞、收藏,我之前的技术方案用的是set
  • ZSet:一些需要排行的场景,我们可以用zset,因为他的底层是压缩列表、跳表和哈希表
高级数据类型
  • bitmap       :用来签到的
  • hyperloglog:做网站点击、访问量统计的
  • geo           :用来做地理坐标检索的



Q:Redis的数据过期策略

1.定期删除

操作:每隔一段时间抽取一批 key 执行删除过期 key 操作。并且,Redis 底层会通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响。

优缺点
  • 优点:主动清理部分过期键,减少内存占用,且通过随机抽样和比例控制,避免频繁全量扫描导致的 CPU 消耗过高。
  • 缺点:可能存在 “漏网之鱼”—— 部分过期键未被抽查到,会继续占用内存。
扩展

默认情况下 Redis 定期检查的频率是每秒扫描 10 次,用于定期清除过期键。当然此值还可以通过配置文件进行设置,在 redis.conf 中修改配置“hz”即可,默认的值为hz 10定期删除的扫描并不是遍历所有的键值对,这样的话比较费时且太消耗系统资源。Redis 服务器采用的是随机抽取形式,每次从过期字典中,取出 20 个键进行过期检测,过期字典中存储的是所有设置了过期时间的键值对。如果这批随机检查的数据中有 25% 的比例过期,那么会再抽取 20 个随机键值进行检测和删除,并且会循环执行这个流程,直到抽取的这批数据中过期键值小于 25%,此次检测才算完成Redis 服务器为了保证过期删除策略不会导致线程卡死,会给过期扫描增加了最大执行时间为 25ms

2.惰性删除

操作:只会在取出 key 的时候才对数据进行过期检查。这样对 CPU 最友好,但是可能会造成太多过期 key 没有被删除。

优缺点:
  • 优点:只在访问时校验,无需额外 CPU 资源监控过期键,避免了对未被访问的过期键的无效处理。
  • 缺点:若过期键长期未被访问,会一直占用内存(例如一个过期的冷数据键,始终无人访问,就会成为 “内存僵尸”)。
3.内存淘汰机制

操作:当 Redis 内存使用达到配置的maxmemory阈值时,即使存在未过期的键或未被清理的过期键,也会触发内存淘汰机制,删除部分键以释放内存。

目录
相关文章
|
4月前
|
SQL Arthas 关系型数据库
MySQL相关问题
当SQL语句执行缓慢时,可通过Skywalking等工具定位慢SQL,再使用Explain分析执行计划。重点关注possible_keys、key、key_len、type和extra字段,判断索引使用情况及是否回表。可通过优化索引、使用覆盖索引等方式提升性能。此外,还可开启MySQL慢日志或使用Arthas、Prometheus等工具辅助定位问题。
84 0
|
存储 编译器 C++
关于“VS2022无法打开头文件<graphics.h>” 以及编译时 “没有与参数列表匹配的重载函数实例”俩个问题的解决思路
关于“VS2022无法打开头文件<graphics.h>” 以及编译时 “没有与参数列表匹配的重载函数实例”俩个问题的解决思路
4730 0
|
4月前
|
云安全 人工智能 安全
Ollama漏洞引发的“血案”—自建LLM的安全思考
「云安全技术观察」聚焦云计算时代安全技术前沿与实践,涵盖AI大模型风险、云原生安全体系建设及攻防对抗等内容,提供落地技术参考与前瞻性洞察。
471 0
|
4月前
|
JSON Java API
【干货满满】分享京东API接口到手价,用Java语言实现
本示例使用 Java 调用京东开放平台商品价格及优惠信息 API,通过商品详情和促销接口获取到手价(含优惠券、满减等),包含签名生成、HTTP 请求及响应解析逻辑,适用于比价工具、电商系统集成等场景。
|
4月前
|
机器学习/深度学习 缓存 算法
解密Qwen3三连发:强化学习新算法GSPO!
强化学习(RL)是提升语言模型推理与问题求解能力的关键技术。然而,现有算法如 GRPO 在长期训练中存在严重不稳定性,限制了性能提升。为此,我们提出 **Group Sequence Policy Optimization (GSPO)**,通过在序列层面定义重要性比率并进行优化,显著提升了训练效率与稳定性。GSPO 在 MoE 模型训练中表现出色,无需依赖复杂策略即可实现高效训练,简化了 RL 基础设施。该算法已成功应用于 Qwen3 系列模型,推动 RL scaling 边界,释放模型潜能。
564 0
|
Java 存储
线程池的核心参数有哪些?
线程池七大核心参数:核心/最大线程数、线程保持时间及单位、阻塞队列、线程工厂与拒绝策略。
762 79
|
5月前
|
SQL 缓存 Java
MyBatis场景面试题
MyBatis与MyBatisPlus均属ORM框架,前者擅长复杂SQL及动态查询,后者封装API简化单表操作。常用XML标签如if、foreach提升SQL灵活性。MyBatis支持一级(SqlSession级)与二级(NameSpace级)缓存,提升查询效率。#{}防SQL注入,${}用于动态表名等场景。
280 62
|
4月前
|
消息中间件 人工智能 Apache
Apache RocketMQ EventBridge:为什么 GenAI 需要 EDA?
本文探讨了事件驱动架构(EDA)在AI时代的重要价值。首先,通过RAG技术缓解AI幻觉问题,提高大模型回答的准确性;其次,作为推理触发器,实现自动化任务处理和系统联动;最后,构建Agent通信基础设施,推动AI系统间的高效协作。EDA以其事件为中心、实时响应的特点,为AI系统提供感知与行动能力,是构建智能系统的关键支撑。
219 10
|
4月前
|
数据采集 NoSQL 应用服务中间件
3分钟,手摸手教你用OpenResty搭建高性能隧道代理(附完整配置!)
在爬虫开发中,代理 IP 是常用手段,但管理代理池繁琐且易出错。本文介绍了如何使用隧道代理简化代理 IP 管理,通过 OpenResty 实现高效的动态代理切换,提升爬虫稳定性与维护效率。
305 0
3分钟,手摸手教你用OpenResty搭建高性能隧道代理(附完整配置!)