微服务架构 | 多级缓存
INDEX
- 通用设计概述
- §2 优势
- §3 最佳实践
通用设计概述
通用设计思路如下图

内容分发网络(CDN)
可以理解为一些服务器的副本,这些副本服务器可以广泛的部署在服务器提供服务的区域内,并存有服务器中的一些数据。
用户访问原始服务器时,其中的静态资源(比如banner图片、图标、js脚本、css文件、静态页面等)会由 CDN 分发到距离用户较近的副本服务器上并返回对应内容,加速访问效率
原始请求经过 CDN 后,会自动按请求内容分发至距离合适的副本服务器或原始服务器
OpenResty
OpenResty,附 官网,是一个基于 Nginx + Lua 实现的服务端开发平台。
其目的旨在在合适的情况下跳过服务,直接访问服务对应的资源本身
JVM 进程缓存(caffeine)
服务级缓存(Redis)
数据持久层
§2 优势
- 分担缓存压力
- 进程缓存相对于分布式缓存,节省了网络io的开销,速度更快
- 使用时,可以减少访问redis的频率,从根源上避免缓存的穿透、击穿、雪崩
- 可用性更强,即使进程缓存、分布式缓存之一不可用,也不会导致整体缓存失效,可以争取服务恢复时间
§3 最佳实践
最佳实践
- 使用 caffeine + redis + mysql 搭建二级缓存
- 自定义缓存控制器
CacheManager - 增设监听 redis 失效 key
- 支持断线重连
自定义缓存控制器 & redis 监听
示例代码
//缓存管理器
public class CacheManager{//redisprivate CacheFrontend cf;//香菜连接池private RedisClient rc;//本地缓存private Cache lc;//redis 连接栈StatefulRedisConnection<String,String> connection;//监听 redis 失效 key//连接正常时,通过 lisenter 监听redis事件,当事件为失效时同步清理本地缓存public void check(){if(connection != null && connection.isOpen)return ;try{connection = rc.connect();cf= ClientSideCaching.enable(new CaffeineCacheAccessor(lc),connection,TrackingArgs.Builder.enabled());connection.addListener(msg->{List<Object> content = msg.getContent(StringCodec.UTF8::decodeKey);//日志输出if(msg.getType().equalsIgnoreCase("invalidate")){List<String> keys = (List<String>)content.get(1);keys.forEach(k->lc.invalidate(k));}});}catch(){//略}}
}//本地缓存访问器
//代理 caffeine client,使之实现香菜连接池中 CacheAccessor 接口
public class CaffeineCacheAccessor implements CacheAccessor{private Cache lc;//本地缓存客户端,这里可以是 caffeine//示例方法,其他方法同样public Object get(Object key){return lc.getIfPresent(key);}
}//心跳检测
@Bean
public CommandLimeRunner init(CacheManager cm){return new CommandLineRunner(){public void run(String... args) throws Exception{while(true){cm.check();TimeUnit.SECONDS.sleep(5);}}}
}
相关文章:
微服务架构 | 多级缓存
INDEX 通用设计概述2 优势3 最佳实践 通用设计概述 通用设计思路如下图 内容分发网络(CDN) 可以理解为一些服务器的副本,这些副本服务器可以广泛的部署在服务器提供服务的区域内,并存有服务器中的一些数据。 用户访问原始服务器…...
怎么将pom在文件放到src下方
今天在IDEA从git拉取项目的时候,发现pom.xml文件在文件夹src的上方,平时看惯了项目的pom.xml文件在文件夹src的下方,应该怎么去设置呢? 点击设置——>点击Folder Always on Top 即可 参考:http://t.csdnimg.cn/s34…...
浅谈网络爬虫与Web安全
网络爬虫(Web Crawler),又称网络蜘蛛(Web Spider)或网络机器人(Web Robot),是一种按照一定的规则自动抓取万维网资源的程序或者脚本,已被广泛应用于互联网领域。搜索引擎使用网络爬虫抓取Web网页、文档甚至图片、音频、视频等资源,…...
C++vector的使用方法
文章目录 一、vector的介绍1. 文档链接2. 简要介绍 二、vector的使用1.vector的定义(1)构造函数(2)拷贝构造函数(2)赋值重载 2. vector 增删查改(1)operator [](2&#x…...
视频生成模型Sora的全面解析:从AI绘画、ViT到ViViT、DiT、VDT、NaViT、VideoPoet
视频生成模型Sora的全面解析:从AI绘画、ViT到ViViT、DiT、VDT、NaViT、VideoPoet 真没想到,举例视频生成上一轮的集中爆发才过去三个月,没想OpenAI一出手,该领域又直接变天了自打2.16日OpenAI发布sora以来,不但把同时…...
4.1k star,官方出品的redis桌面管理工具——redislnsight
导航 令人抓狂的大key加载RedisInsight 简介RedisInsight的亮点GitHub 地址安装和使用RedisInsight 下载安装 使用RedisInsight redis数据库可视化直观的CLI(Command-Line Interface)日志分析和命令分析 结语参考 令人抓狂的大key加载 工欲善其事必先利…...
论文目录3:大模型时代(2023+)
1 instruction tuning & in context learning 论文名称来源主要内容Finetuned Language Models Are Zero-Shot Learners2021 机器学习笔记:李宏毅ChatGPT Finetune VS Prompt_UQI-LIUWJ的博客-CSDN博客 早期做instruction tuning的work MetaICL: Learning to …...
FPGA IBUFG
IBUFG和IBUFGDS的输入端仅仅与芯片的专用全局时钟输入管脚有物理连接,与普通IO和其它内部CLB等没有物理连接。 所以,IBUFG输入的不能直接接另外信号。 GTH transceiver primitives are called GTHE3_COMMON and GTHE3_CHANNEL in UltraScale FPGAs, an…...
探索数据结构:单链表的实战指南
✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty‘s blog 前言 在上一章节中我们讲解了数据结构中的顺序表,知道了顺序…...
短视频矩阵系统----矩阵系统源码搭建(技术门槛?)
短视频矩阵是什么意思?短视频矩阵的含义可以理解为全方位的短视频账号,通过不同的账号实现全方位的品牌展示。实际上是指一个短视频账号,通过不同的链接实现品牌展示,在不同的粉丝流量账号中互相转发同一个品牌,在主账…...
Spring事务注解@Transactional的流程和源码分析
Spring事务简介 Spring事务有两种方式: 编程式事务:编程式事务通常使用编程式事务管理API实现,比如Spring提供的PlatformTransactionManager接口,使用它手工编码去操控事务。声明式事务:注解式事务使用AOP࿰…...
在别的地方下载的二次封装Windows镜像怎么安装?GHO镜像详细安装教程
前言 在系统之家或者其他地方下载的镜像文件怎么装到电脑上? 首先要知道系统之家下载的Windows镜像文件基本上都是.iso结尾的,要进入到对应镜像包才能看出系统镜像是什么格式。 如何分辨镜像的格式 选择对应的.iso镜像,点击【鼠标右键】-【装…...
使用Lerna + Yarn Workspace管理Monorepo项目
1.前言 通常,我们会根据自身业务的实际情况,将通用的组件、逻辑等提取成NPM包,方便以后复用。但这些提取出来的NPM包可能互相之间存在依赖,如果仍然采用 Multirepo 的形式进行管理,则在包的版本管理、依赖管理、调试等…...
如何将gzip后缀压缩包重命名任意后缀名并依然通过gzip.open()读取压缩包文件内容
在 Python 中,gzip.open() 用于解压缩 .gz 后缀的文件。因此,如果您将文件的后缀从 .gz 更改为其他后缀,例如 .diy,然后尝试使用 gzip.open() 打开它,会导致失败,因为 Python 会尝试使用 gzip 解压缩它&…...
C语言从入门到精通 第十一章(文件操作)
写在前面: 本系列专栏主要介绍C语言的相关知识,思路以下面的参考链接教程为主,大部分笔记也出自该教程。除了参考下面的链接教程以外,笔者还参考了其它的一些C语言教材,笔者认为重要的部分大多都会用粗体标注…...
安装安卓studio无法下载sdk解决方法
安装安卓studio无法下载sdk的解决方法如下: 因为google被墙了,android sdk无法下载。 只要修改host文件,就可以下载sdk了。host文件的位置在:C:\Windows\System32\drivers\etc\hosts host文件添加如下内容: #google_…...
express+mysql+vue,从零搭建一个商城管理系统10--添加商品
提示:学习express,搭建管理系统 文章目录 前言一、新建models/goods.js二、新建routes/goods.js三、添加goods表四、添加商品总结 前言 需求:主要学习express,所以先写service部分 一、新建models/goods.js models/goods.js con…...
java实现大文件的分割与合并
最近遇到一个问题,某网盘上传文件时,文件大小超过了4个G ,不能上传,所以就想到了利用的java的IO流,将文件分割成多个小文件,上传到网盘上,等到需要用的时候,下载下来然后再进行文件的…...
【计网】TCP协议安全与风险:深入探讨网络通信的基石
🍎个人博客:个人主页 🏆个人专栏:Linux ⛳️ 功不唐捐,玉汝于成 目录 🌐前言 🔒正文 TCP (Transmission Control Protocol): UDP (User Datagram Protocol): HTTP (Hypertext Transfer …...
苹果App Store上架工具介绍
文章目录 摘要引言正文1. Xcode2. [appuploder](https://www.applicationloader.net/)3. [克魔助手](https://keymob.com/) 4.[ipa guard](https://www.ipaguard.com/)总结参考资料 摘要 苹果App Store作为iOS应用程序的主要分发渠道,上架应用程序需要遵守规定和通…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...
pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?
系列回顾: 在上一篇《React核心概念:State是什么?》中,我们学习了如何使用useState让一个组件拥有自己的内部数据(State),并通过一个计数器案例,实现了组件的自我更新。这很棒&#…...
【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验
2024年初,人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目(一款融合大型语言模型能力的云端AI编程IDE)时,技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力,TRAE在WayToAGI等…...
41道Django高频题整理(附答案背诵版)
解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...
李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...
