应用缓存预热方案设计(代码片段)

方丈的寺院 方丈的寺院     2023-03-01     503

关键词:

背景

随着业务的发展,微服务越来越多,缓存相关的场景也比较多,通常的做法是基于缓存数据库(如redis),client来进行缓存操作。这样的问题有两个

  1. 如果更换缓存数据库改造成本比较高
  2. 对于批量查缓存、缓存穿透等场景没有统一实现,逻辑分散

所以需要一个统一的缓存框架。

另外针对一些活动、大促场景需要对缓存数据进行预热。所以需要设计一套通用的预热系统。所谓预热,其实就是提前请求数据,使缓存生效。缓存和预热有关联,但是可以设计成独立的两套系统。

缓存框架

目标是实现

  1. 去除样板代码
getDataWithCache(Long id) 
	val data = getFromCache(id);
	// 缓存没有,从数据库中拿
	if (data == null) 
		data  = getFromDb(id);
		putDataInfoCache();
	

  1. 屏蔽掉缓存的具体实现,缓存有本地缓存(guava cache),分布式缓存(redis,memcache),实现方式不同,但是对于业务无需感知
  2. 支持缓存穿透、缓存击穿、级联缓存、批量查询缓存场景
  3. 能够监控到缓存命中率

实现分析

API 层

提供一些annotation给开发者使用

解析层

解析annotation,生成对应的缓存操作API

缓存操作SPI

屏蔽掉具体的缓存数据库实现

缓存操作层

具体的缓存数据库实现,如redis,memcache

开源的实现

https://docs.spring.io/spring-framework/docs/3.1.x/spring-framework-reference/html/cache.html

目前有spring-cache的实现,大部分需要的功能都能提供,补过也存在一些劣势

  1. 不支持多级缓存,批量查询缓存
  2. 和公司内部的监控,全链路trace没有打通。

所以通常可以借鉴spring-cache思路,结合公司的基础组件,自研一套。
具体实现逻辑见github

预热系统


预热系统其实就是三步

  1. 构造数据
    支持excel,离线表,等多种数据导出成特定格式的参数

  2. 提交任务
    提交调用待预热接口的方法,有个任务中心即可

  3. 执行
    任务中心的任务调度

所以主要是搭建一个数据构造模块,再基于公司已有的任务执行中心即可实现。

redis缓存穿透击穿雪崩预热更新降级(代码片段)

...现下面几种情况,也经常会出现在Redis面试题中:缓存穿透、缓存击穿、缓存雪崩、缓存预热、缓存更新、缓存降级。本篇分别介绍这些概念以及对应的解决方案。一、缓存穿透缓存穿透:key对应的数据在数据源并不... 查看详情

快速缓存刷新cdn节点的简单方法(代码片段)

缓存刷新方式缓存刷新方式有URL刷新、目录刷新和URL预热。URL刷新是以文件为单位进行缓存刷新。目录刷新是以目录为单位,将目录下的所有文件进行缓存刷新。URL预热是以文件为单位进行资源预热。刷新后,会删除该资源在全... 查看详情

微服务框架springcloud微服务架构多级缓存48多级缓存48.7redis缓存预热(代码片段)

...springcloud微服务技术栈课程|黑马程序员Java微服务】多级缓存文章目录微服务框架多级缓存48多级缓存48.7Redis缓存预热48.7.1添加Redis缓存的需求48.7.2冷启动和缓存预热48.7.3缓存预热48多级缓存48.7Redis缓存预热48.7.1添加Redis缓存的需求... 查看详情

如何预热/预缓存受信任的 Web 活动

...0323:01:57【问题描述】:我目前正在使用TwaLauncher类从我的应用程序中使用如下代码启动受信任的Web活动:vallauncher=TwaLauncher(context)launcher.launch(Uri.parse(URL))这会从更广泛的本机应用程序中启 查看详情

全面理解redis雪崩击穿穿透预热降级一次全安排(代码片段)

...到达业务系统,想要获取某个数据,一般是先从缓存中获取,如果缓存中不存在就会去数据库中查询,如果查询到结果就将数据保存到缓存中再返回结果。一个新的技术的引进,必然会带来一些额 查看详情

场景应用:自己设计一个本地缓存(代码实现)(代码片段)

文章目录设计思想1.数据结构2.对象上限3.清除策略4.过期时间5.线程安全6.简明的接口7.是否持久化8.阻塞机制实现方案1.数据结构2.对象上限3.清除策略4.过期时间5.线程安全6.简明的接口7.是否持久化8.阻塞机制代码实战缓存元素Cach... 查看详情

场景应用:自己设计一个本地缓存(代码实现)(代码片段)

文章目录设计思想1.数据结构2.对象上限3.清除策略4.过期时间5.线程安全6.简明的接口7.是否持久化8.阻塞机制实现方案1.数据结构2.对象上限3.清除策略4.过期时间5.线程安全6.简明的接口7.是否持久化8.阻塞机制代码实战缓存元素Cach... 查看详情

常用缓存系统使用经验总结(代码片段)

0.前言缓存系统是提升系统性能和处理能力的利器,常用的缓存系统各自的特性和使用场景有所不同,这里总结下常用缓存系统时需要关注的点以及解决方案,以及业务中缓存系统的选型等。本文内容主要包括以下:缓存使用中... 查看详情

69_缓存预热解决方案:基于storm实时热点统计的分布式并行缓存预热

1、缓存预热缓存冷启动,redis启动后,一点数据都没有,直接就对外提供服务了,mysql就裸奔(1)提前给redis中灌入部分数据,再提供服务(2)肯定不可能将所有数据都写入redis,因为数据量太大了,第一耗费的时间太长了,第... 查看详情

限流实现与解决方案(代码片段)

...善于使用连接池业务层面:1、加入交互,排队等待二、应用级别限流与限流实现:方法一、使用google的guava,令牌桶算法实现:平滑突发限流(SmoothBursty)、平滑预热限流(SmoothWarmingUp)实现<!--Java项目广泛依赖的核心库--><depen... 查看详情

Django缓存:缓存预热时重新加载浏览器缓存

】Django缓存:缓存预热时重新加载浏览器缓存【英文标题】:Djangocaching:reloadbrowsercachewhencacheiswarmedup【发布时间】:2014-02-0608:55:56【问题描述】:我使用Angular作为前端,使用Django作为后端,并配置了内存缓存。我面临的问题是AJ... 查看详情

缓冲预热缓冲降级等问题

缓存预热系统上线后,将相关的缓存数据直接加载到缓存系统,避免在用户请求时,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!解决思路:1、直接写个缓存刷新页面,上线时手工操作下;2... 查看详情

mysql逻辑架构存储引擎和sql预热--mysql高级篇1(代码片段)

...ySQL有点与众不同,它的架构可以在多种不同的场景中应用并发挥良好的作用,主要体现在存储引擎的架构上。插件式的存储引擎架构将查询处理和其他的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需... 查看详情

redis缓存雪崩和缓存穿透缓存预热缓存降级

Redis缓存雪崩和缓存穿透、缓存预热、缓存降级缓存雪崩大量的key同时失效由于原有缓存失效,新缓存还没有存入到redis的期间比方说:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期,... 查看详情

h5应用程序缓存-cachemanifest(代码片段)

...服务器资源。二、适用场景正如manifest英译的名字:离线应用程序缓存,这项功能是设计给会有离线场景的应用来使用,例如:需要离线使用的手机APP/H5,亦或是PC端的纯静态页面。三、问题1.服务器资源更新后显示滞后需要多刷... 查看详情

redis6----应用问题解决和新功能预览(代码片段)

应用问题解决和新功能预览缓存穿透问题描述解决方案缓存击穿问题描述解决方案缓存雪崩问题描述解决方案分布式锁问题描述解决方案java代码实现优化之设置锁的过期时间优化之UUID防误删优化之LUA脚本保证删除的原子性总结R... 查看详情

cdn预热与刷新在促销活动中的应用

...CDN节点上去,而刷新是删除CDN节点上某个url的内容。两者应用的场景也有所不同:1、如果是页面秒杀类的业务,即某个H5页面入口在活动开始时刻才放开,这个H5的url需进行一下CDN预热。因为之前没用户点过,自然CDN节点上也不... 查看详情

java服务启动慢,jvm预热的问题,我在k8s上改进了(代码片段)

...验。JVM预热是一个非常头疼而又难解决的问题。基于JVM的应用程序在达到最高性能之前,需要一些 查看详情