微服务架构 | 多级缓存

news2024/11/19 2:17:39

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{
	//redis
	private 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);
			}
		}
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1500919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何将github上代码克隆到本地

1、需求 想把github上一篇论文的代码下载到本地。 2、前提 本地电脑已经安装了Git。&#xff08;没有安装需要到官网下载安装&#xff09; 3、解决方法 大功告成

20 卷积层里的填充和步幅【李沐动手学深度学习v2课程笔记】

1. 填充和步幅 在上下左右分别填充一些0 2. 代码实现 2.1 填充 我们创建一个高度和宽度为3的二维卷积层&#xff0c;并在所有侧边填充1个像素。给定高度和宽度为8的输入&#xff0c;则输出的高度和宽度也是8。 import torch from torch import nn# 为了方便起见&#xff0c;…

【前端】-初始前端以及html的学习

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

实用干货:分享4个冷门但非常实用的HTML属性

大家好&#xff0c;我是大澈&#xff01; 本文约1100字&#xff0c;整篇阅读大约需要2分钟。 关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费加入问答群&#xff0c;一起交流技术难题与未来&#xff01; 现在关注公众号&#xff0c;免费送你 ”前后端入行大礼包…

详解float函数类型转换

函数描述 float([x]) 函数将数字或数字的字符串表示形式转换为与它等效的有符号浮点数。如果参数x是一个字符串&#xff08;十进制表示的数字串&#xff09;&#xff0c;数字前面可以添加符号来表示正数&#xff0c;或负数。符号和数字之间不能出现空格&#xff0c;但是符号前…

AI数据分析软件-BeepBI的诞生结束了传统BI时代,引领了数据分析零门槛的时代

#AI数据分析# 随着人工智能(AI)的日益成熟&#xff0c;数据分析领域正迎来一场革命性的变革。在这场变革中&#xff0c;DeepBI凭借实现了用ai数据分析&#xff0c;与传统BI工具相比&#xff0c;展现出了前所未有的便捷性和易上手特性&#xff0c;真正实现了数据分析的零门槛。…

灵魂指针,教给(二)

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 目录 一、数组名的理解 二、使用指针访问数组 三、一维数组传参本质 四、冒泡排序 五、二级指针 六、指针数组 七、指针数组…

JavaWeb——014SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)

SpingBoot原理 目录 SpingBoot原理1. 配置优先级2. Bean管理2.1 获取Bean2.2 Bean作用域2.3 第三方Bean 3. SpringBoot原理3.1 起步依赖3.2 自动配置3.2.1 概述3.2.2 常见方案3.2.2.1 概述3.2.2.2 方案一3.2.2.3 方案二 3.2.3 原理分析3.2.3.1 源码跟踪3.2.3.2 Conditional 3.2…

Threejs用切线实现模型沿着轨道行驶

这次讲一个经常遇到的使用场景&#xff0c;让模型沿着轨迹运动&#xff0c;这个场景需要解决两个问题&#xff0c;第一是让模型沿着轨迹运动&#xff0c;第二是在沿着轨迹运动的同时&#xff0c;要保持模型的头部也时刻保持前方&#xff0c;而不是单纯的只是更新模型位置。 还是…

Type-C接口PD协议统一:引领电子科技新纪元的优势解析

在电子科技日新月异的今天&#xff0c;充电接口的统一化已经成为了业界的一大趋势。其中&#xff0c;Type-C接口凭借其传输速度快、使用便捷等优点&#xff0c;迅速成为了市场上的主流选择。而PD&#xff08;Power Delivery&#xff09;协议的统一&#xff0c;更是为Type-C接口…

jenkins+selenium+python实现web自动化测试

jenkinsselenium可以做到对web自动化的持续集成。 Jenkins的基本操作&#xff1a; 一、新建视图及job 新建视图&#xff1a; 新建job&#xff1a; 可以选择构建一个自由风格的软件项目或者复制已有的item 二、准备工作&#xff1a; 安装Jenkins插件&#xff0c;SSH plugin …

零基础,学6个月嵌入式,能找到工作吗?

今天看到一个老铁问&#xff0c;他报了个班&#xff0c;学6个月&#xff0c;学完能找到工作吗&#xff1f; 我看了下他的学习内容&#xff0c;包含C语言、数据结构、系统编程、网络编程、STM32、RTOS、物联网通讯协议、Linux内核驱动&#xff0c;这是大纲&#xff0c;细节的课程…

混合输入矩阵乘法的性能优化

作者 | Manish Gupta OneFlow编译 翻译&#xff5c;宛子琳、杨婷 AI驱动的技术正逐渐融入人们日常生活的各个角落&#xff0c;有望提高人们获取知识的能力&#xff0c;并提升整体生产效率。语言大模型&#xff08;LLM&#xff09;正是这些应用的核心。LLM对内存的需求很高&…

Haproxy介绍、安装

Haproxy介绍、安装 文章目录 Haproxy介绍、安装1.Haproxy介绍1.1 企业版1.2 社区版1.3 版本对比1.4 HAProxy功能 2.HAProxy安装2.1 主机初始化2.1.1 设置网卡名和ip地址2.1.2 配置镜像源2.1.3 关闭防火墙2.1.4 禁用SELinux2.1.5 设置时区 2.2 包安装2.2.1 Ubuntu 安装2.2.2 Cen…

透视B站财报:从前景看“钱景”

3月7日晚&#xff0c;哔哩哔哩发布了2023年度及第四季度财报。 财报显示&#xff0c;哔哩哔哩2023年总营收225亿元&#xff0c;净亏损同比大幅收窄49%&#xff0c;其中第四季度总营收达63.5亿元。 在后续电话会议上&#xff0c;哔哩哔哩管理层对市场上重点关注的“B站2024年能…

python界面开发 - Menu (popupmenu) 右键菜单

文章目录 1. python图形界面开发1.1. Python图形界面开发——Tkinter1.2. Python图形界面开发——PyQt1.3. Python图形界面开发——wxPython1.4. Python图形界面开发—— PyGTK&#xff1a;基于GTK1.5. Python图形界面开发—— Kivy1.6. Python图形界面开发——可视化工具1.7. …

在外包公司干了3年,出来发现技术退步太明显...

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了3年的功能测试&#xff…

LoadBalancer 客户端的负载均衡器+openFeign 请求转发

LoadBalancer Spring Cloud LoadBalancer是Spring Cloud中负责客户端负载均衡的模块&#xff0c;其主要原理是从nacos中获取服务列表通过选择合适的服务实例来实现负载均衡。 源码跟踪 可以看到这里的intercept()方法&#xff0c;拦截了用户的HttpRequest请求&#xff0c;然…

【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…

超级简单的Docker安装(centos7)

文章目录 先安装所需要的工具包设置远程仓库安装启动docker查看版本 先安装所需要的工具包 yum install -y yum-utils #安装工具包&#xff0c;缺少这些依赖将无法完成&#xff1b;设置远程仓库 yum-config-manager --add-repo https://download.docker.com/linux/centos/doc…