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

从小白到架构师 | 缓存预热

缓存预热指的是在系统启动或上线前,提前将经常访问的数据加载到缓存中,以避免在系统刚启动时,用户大量请求直接访问数据库,导致数据库压力过大或系统性能下降。通过缓存预热,可以确保系统一上线就能提供快速的响应时间和良好的用户体验。

缓存预热的几种解决方案:

  • 手动预热:系统管理员在系统启动前,手动触发一些接口,将数据加载到缓存中。
  • 自动预热
  • 定时预热

缓存预热的几种解决方案

自动预热

系统启动时,自动加载预定义的一些数据到缓存中。

public class CacheService {private final Map<String, Data> cache = new ConcurrentHashMap<>();private final Database database = new Database();public CacheService() {// 系统启动时自动预热autoPreheat();}private void autoPreheat() {// 自动预热常用数据cache.put("key1", database.getData("key1"));cache.put("key2", database.getData("key2"));}public Data getData(String key) {return cache.get(key);}
}
定时预热

系统定期自动加载常用数据到缓存中,确保缓存中的数据是最新的。

public class CacheService {private final Map<String, Data> cache = new ConcurrentHashMap<>();private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);private final Database database = new Database();private final long CACHE_REFRESH_INTERVAL = 30; // 每 30 秒预热一次public CacheService() {// 启动定时预热任务scheduler.scheduleAtFixedRate(this::preheatCache, 0, CACHE_REFRESH_INTERVAL, TimeUnit.SECONDS);}private void preheatCache() {// 定时预热常用数据cache.put("key1", database.getData("key1"));cache.put("key2", database.getData("key2"));}public Data getData(String key) {return cache.get(key);}public void shutdown() {scheduler.shutdown();}
}

如何确定需要预先缓存哪些数据

确定需要预热哪些数据是缓存预热的关键和难点之一。选择错误的数据预热不仅浪费资源,也无法提高系统性能。以下是一些确定需要预热数据的方法。

基于历史访问数据

分析系统的历史访问日志,找出访问频率较高的数据,优先将这些数据缓存。

public class CacheService {private final Map<String, Data> cache = new ConcurrentHashMap<>();private final Database database = new Database();private final AccessLog accessLog = new AccessLog();public CacheService() {// 启动时预热缓存preheatCache();}private void preheatCache() {for (String key : accessLog.getFrequentKeys()) {cache.put(key, database.getData(key));}}public Data getData(String key) {return cache.get(key);}
}class Data {// 模拟数据类
}class Database {public Data getData(String key) {// 从数据库获取数据return new Data();}
}class AccessLog {// 模拟访问日志public List<String> getFrequentKeys() {// 返回访问频率较高的keyreturn Arrays.asList("key1", "key2", "key3");}
}
基于业务逻辑

根据业务场景,确定哪些数据在系统启动时是必需的。例如,电子商务网站的首页商品推荐,新闻网站的头条新闻等。


public class CacheService {private final Map<String, Data> cache = new ConcurrentHashMap<>();private final Database database = new Database();public CacheService() {// 启动时预热缓存preheatCache();}private void preheatCache() {// 根据业务逻辑预热数据cache.put("homepageData", database.getData("homepageData"));cache.put("popularProducts", database.getData("popularProducts"));}public Data getData(String key) {return cache.get(key);}
}class Data {// 模拟数据类
}class Database {public Data getData(String key) {// 从数据库获取数据return new Data();}
}
http://www.lryc.cn/news/412920.html

相关文章:

  • Modbus -- TCP协议
  • python四舍五入取整数
  • 洛谷 P1868 饥饿的奶牛
  • Arco Design 之Table表格
  • Python机器学习 模型
  • 基于 STM32 的 NAS私有云盘搭建:集成LwIP 协议、HTTP/HTTPS、WEB前端技术栈(代码示例)
  • 蓝屏?死机?爆CPU?多开卡顿?你有关心过你的硬盘吗?
  • Flutter开发报错error: unable to unlink old ‘pubspec.yaml‘: Invalid argument
  • 零基础进程最详解:进程状态、僵尸进程、孤儿进程、阻塞态、挂起态、进程切换、进程常用命令、进程创建、队列优先级
  • Redis的分布式锁
  • C++笔记---类和对象
  • 全国区块链职业技能大赛样题第9套后端源码
  • 3个功能强大的PDF转换工具,免费试用
  • 表单修改数字输入框保留小数点
  • [VS Code扩展]写一个代码片段管理插件(一):介绍与界面搭建
  • vxe grid slots 用法
  • 【网络】基于UDP协议的聊天室(第二篇)
  • 【SpringBoot3】场景整合(实战)
  • 【全网最全最详细】MYSQL 面试题大全(上)
  • 【C语言】程序环境,预处理,编译,汇编,链接详细介绍,其中预处理阶段重点讲解
  • 人生低谷来撸C#--021 多线程
  • 【优秀python django系统案例】基于python的医院挂号管理系统,角色包括医生、患者、管理员三种
  • 硬盘数据丢失不再怕,四大恢复工具帮你轻松逆转局面!
  • 自定义封装日历组件
  • 【大模型】【面试】独家总结表格
  • C# 6.定时器 timer
  • 有了 createSlice,还有必要使用 createReducer 吗?什么情况需要 createReducer 呢?
  • 怎么搭建AI带货直播间生成虚拟主播?
  • 设计模式的原则
  • RocketMQ与RabbitMQ的区别:技术选型指南