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

本文涉及的产品
云数据库 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
目录
相关文章
|
3月前
|
缓存 Java 应用服务中间件
面试官:如何实现多级缓存?
面试官:如何实现多级缓存?
185 1
|
3月前
|
缓存 Java 数据库
优化您的Spring应用程序:缓存注解的精要指南
优化您的Spring应用程序:缓存注解的精要指南
46 0
|
1天前
|
缓存 监控 PHP
【PHP开发专栏】Memcached在PHP中的缓存应用
【4月更文挑战第29天】Memcached是高性能分布式内存缓存系统,常用于加速动态Web应用,减轻数据库负担。在PHP中,通过官方扩展模块与Memcached服务器交互,涉及安装扩展、创建实例、设置/获取缓存、删除缓存及其它操作。使用Memcached可减少数据库负载、缓存查询结果、实现页面缓存,支持分布式缓存,并需注意避免缓存击穿、穿透和雪崩。监控和调优缓存策略能优化性能。了解和掌握Memcached有助于提升PHP应用的效率和扩展性。
|
5天前
|
缓存 NoSQL Java
Springboot 多级缓存设计与实现
Springboot 多级缓存设计与实现
|
18天前
|
缓存 Java 数据库连接
MyBatis三级缓存实战:高级缓存策略的实现与应用
MyBatis三级缓存实战:高级缓存策略的实现与应用
35 0
MyBatis三级缓存实战:高级缓存策略的实现与应用
|
2月前
|
缓存 应用服务中间件 数据库
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
37 1
|
2月前
|
缓存 NoSQL 数据库
[Redis]——数据一致性,先操作数据库,还是先更新缓存?
[Redis]——数据一致性,先操作数据库,还是先更新缓存?
|
2月前
|
存储 缓存 算法
说说什么是本地缓存、分布式缓存以及多级缓存,它们各自的优缺点?
说说什么是本地缓存、分布式缓存以及多级缓存,它们各自的优缺点?
|
3月前
|
存储 缓存 数据库
缓存模式
缓存模式
26 0
|
4月前
|
存储 缓存 算法
数据结构与算法面试题:实现一个 LRU 缓存,支持如下操作:获取值、更新值、删除键值对和插入键值对
数据结构与算法面试题:实现一个 LRU 缓存,支持如下操作:获取值、更新值、删除键值对和插入键值对
28 0