redis(缓存)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: redis(缓存)

缓存

缓存(cache) 是计算机中的一个经典概念

核心思路是将 热点数据 放到访问速度更快的地方, 方便随时读取

通常情况下, 访问数据的速度: CPU 寄存器 > 内存 > 硬盘 > 网络

速度快的设备可以作为速度慢的设备的缓存

对于计算机硬件来说, 访问速度越快, 成本越高, 存储空间越小

但是大部分情况下, 缓存只存储一些 热点数据 , 是完全够用的

通常将 redis 作为 关系型数据库 (MySQL, Oracle …) 的缓存

关系型数据库的功能强大, 但是性能不高 (一次操作消耗资源较多)

  1. 数据存储在磁盘上, 磁盘的 IO 速度并不快
如果查询不能命中索引, 就需要进行表的遍历, 就会大大增加硬盘 IO 次数
  1. 关系型数据库对于 SQL 的执行会做一系列解析, 校验, 优化操作
  2. 复杂查询会触发笛卡尔积操作, 效率成指数下降

如何让数据库承担更大的并发量?

  1. 开源: 引入更多机器, 构成数据库集群
  2. 节流: 引入缓存, 热点数据通过缓存处理, 可以大大降低数据库的请求数量

经过缓存的业务执行流程

客户端访问业务服务器, 发起查询请求

业务服务器会先查询 缓存

  • 如果所需数据在 redis 中已存在, 则不必再访问 MySQL
  • 如果 redis 中不存在, 则访问 MySQL

缓存的更新策略

  1. 定期生成
    每隔一定周期, 对于访问数据进行统计, 根据访问频率挑选热点数据 (实时性差)
  2. 实时生成
    对于每次用户的查询
  • 如果在 redis 中查到了, 就返回对应结果
  • 如果在 redis 中查询不到, 就从数据库查, 并把查询到的数据也写入 redis

缓存淘汰机制

缓存 的容量是有限的, 对于热点数据的不断插入, 需要把一些 “不是那么热门” 的数据删除, 对此 缓存 拥有几种淘汰机制

FIFO (First In First Out) 先进先出 – 把缓存中存在最久的数据淘汰掉

LRU (Least Recently Used) 淘汰最久未使用的 – 记录每个 key 的最近访问时间, 每次淘汰访问时间最老的 key

LFU (Least Frequently Used) 淘汰访问次数最少的 – 记录每个 key 的访问次数, 每次淘汰访问次数最少的 key

Random 随机淘汰

缓存预热

当 Redis 作为 MySQL 缓存, 刚刚启动的时候, 会有大批 热点数据 生成到 Redis 中, 此时会造成 MySQL 的压力很大

缓存预热就是提前在 Redis 中准备部分热点数据, 让 MySQL 在刚刚启动时的压力没那么大


缓存穿透 (Cache Penetration)

访问的 key 在 Redis 和 数据库中都不存在, 这样的 key 并不会被用户获取到, 也不会被更新到Redis 中, 后续若是仍有此请求, 仍会访问数据库 (会导致数据库压力变大)

问题原因:

  1. 业务设计不合理
  2. 开发 / 运维误删数据库
  3. 黑客恶意攻击

解决:

  1. 当在 Redis 和 MySQL 中都查询不到时, 在 redis 中插入 value = “” 的键值对,防止后续频繁访问数据库
  2. 布隆过滤器对 key 进行校验
  3. 对查询数据做合法性校验 (针对业务上的优化)

缓存雪崩

问题:

  • 短时间内 redis 上 key 值大量失效 (redis 挂了 / 多个 key 的过期时间相同), 导致 redis 命中率下降, MySQL 压力骤增

解决:

  1. 部署高可用的 Redis 集群, 完善报警机制 (哨兵)
  2. 不设置过期时间, 或者对过期时间添加随机因子 (别同时全部过期)

缓存击穿 (Cache Breakdown)

问题:

  • 缓存雪崩的一种特殊情况, 热点 key 突然过期, 导致大量请求直接访问数据库

解决:

  1. 将热点 key 设置为永不过期
  2. 服务降级 (类似于手机省电模式, 适当关闭 MySQL 的非核心功能)

目录
相关文章
|
6月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
1月前
|
缓存 负载均衡 监控
135_负载均衡:Redis缓存 - 提高缓存命中率的配置与最佳实践
在现代大型语言模型(LLM)部署架构中,缓存系统扮演着至关重要的角色。随着LLM应用规模的不断扩大和用户需求的持续增长,如何构建高效、可靠的缓存架构成为系统性能优化的核心挑战。Redis作为业界领先的内存数据库,因其高性能、丰富的数据结构和灵活的配置选项,已成为LLM部署中首选的缓存解决方案。
|
2月前
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
152 1
Redis专题-实战篇二-商户查询缓存
|
1月前
|
缓存 运维 监控
Redis 7.0 高性能缓存架构设计与优化
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Redis 7.0高性能缓存架构,探索函数化编程、多层缓存、集群优化与分片消息系统,用代码在二进制星河中谱写极客诗篇。
|
6月前
|
缓存 NoSQL Java
Redis+Caffeine构建高性能二级缓存
大家好,我是摘星。今天为大家带来的是Redis+Caffeine构建高性能二级缓存,废话不多说直接开始~
880 0
|
2月前
|
缓存 NoSQL 关系型数据库
Redis缓存和分布式锁
Redis 是一种高性能的键值存储系统,广泛用于缓存、消息队列和内存数据库。其典型应用包括缓解关系型数据库压力,通过缓存热点数据提高查询效率,支持高并发访问。此外,Redis 还可用于实现分布式锁,解决分布式系统中的资源竞争问题。文章还探讨了缓存的更新策略、缓存穿透与雪崩的解决方案,以及 Redlock 算法等关键技术。
|
6月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
228 32
|
6月前
|
缓存 NoSQL Java
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
146 5
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
|
8月前
|
缓存 监控 NoSQL
Redis--缓存击穿、缓存穿透、缓存雪崩
缓存击穿、缓存穿透和缓存雪崩是Redis使用过程中可能遇到的常见问题。理解这些问题的成因并采取相应的解决措施,可以有效提升系统的稳定性和性能。在实际应用中,应根据具体场景,选择合适的解决方案,并持续监控和优化缓存策略,以应对不断变化的业务需求。
1611 29
|
7月前
|
人工智能 缓存 NoSQL
Redis 与 AI:从缓存到智能搜索的融合之路
Redis 已从传统缓存系统发展为强大的 AI 支持平台,其向量数据库功能和 RedisAI 模块为核心,支持高维向量存储、相似性搜索及模型服务。文章探讨了 Redis 在实时数据缓存、语义搜索与会话持久化中的应用场景,并通过代码案例展示了与 Spring Boot 的集成方式。总结来看,Redis 结合 AI 技术,为现代应用提供高效、灵活的解决方案。