redis(缓存)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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 的非核心功能)

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
11天前
|
存储 缓存 NoSQL
Redis缓存的运用
缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请 求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!
16 1
|
5天前
|
缓存 NoSQL Java
在 Spring Boot 应用中使用 Spring Cache 和 Redis 实现数据查询的缓存功能
在 Spring Boot 应用中使用 Spring Cache 和 Redis 实现数据查询的缓存功能
22 0
|
1天前
|
存储 缓存 NoSQL
SpringBoot配置第三方专业缓存技术Redis
SpringBoot配置第三方专业缓存技术Redis
8 4
|
4天前
|
存储 缓存 NoSQL
springboot redis-cache 自动刷新缓存
springboot redis-cache 自动刷新缓存
|
7天前
|
缓存 NoSQL Java
在 SSM 架构(Spring + SpringMVC + MyBatis)中,可以通过 Spring 的注解式缓存来实现 Redis 缓存功能
【6月更文挑战第18天】在SSM(Spring+SpringMVC+MyBatis)中集成Redis缓存,涉及以下步骤:添加Spring Boot的`spring-boot-starter-data-redis`依赖;配置Redis连接池(如JedisPoolConfig)和连接工厂;在Service层使用`@Cacheable`注解标记缓存方法,指定缓存名和键生成策略;最后,在主配置类启用缓存注解。通过这些步骤,可以利用Spring的注解实现Redis缓存。
25 2
|
7天前
|
存储 缓存 NoSQL
Redis 缓存失效策略及其应用场景
Redis 缓存失效策略及其应用场景
16 1
|
7天前
|
存储 缓存 NoSQL
Redis是一种高性能的内存数据库,常用于高并发环境下的缓存解决方案
【6月更文挑战第18天】**Redis摘要:** 高性能内存数据库,擅长高并发缓存。数据存内存,访问迅速;支持字符串、列表等多元数据类型;具备持久化防止数据丢失;丰富命令集便于操作;通过节点集群实现数据分片与负载均衡,增强可用性和扩展性。理想的缓存解决方案。
22 1
|
16天前
|
存储 消息中间件 缓存
Redis:内存数据存储与缓存系统的技术探索
**Redis 概述与最佳实践** Redis,全称Remote Dictionary Server,是流行的内存数据结构存储系统,常用于数据库、缓存和消息中介。它支持字符串、哈希、列表等数据结构,并具备持久化、主从复制、集群部署及发布/订阅功能。Redis适用于缓存系统、计数器、消息队列、分布式锁和实时系统等场景。最佳实践包括选择合适的数据结构、优化缓存策略、监控调优、主从复制与集群部署以及确保安全配置。
21 3
|
1天前
|
缓存 NoSQL Redis
SpringBoot2.4.5使用redis缓存
SpringBoot2.4.5使用redis缓存
7 0
|
15天前
|
缓存 NoSQL Java
Java一分钟之-Spring Data Redis:使用Redis做缓存
【6月更文挑战第10天】Spring Data Redis是Spring框架的一部分,简化了Java应用与Redis的集成,支持多种数据结构操作。本文介绍了其基本使用,包括添加依赖、配置Redis连接及使用RedisTemplate。还讨论了常见问题,如序列化、缓存穿透和雪崩,并提供解决方案。通过实战示例展示了缓存与数据库读写分离的实现,强调了Spring Data Redis在提升系统性能中的作用。
43 0