当前位置: 首页 > article >正文

系统架构设计师—案例分析—数据库篇—分布式缓存技术

文章目录

  • Redis
    • 数据类型
    • 读写数据的基本步骤
      • 读数据
      • 写数据
    • 过期策略
      • 惰性删除
      • 定期删除
      • 内存淘汰机制
    • 持久化
    • 缓存异常问题
      • 缓存穿透
      • 缓存雪崩
        • redis故障
        • 大量key同时过期
      • 缓存击穿
    • 集群
    • 切片

Redis

Redis用作缓存组件时,其基于内存的读写特性,比基于磁盘读写的数据库性能要高很多,适合缓存高频热点的数据,来提高读性能。这样可以降低厎数据库服务器的查询请求,提高系统性能。

数据类型

类型说明适用场景
string基本类型。可用于缓存层或计数器,如视频播放量、文章浏览量等。
hash代替string类型,节省空间。描述用户信息较为方便
set无序集合,每个值不能重复。可用于去重、抽奖、初始化用户池等。
zset有序集合,每个元素有一个分数。如首页推荐10个最热门的帖子。
list双向链表结构,可以模拟栈、队列等形式。可用于回复评论、点赞。
pub/sub发布/订阅可以用作消息队列,生产者将消息投送给某个key为主题的队列,消费者监听并得到消息的推送.

读写数据的基本步骤

读数据

  1. 根据key读缓存。
  2. 读取成功则直接返回。
  3. 若key不在缓存中时,根据key读数据库。
  4. 读取成功后写缓存。
  5. 成功返回。

写数据

  1. 根据key写数据库。
  2. 成功后更新缓存key值。
  3. 成功返回。

过期策略

惰性删除

查询key时,才对key进行检测,如果已经达到过期时间,则删除。
缺点:如果这些过期的key没有被访问,那么就一直无法被删除,一直占用内存。

定期删除

redis每隔一段时间对数据库做一次检查,删除里面的过期key。由于不可能对所有key去做轮询来删除,所有redis会每次随机取一些key去做检查和删除。

内存淘汰机制

淘汰机制说明
volatile-lru从已设置过期时间的key中,移出最近最少使用的key进行淘汰。
volatile-lfu从已设置过期时间的key中,移出最不经常使用的进行淘汰。
volatile-random从已设置过期时间的key中随机选择key淘汰。
volatile-ttl从已设置过期时间的key中,移出将要过期的key。
allkeys-lru从所有key中选择最近最少使用的进行淘汰。
allkeys-lfu从所有key中选择最不经常使用的进行淘汰。
allkeys-random从所有key中随机选择key进行淘汰。

持久化

RDB内存快照(RedisDataBase)AOF日志(Append Only File)
说明把当前内存中的数据集快照写入磁盘(数据库中所有键值对数据)。恢复时,是将快照文件直接读取到内存里。通过持续不断地保存Redis服务器所执行的更新命令来记录数据库状态,类似mysql的binlog。恢复数据时,需要从头开始回放更新命令。
磁盘刷新频率
文件大小
数据恢复效率
数据安全

缓存异常问题

缓存穿透

访问的key在redis中不存在。

原因:

  1. 恶意攻击,造成大量访问Redis中不存在的key。
  2. 大量请求访问数据库里有但redis没有的key。

解决方案:

  • 针对来源是比较少的请求来源ip,主动限制访问次数,或者拉入黑名单。
  • 应用程序检查key的合法性,提前拒绝不合法的请求。
  • 使用布隆过滤器。
  • 预热redis,运行一个批处理脚本,将可能会大量访问的数据预先加载到redis,业务再开张。
  • 在最前端进行流量控制,逐步释放进来的请求。给出一段时间,让redis逐步加载热数据。
  • 如果数据库里也没有的key,也要在redis中设置key,使其值为null或空。

缓存雪崩

Redis的key是已存在的,但同时失效了。

redis故障

如宕机、网络抖动

解决方案:

  • 使用主从复制提高可用性,使用cluster集群方案降低故障时的影响范围。
  • 如果出现故障,则可以采取服务降级、熔断、限流等措施。
大量key同时过期

采取了相同的过期时间,例如在同一时刻设置了大量的key,但过期时间都是5分钟。

解决方案:

  • 过期时间加上一个随机值,使得众多key均匀过期。

缓存击穿

少量热点key缓存时间失效。

原因:

  • 热点的key设置了太短的过期时间。

如:秒杀业务下的“库存数量”。

解决方案:

  • 设置较长的过期时间。非常重要的key则设置永久有效。但需要解决好与数据库中的key的一致性问题。
  • 使用分布式锁:如果热点key失效了,要控制好访问后端数据库的流量。只允许一个请求去访问数据库,取出罪行的key,存放到redis,其他请求必须等待。但分布式锁也要防止出现异常的情况。

集群

  • 主从复制集群
  • 哨兵集群
  • Cluster集群

切片

类型说明
客户端分片将分片工作放在业务程序端。不依赖于第三方分布式中间件,实现方法和代码可掌控,对开发人员要求高。
代理分片将分片工作交给专门的代理程序来做,运维方便。代表:Twemproy,Codis。
服务器端分片Redis Cluster将所有key映射到16384个Slot中,集群中每个Redis实例负责一部分,业务程序通过集成的Redis Cluster客户端进行操作。
原文地址:https://blog.csdn.net/qq_18941713/article/details/146252811
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/589911.html

相关文章:

  • 【C++标准库类型】深入理解vector类型(2):迭代器与算法
  • 做游戏的发展方向
  • Java泛型程序设计使用方法
  • 矩阵期望 E 的含义:概率
  • npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本的处理方法
  • 【软件工程】04_面向对象需求分析方法
  • 【C++进阶一】STL和string
  • SAP HANA on AWS Amazon Web Services
  • 一个使用Python和相关深度学习库(如`PyTorch`)实现GCN(图卷积网络)与PPO(近端策略优化)强化学习模型结合的详细代码示例
  • 设计模式-对象创建
  • 【存储中间件】Redis核心技术与实战(四):Redis高并发高可用(Redis集群介绍与搭建)
  • springboot纯干货
  • RAGFlow部署与使用(开源本地知识库管理系统,包括kibana配置)
  • Linux驱动开发之中断处理
  • kafka详细介绍以及使用
  • Java语言前言
  • 基于ssm的电子病历系统(全套)
  • 标贝自动化数据标注平台推动AI数据训练革新
  • C#语言的事务管理
  • 卷积神经网络 - 卷积的互相关