应用多级缓存模式支撑海量数据的读操作

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
传统型负载均衡 CLB,每月750个小时 15LCU
云数据库 Tair(兼容Redis),内存型 2GB
简介: 应用多级缓存模式支撑海量数据的读操作

前言

与一个同学聊了他最近面试,被面试官问到的问题。其中一个是,如果采用缓存来支撑海量数据的读取。简单的,叙述下方案。

那么,我们今天就探讨下,如何应用多级缓存来支撑海量数据的读操作。

多级缓存

多级缓存,即在整个系统架构中,要在不同系统层级进行数据缓存,而不是仅仅的采用中间件,来进行缓存,以此来提升访问效率,这是应用最广的方案之一。

整体流程,我们分析如下:

1)首先接入负载均衡中间件,比如Nginx(请求负载均衡),将请求负载均衡到接入层应用Nginx(业务转发),常用的负载均衡算法,是轮询或者一致性哈希。

轮询,使服务器请求更加均衡,而一致性哈希可以提升应用Nginx的缓存命中率,相对于轮询,一致性哈希会存在单机热点问题,存在两种解决方案

,一种是热点直接推送到Nginx,另一种方法是设置一个阈值,当到达阈值后,采用轮询算法

2)应用Nginx读取本地缓存,如果命中,则返回。应用Nginx本地缓存,可以提升整体系统吞吐量,降低后端的压力,尤其针对热点问题非常有效。

本地缓存可以使用Nginx Proxy Cache(磁盘/内存)、Local Redis、Lua Shared Dict

3)如果应用Nginx本地缓存没有命中,则读取分布式缓存(如Redis缓存,可以采用主从架构提升性能,吞吐量)如果分布式缓存命中,则响应返回,并更新应用层Nginx本地缓存

4)如果分布式缓存也没有命中,则到服务内部服务器中,比如Tomcat,在进行Tomcat集群时,也可以使用轮询和一致性哈希作为负载均衡算法,可以采用ribbon,作为服务端负载均衡组件

5)在Tomcat集群中,首先读取本地堆缓存,如果有,则返回响应,依次回写前面的缓存层。

6)如果所有缓存,没有命中,则需要读写DB,然后响应、回写。

应用整体,分为三部分缓存:应用层Nginx本地缓存、分布式缓存、Tomcat堆缓存,每一层缓存来解决相关的问题。

image.png

如何缓存数据


  1. 过期与不过期
    缓存的创建,可以包括不过期缓存和具备时间时效的缓存。
    1)不过期缓存一般应用在开启事务,执行SQL,提交事务,写缓存的场景。
    基本上来讲,对于高频访问的数据,若缓存空间足够,则可以考虑不过期缓存,当缓存空间满了,可以采用LRU进行缓存清理
    2)过期缓存,即采用懒加载,一般用于缓存其他系统的数据,常见缓存空间有限、低频热点缓存等场景
  2. 维护化缓存与增量缓存
    对于类似商品属性数据的缓存,往往有公共的部分,更新的只是其中一部分,那么缓存的创建,需要增量更新缓存
  3. 大Value缓存
    对于大Value的缓存,要非常警惕,以防把缓存撑爆,尤其在使用Redis时。此时,可以考虑采用多线程缓存,如Memcached
  4. 热点缓存
    可以通过多挂从缓存,客户端通过负载均衡机制,来读取从缓存的系统数据。


更新缓存与原子性

如果多个应用,同时操作一份数据很可能造成缓存数据是脏数据。

解决方案分析如下:

  1. 更新数据时使用版本号或者使用戳,例如redis利用其单线程原子性特点处理更新
  2. 使用canal订阅数据库binlog。canal作为消费者,可以订阅mysql发布者,发布的消息binlog,进行增量更新redis
  3. 使用分布式锁,更新之前获取相关的锁
  4. 将更新请求按照规则分散到队列中,每个队列单线程原子更新。


缓存崩溃与快速恢复

我们要考虑到一部分缓存实例宕机情况,那么如何解决的。当缓存数据是可丢失的情况,我们可以选择一致性哈希算法

  1. 取模
    对于取模,如果其中一个实例故障,如果当前被摘除,则造成大量不能命中,就会造成缓存击穿,大流量导致DB出现问题。对此,我们可以采用主从复制来解决。
  2. 一致性哈希
  3. 快速恢复

出现了上述问题,如何解决,我们可以采用以下方案:

1)主从复制,做好冗余

2)考虑用户降级



相关实践学习
基于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
目录
相关文章
|
2天前
|
存储 缓存 监控
多级缓存有哪些级别?
【10月更文挑战第24天】多级缓存有哪些级别?
11 1
|
2天前
|
存储 缓存 监控
多级缓存
【10月更文挑战第24天】多级缓存
8 1
|
7天前
|
存储 缓存 数据库
缓存技术有哪些应用场景呢
【10月更文挑战第19天】缓存技术有哪些应用场景呢
|
8天前
|
缓存 监控 算法
小米面试题:多级缓存一致性问题怎么解决
【10月更文挑战第23天】在现代分布式系统中,多级缓存架构因其能够显著提高系统性能和响应速度而被广泛应用。
24 3
|
23天前
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
41 4
|
1月前
|
缓存 移动开发 前端开发
HTML5 应用程序缓存详解
HTML5 应用程序缓存(Application Cache)通过缓存 HTML、JavaScript、CSS 和图像等资源,使 Web 应用能在离线状态下运行。它利用 Manifest 文件(`.appcache`)定义缓存资源列表,浏览器会在加载页面时下载并缓存这些资源。此外,应用程序缓存还提供了事件处理机制,允许开发者监控缓存状态并进行手动管理。尽管这一技术已被视为过时,建议使用 Service Workers 和 Cache API 等现代替代方案来实现更强大的离线功能和缓存控制。
|
2月前
|
缓存 NoSQL 应用服务中间件
SpringCloud基础8——多级缓存
JVM进程缓存、Lua语法、OpenResty、Nginx本地缓存、缓存同步、Canal
SpringCloud基础8——多级缓存
|
2月前
|
缓存 JavaScript 中间件
优化Express.js应用程序性能:缓存策略、请求压缩和路由匹配
在开发Express.js应用时,采用合理的缓存策略、请求压缩及优化路由匹配可大幅提升性能。本文介绍如何利用`express.static`实现缓存、`compression`中间件压缩响应数据,并通过精确匹配、模块化路由及参数化路由提高路由处理效率,从而打造高效应用。
119 6
|
2月前
|
机器学习/深度学习 缓存 NoSQL
深度学习在图像识别中的应用与挑战后端开发中的数据缓存策略
本文深入探讨了深度学习技术在图像识别领域的应用,包括卷积神经网络(CNN)的原理、常见模型如ResNet和VGG的介绍,以及这些模型在实际应用中的表现。同时,文章也讨论了数据增强、模型集成等改进性能的方法,并指出了当前面临的计算资源需求高、数据隐私等挑战。通过综合分析,本文旨在为深度学习在图像识别中的进一步研究和应用提供参考。 本文探讨了后端开发中数据缓存的重要性和实现方法,通过具体案例解析Redis在实际应用中的使用。首先介绍了缓存的基本概念及其在后端系统性能优化中的作用;接着详细讲解了Redis的常见数据类型和应用场景;最后通过一个实际项目展示了如何在Django框架中集成Redis,
|
26天前
|
存储 缓存 NoSQL
构建高性能Web应用:缓存的重要性及其实现
构建高性能Web应用:缓存的重要性及其实现