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

微服务架构 | 多级缓存

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);}}}
}
http://www.lryc.cn/news/313818.html

相关文章:

  • 怎么将pom在文件放到src下方
  • 浅谈网络爬虫与Web安全
  • C++vector的使用方法
  • 视频生成模型Sora的全面解析:从AI绘画、ViT到ViViT、DiT、VDT、NaViT、VideoPoet
  • 4.1k star,官方出品的redis桌面管理工具——redislnsight
  • 论文目录3:大模型时代(2023+)
  • FPGA IBUFG
  • 探索数据结构:单链表的实战指南
  • 短视频矩阵系统----矩阵系统源码搭建(技术门槛?)
  • Spring事务注解@Transactional的流程和源码分析
  • 在别的地方下载的二次封装Windows镜像怎么安装?GHO镜像详细安装教程
  • 使用Lerna + Yarn Workspace管理Monorepo项目
  • 如何将gzip后缀压缩包重命名任意后缀名并依然通过gzip.open()读取压缩包文件内容
  • C语言从入门到精通 第十一章(文件操作)
  • 安装安卓studio无法下载sdk解决方法
  • express+mysql+vue,从零搭建一个商城管理系统10--添加商品
  • java实现大文件的分割与合并
  • 【计网】TCP协议安全与风险:深入探讨网络通信的基石
  • 苹果App Store上架工具介绍
  • TCP重传机制、滑动窗口、拥塞控制
  • electron+vue3全家桶+vite项目搭建【29】封装窗口工具类【3】控制窗口定向移动
  • 深入了解304缓存原理:提升网站性能与加载速度
  • python-批量操作excel
  • #QT(串口助手-界面)
  • C语言进阶——位段
  • 软件设计师软考题目解析23 --每日五题
  • 总结:前后端集合、数组类型数据交互底层原理,SpringBoot框架解析
  • 2024蓝桥杯每日一题(前缀和)
  • 2007-2022年上市公司迪博内部控制评价缺陷数量数据
  • JAVA虚拟机实战篇之内存调优[4](内存溢出问题案例)