微服务学习笔记--高级篇--(多级缓存意义及JVM进程缓存)

这篇具有很好参考价值的文章主要介绍了微服务学习笔记--高级篇--(多级缓存意义及JVM进程缓存)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

多级缓存

亿级流量的缓存方案

传统缓存的问题

传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,存在下面的问题:

  • 请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈
  • Redis缓存失效时,会对数据库产生冲击

多级缓存方案

多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻Tomcat压力,提升服务性能:

用户发起请求-->浏览器客户端缓存-->nginx本地缓存-->nginx缓存未命中,Redis缓存-->Redis缓存未命中,进程缓存-->进程缓存未命中,redis数据库

用作缓存的Nginx是业务Nginx,需要部署为集群,再有专门的Nginx用来做反向代理


目录

  • JVM进程缓存
  • Lua语法入门
  • 多级缓存
  • 缓存同步策略

JVM进程缓存

  • 导入商品案例
  • 初识Caffeine
  • 实现进程缓存

安装MySQL教程

后续数据同步需要用到MySQL主从功能,需要在虚拟机中,利用Docker运行一个MySQL容器。

1.1准备目录

为了方便配置MySQL,先准备两个目录,用于挂载容器的数据和配置文件目录:

# 进入/tmp目录
cd /tmp
# 创建文件夹
mkdir mysql
# 进入mysql目录
cd mysql

1.2运行命令

进入mysql目录后,执行下面的Docker命令:

docker run \
 -p 3306:3306 \
 --name mysql \
 -v $PWD/conf:/etc/mysql/conf.d \
 -v $PWD/logs:/logs \
 -v $PWD/data:/var/lib/mysql \
 -e MYSQL_ROOT_PASSWORD=123 \
 --privileged \
 -d \
 mysql:5.7.25

1.3修改配置

在/tmp/mysql/conf目录添加一个my.cnf文件,作为mysql的配置文件:

# 创建文件
touch /tmp/mysql/conf/my.cnf

文件的内容如下:

[mysqlId]
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000

1.4重启

配置修改后,必须重启容器:

docker restart mysql

我们需要准备一个反向代理的nginx服务器,将静态的商品页面放到nginx目录中,页面需要的数据通过ajax向服务器(nginx业务集群)查询。

nginx的conf目录下的nginx.conf文件,关键的配置如下:

upstream nginx-cluster{
	server 192.168.150.101:8081; #nginx-cluster集群,就是将来的nginx业务集群
}
server {
	listen       80;
	server_name  localhost;

	location /api {
		proxy_pass http://nginx-cluster; #监听/api路径,反向代理到nginx-cluster集群
	}
}

初识Caffeine

本地进程缓存

缓存在日常开发中启动至关重要的作用,由于是存储在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力。我们把缓存分为两类:

分布式缓存,例如Redis:

  • 优点:存储容量更大、可靠性更好、可以在集群键共享
  • 缺点:访问缓存有网络开销
  • 场景:缓存数据量较大、可靠性要求较高、需要在集群间共享

进程本地缓存,例如HashMap、GuaveCache

  • 优点:读取本地内存,没有网络开销,速度更快
  • 缺点:存储容量有限、可靠性较低、无法共享
  • 场景:性能要求较高,缓存数据量较小

Caffeine是一个基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库。目前Spring内部的缓存使用的就是Caffeine。GitHub地址:https://github.com/ben-manes/caffeine

Caffeine示例

可以通过item-service项目中的单元测试来学习Caffeine的使用

@Test
void testBasicOps() {
	// 创建缓存对象
	Cache<String,String> cache = Caffeine.newBuilder().build();

	//存数据
	cache.put("gf","luxifa");
	
	//取数据,不存在则返回null
	String gf = cache.getIfPresent("gf");

	//取数据,不存在则去数据库查询
	String defaultGF = cache.get("defaultGF", key -> {
	//这里取数据库根据key查询value
	return "degula";
	});
}

Caffeine提供了三种缓存驱逐策略:

  • 基于容量:设置缓存的数量上限
//创建缓存对象
Cache<String,String> cache = Caffeine.newBuilder()
		.maximumSize(1)  //设置缓存大小上限为 1
		.build();
  • 基于时间:设置缓存的有效时间
//创建缓存对象
Cache<String,String> cache = Caffeine.newBuilder()
		.expireAfterWrite(Duration.ofSeconds(10) //设置缓存有效期为10秒,从最后一次写入开始计时
		.build();
  • 基于引用:设置缓存为软引用或弱引用,利用GC来回收缓存数据。性能较差,不建议使用。

在默认情况下,当一个缓存元素过期的时候,Caffeine不会自动立即将其清理和驱逐。而是在一次读或写操作后,或者在空闲时间完成对失败数据的驱逐。



实现进程缓存

案例:实现商品的查询的本地进程缓存

利用Caffeine实现下列需求:

  • 给根据id查询商品的业务添加缓存,缓存为命中时查询数据库
  • 给根据id查询商品库存的业务添加缓存,缓存未命中时查询数据库
  • 缓存初始大小为100
  • 缓存上限为1000

CaffeineConfig.java

@Configuration
public class CaffeineConfig {
	
	@Bean
	public Cache<Long,Item> itemCache() {
		return Caffeine.newBuilder()
				.initialCapacity(100)
				.maximumSize(10_000)
				.build();
	}

	@Bean
	public Cache<Long,ItemStock> stockCache() {
		return Caffeine.newBuilder()
				.initialCapacity(100)
				.maximumSize(10_000)
				.build();
	}
}

ItemController.java文章来源地址https://www.toymoban.com/news/detail-488373.html

@RestController
@RequestMapping("item")
public class ItemController {
	
	@Autowired
	private IItemService itemService;
	@Autowired
	private IItemStockService stockService;

	@Autowired
	private Cache<Long,Item> itemCache;
	@Autowired
	private Cache<Long,ItemStock> stockCache;

	@GetMapping("/{id}")
	public Item findById(@PathVariable("id") Long id) {
		return itemCache.get(id,key -> itemService.query()
				.ne("status",3).eq("id",key)
				.one()
		);
	}

	@GetMapping("/stock/{id}")
	public ItemStock findStockById(@PathVariable("id") Long id) {
		return stockCache.get(id,key -> stockService.getById(id));
	}
}

到了这里,关于微服务学习笔记--高级篇--(多级缓存意义及JVM进程缓存)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 黑马Redis视频教程高级篇(二:多级缓存)

    目录 一、什么是多级缓存? 二、JVM进程缓存 2.1、导入案例 2.2、初识Caffeine 2.3、实现JVM进程缓存 2.3.1、需求 2.3.2、实现 三、Lua语法入门 3.1、初识Lua 3.2、HelloWord 3.3、变量和循环 3.3.1、Lua的数据类型 3.3.2、声明变量 3.3.3、循环 3.4、条件控制、函数 3.4.1、函数 3.4.2、条件控制

    2024年02月09日
    浏览(37)
  • 中间件系列 - Redis入门到实战(高级篇-多级缓存)

    学习视频: 黑马程序员Redis入门到实战教程,深度透析redis底层原理+redis分布式锁+企业解决方案+黑马点评实战项目 中间件系列 - Redis入门到实战 本内容仅用于个人学习笔记,如有侵扰,联系删除 学习目标 JVM进程缓存 Lua语法入门 实现多级缓存 缓存同步策略 传统的缓存策略

    2024年02月03日
    浏览(57)
  • JVM进程缓存Caffeine

    导入坐标: 写一个配置类: 注入bean // 取数据,包含两个参数: // 参数一:缓存的key // 参数二:Lambda表达式,表达式参数就是缓存的key,方法体是查询数据库的逻辑 // 优先根据key查询JVM缓存,如果未命中,则执行参数二的Lambda表达式 增删改 都要清除缓存

    2024年02月11日
    浏览(50)
  • Redis进阶 - JVM进程缓存

    原文首更地址,阅读效果更佳! Redis进阶 - JVM进程缓存 | CoderMast编程桅杆 https://www.codermast.com/database/redis/redis-advance-jvm-process-cache.html 传统缓存的问题 传统的缓存策略一般是请求到达 Tomcat 后,先查询 Redis ,如果未命中则查询数据库,存在下面的问题: 请求要经过 Tomcat 处理

    2024年02月11日
    浏览(37)
  • 微服务(多级缓存)

    目录 多级缓存 1.什么是多级缓存 2.JVM进程缓存 2.2.初识Caffeine 2.3.实现JVM进程缓存 2.3.1.需求 2.3.2.实现 3.Lua语法入门 3.1.初识Lua 3.1.HelloWorld  3.2.变量和循环 3.2.1.Lua的数据类型 3.2.2.声明变量 3.2.3.循环 3.3.条件控制、函数 3.3.1.函数 3.3.2.条件控制 3.3.3.案例 4.实现多级缓存 4.1.安装

    2024年02月11日
    浏览(32)
  • 微服务08-多级缓存

    传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: •请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 •Redis缓存失效时,会对数据库产生冲击 多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻T

    2024年02月13日
    浏览(43)
  • 微服务中间件--多级缓存

    传统缓存的问题 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,存在下面的问题: 请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 Redis缓存失效时,会对数据库产生冲击 多级缓存方案 多级缓存就是充分利用请求处理的每个环节,分别

    2024年02月11日
    浏览(49)
  • 服务端应用多级缓存架构方案

    20w的QPS的场景下,服务端架构应如何设计? 可使用分布式缓存来抗,比如redis集群,6主6从,主提供读写,从作为备,不提供读写服务。1台平均抗3w并发,还可以抗住,如果QPS达到100w,通过增加redis集群中的机器数量,可以扩展缓存的容量和并发读写能力。同时,缓存数据对于

    2024年02月16日
    浏览(39)
  • 重温《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)》 –– 学习笔记(一)

    第1章:走近Java 1.1 Java的技术体系 SUN 官方所定义的 Java 技术体系包括:Java程序设计语言、Java虚拟机、Class文件格式、Java API类库、第三方(商业机构和开源社区)Java类库。 其中,「Java程序设计语言」、「Java虚拟机」、「Java API类」这三个被称为 JDK(Java Deployment Kit),即

    2024年01月23日
    浏览(50)
  • Redis学习(三)分布式缓存、多级缓存、Redis实战经验、Redis底层原理

    单节点Redis存在着: 数据丢失问题:单节点宕机,数据就丢失了。 并发能力和存储能力问题:单节点能够满足的并发量、能够存储的数据量有限。 故障恢复问题:如果Redis宕机,服务不可用,需要一种自动的故障恢复手段。 RDB持久化 RDB(Redis database backup file,Redis数据库备份

    2024年02月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包