【开发篇】十三、J2cache缓存框架

news2024/11/26 9:29:39

文章目录

  • 1、介绍
  • 2、二级缓存下数据的读取与更新
  • 3、整合
  • 4、使用举例
  • 5、配置的相关说明
  • 6、小结

请添加图片描述

1、介绍

J2cache是一个缓存整合框架,可以提供缓存的整合方案,使各种缓存搭配使用,自身不提供缓存功能

  • J2cache是一个两次缓存的框架

  • 第一级缓存L1使用内存,同时支持 Ehcache 2.x、Ehcache 3.x 和 Caffeine,默认一级为Caffeine

  • 第二级缓存L2使用 Redis(推荐)/Memcached,默认二级为Redis

  • 由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因此 L1 的目标是降低对 L2 的读取次数

J2Cache 从 1.3.0 版本开始支持 JGroups 和 Redis Pub/Sub 两种方式进行缓存事件的通知。在某些云平台上可能无法使用 JGroups 组播方式,可以采用 Redis 发布订阅的方式。详情请看 j2cache.properties 配置文件的说明。

2、二级缓存下数据的读取与更新

读取顺序:

  • L1 => L2 => DataBase

更新顺序:

  • 从数据库中读取最新数据,依次更新 L1 -> L2
  • 发送广播清除某个缓存信息
  • 接收到广播(手工清除缓存 & 一级缓存自动失效)
  • 从 L1 中清除指定的缓存信息

3、整合

以ehcache + redis为一二级缓存,进行整合。首先加入J2cache起步依赖坐标和核心依赖包:

<!--起步依赖-->
<dependency>    
	<groupId>net.oschina.j2cache</groupId>    
	<artifactId>j2cache-spring-boot2-starter</artifactId>   
	<version>2.8.0-release</version>
</dependency>

<!--j2cache的核心包(奇怪,干嘛不放起步依赖里)-->
<dependency>    
	<groupId>net.oschina.j2cache</groupId>    
	<artifactId>j2cache-core</artifactId>    
	<version>2.8.4-release</version>
</dependency>

注意,J2cache起步依赖里包含redis的起步依赖,这是因为J2cache框架的缓存技术默认使用的是Redis

在这里插入图片描述

加入缓存技术所对应的坐标,这里不用Redis,用ehcache:

<dependency>    
	<groupId>net.sf.ehcache</groupId>    
	<artifactId>ehcache</artifactId>
</dependency>

application.yaml中加入J2cache的配置:

j2cache:  
  config-location: j2cache.properties

写j2cache.properties文件,配置一级缓存与二级缓存以及一级缓存数据到二级缓存的发送方式

# 配置1级缓存
j2cache.L1.provider_class = ehcache
ehcache.configXml = ehcache.xml

# 配置2级缓存,注意这里的格式,别直接写redis,写供应商类的完整路径
j2cache.L2.provider_class = net.oschina.j2cache.cache.support.redis.SpringRedisProvider
j2cache.L2.config_section = redis  # section,即区域,这里写redis,那下面的redis.xxx的配置就是给我这个二级缓存的,相当于一个前缀
redis.hosts = localhost:6379  # redis.开头,是我二级缓存的配置没错

# 即一级二级缓存之间同步数据怎么同步
# 配置1级缓存数据到2级缓存的广播方式:可以使用redis提供的消息订阅模式,也可以使用jgroups多播实现
j2cache.broadcast = net.oschina.j2cache.cache.support.redis.SpringRedisPubSubPolicy

PS,关于配置文件,在library中搜j2cache-core,即它的核心包,底下有文件范例,里面还有属性的解释,copy就行:

在这里插入图片描述

在需要的地方,注入CacheChannel缓存操作对象即可进行缓存数据操作

@Autowired
private CacheChannel cacheChannel;

4、使用举例

还是以上篇模拟手机验证码为例,演示验证码的存取⇒ set、get

@Service
public class SMSCodeServiceImpl implements SMSCodeService {

	@Autowired
	private CacheChannel cacheChannel;
   
	@Override    
	public String sendCodeToSMS(String tele) {        
		String code = codeUtils.generator(tele);        
		cacheChannel.set("myarea",tele,code);        
		return code;    
	}  
	 
	@Override   
	public boolean checkCode(String tele,String checkCode) {       
		String code = cacheChannel.get("myarea",tele).asString();      
		 return checkCode.equals(code);    
	}
}

5、配置的相关说明

启动日志中发现有警告信息,前面日志框架学习时已经遇到过,SLF4J背后的日志实现技术导入了多种,绑定器发现有多个,这里显示最终使用了logback,那我们去从j2cache的starter中把slfj-simple的依赖排除掉就好。
在这里插入图片描述

再看日志,一级缓存、二级缓存中间有个redis模式为null的警告信息:

在这里插入图片描述

看下上面说的library下j2cache.properties的模板文件,可以直到这个就是Redis的模式选择,在自己的j2cache.properties里配下Redis的模式就可以处理掉这个警告信息。

在这里插入图片描述

还有一个配置:

redis.namespace = mySystemData

key前缀的分组的,默认为空,其余reids配置可自习查看模板文件。另外,还可以设置是否启用二级缓存:

j2cache.l2-cache-open = false # 关闭二级缓存

此时,数据只写往一级缓存,不再写入二级缓存redis

6、小结

到此缓存篇基本整理结束,缓存技术层有:

  • simple
  • ehcache
  • redis
  • memcached

可整合缓存技术的缓存框架有:

  • spring-cache
  • jetcache
  • j2cache

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

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

相关文章

2023年腾讯云双十一活动攻略整理汇总

腾讯云双十一大促活动通常会在每年的11月份进行&#xff0c;会提供一系列的优惠活动&#xff0c;包括云服务器、数据库、存储等产品的打折促销&#xff0c;以及代金券、满减券等福利。 活动入口&#xff1a; 点此直达腾讯云双十一活动页面 活动攻略&#xff1a; 腾讯云双十一…

vue3学习实战

vue3新增变化 diff算法变化 vue3的diff算法没有vue2的头尾、尾头之间的diff&#xff0c;对diff算法进行了优化&#xff0c;最长递归子序列。 ref VS reactive ref 支持所有的类型&#xff0c;reactive 支持引用类型&#xff0c;array object Map Setref取值、赋值&#xff…

【单片机】15-AD和DA转换

1.AD转换及其相关背景知识 1.基本概念 1.什么是AD转换&#xff1f; A&#xff08;A&#xff0c;analog&#xff0c;模拟的&#xff0c;D&#xff0c;digital&#xff0c;数字的&#xff09; 现实世界是模拟的&#xff0c;连续分布的&#xff0c;无法被分成有限份&#xff1b;…

小谈设计模式(13)—外观模式

小谈设计模式&#xff08;13&#xff09;—外观模式 专栏介绍专栏地址专栏介绍 外观模式主要目的角色分析外观&#xff08;Facade&#xff09;角色子系统&#xff08;Subsystem&#xff09;角色客户端&#xff08;Client&#xff09;角色 工作原理核心思想总结简化接口解耦客户…

Page Cache的产生和释放

Page Cache是如何产生和释放的&#xff0c;通俗一点&#xff0c;就是它的“生”&#xff08;分配&#xff09;与“死”&#xff08;释放&#xff09;&#xff0c;即 Page Cache 的生命周期。 Page Cache产生 Page Cache有两种产生的方式&#xff1a; Buffered I/O&#xff08…

十四天学会C++之第一天(入门和基本语法)

C的起源和历史 C诞生于20世纪80年代初&#xff0c;它的创造者是计算机科学家Bjarne Stroustrup。当时&#xff0c;Stroustrup在贝尔实验室工作&#xff0c;他希望为C语言添加一些功能&#xff0c;以便更好地支持系统开发。这个愿望促使他创建了C。 C的名字来源于它的基因&…

检索qpython文件夹下的.py,将文件复制单独文件夹并给出进度条

基本任务 检索qpython文件夹下的.py&#xff0c;将文件复制单独文件夹并给出进度条详细说明 首先导入了os和shutil模块&#xff0c;它们分别用于进行文件、文件夹操作和复制文件操作。 然后定义了源文件夹路径和目标文件夹路径。源文件夹路径指定了需要遍历的文件夹&#xff…

C语言刷题(Day1)

前言 本章我们带来几个经典得C语言练习题。 不要认为之前学过C语言&#xff0c;刷过这些题就不愿意再做题了。对待技术&#xff0c;我们永远要怀以一种空杯心态。 温故而知新&#xff0c;可以为师矣。 老师说&#xff0c;每道题都要尝试用不同得解法&#xff0c;去思考更多的…

动态规划算法(2)--最大子段和与最长公共子序列

目录 一、最大子段和 1、什么是最大子段和 2、暴力枚举 3、分治法 4、动态规划 二、最长公共子序列 1、什么是最长公共子序列 2、暴力枚举法 3、动态规划法 4、完整代码 一、最大子段和 1、什么是最大子段和 子段和就是数组中任意连续的一段序列的和&#xff0c;而…

Django之模板

一&#xff09;模板&#xff08;T&#xff09; 什么时候会使用模板呢&#xff1f; 仅对于Django这个框架来说&#xff0c;因为其是默认前后端不分离的框架&#xff08;前后端不分离值开发时前后端的代码在一起&#xff0c;不通过接口的方式连接&#xff0c;通过模板渲染的方式…

七大基于比较的排序算法(JAVA)

目录 冒泡排序 优化&#xff1a; 堆排序 插入排序 希尔排序 归并排序 快速排序 优化 选择排序 排序算法的稳定性&#xff1a; 大小相同的元素在排序前后相对位置相同就称其为稳定的排序。 注&#xff1a;一个本身就是稳定的排序 是可以实现为不稳定的排序的 &#x…

JavaSE学习之--抽象类,接口,内部类

&#x1f495;"没有眼泪我们就会迷路&#xff0c;彻底变成石头&#xff0c;我们的心会变成冰凌&#xff0c;吻会变成冰块。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;JavaSE学习之--抽象类&#xff0c;接口&#xff0c;内部类 目录 一.抽象…

【牛客网】OR59 字符串中找出连续最长的数字串

题目 思路 创建两个字符串 temp 和 ret 创建指针i用来遍历字符串通过i遍历字符串,如果遇到数字则将这个数组加到字符串temp中 i,如果遇到字母,则判断temp字符串的长度和ret字符串的长度,如果temp<ret则说明这个字符串不是要的字符串,如果temp>ret则说明此时temp字符串是…

线性表的链式存储结构——链表

一、顺序表优缺点 优点&#xff1a;我们知道顺序表结构简单&#xff0c;便于随机访问表中任一元素&#xff1b; 缺点&#xff1a;顺序存储结构不利于插入和删除&#xff0c;不利于扩充&#xff0c;也容易造成空间浪费。 二、链表的定义 ①&#xff1a;概念&#xff1a; 用一组任…

springmvc-页面跳转表单标签其他标签tomcat控制台中文乱码问题

1. WEB-INF下页面跳转 容器启动后&#xff0c;如何默认显示web-inf目录下的系统首页。 2. ModelAttribute来注解非请求处理方法 用途&#xff1a;预加载数据&#xff0c;会在每个RequestMapping方法执行之前调用。 特点&#xff1a;无需返回视图&#xff0c;返回类型void 示例…

【计算机网络黑皮书】应用层

【事先声明】 这是对于中科大的计算机网络的网课的学习笔记&#xff0c;感谢郑烇老师的无偿分享 书籍是《计算机网络&#xff08;自顶向下方法 第6版&#xff09;》 需要的可以私信我&#xff0c;无偿分享&#xff0c;课程简介下也有 课程连接 目录 应用层网络应用的原理应用架…

[BJDCTF2020]The mystery of ip

打开环境 点击flag&#xff0c;提示ip&#xff0c;这里确实就比较容易联想到x-forwarded-for 点击hint 这个好像没啥用 使用bp抓包 添加请求头 X-Forwarded-For:1 试一下 发现ip可控 后来查了发现 PHP可能存在Twig模版注入漏洞 参考https://www.cnblogs.com/zzjdbk/p/13…

Scala第十七章节

Scala第十七章节 scala总目录 文档资料下载 章节目标 了解集合的相关概念掌握Traversable集合的用法掌握随机学生序列案例 1. 集合 1.1 概述 但凡了解过编程的人都知道程序 算法 数据结构这句话, 它是由著名的瑞士计算机科学家尼古拉斯沃斯提出来的, 而他也是1984年图灵…

ADO连接Access的前期绑定方法实例(下)

【分享成果&#xff0c;随喜正能量】眾生多悲苦&#xff0c;發願‬菩提心。願今天所有聽見我、看見我、憶念我的眾生&#xff0c;因我心而‬生喜悅&#xff01;除消身心的痛苦&#xff01;種下脫解‬的種子&#xff01;願我等‬身心念力所及之處一切眾切‬生因佛得度&#xff0…