快速掌握缓存技术:学习多个缓存供应商(ehcache,redis,memcached,jetcache,j2cache)

缓存技术

  • 缓存
    • 模拟缓存
    • Spring缓存技术
    • 第三方缓存技术
      • Ehcache缓存供应
      • Redis缓存
      • memcached缓存(国内)
  • jetcache缓存供应商
    • jetcache的基本使用
      • 设置外部服务
      • 设置本地服务
    • jetcache方法缓存
    • j2cache

缓存

  • 什么是缓存

缓存是一种介于数据永久存储介质与数据应用之间的数据临时存储介质

使用缓存可以有效的减少低速数据读取过程的次数(例如磁盘IO),提高系统性能

缓存不仅可以用于提高永久性存储介质的数据读取效率,还可以提供临时的数据存储空间

模拟缓存

手动写一个模拟缓存的demo,这里我们在server层中模拟一个缓存

@Server
public class Bookserverimpl implements Bookserver{
@Autowired
private BookDao bookdao;
private HashMap<Integer,Book> cache=new HashMap<Integer,Book>();
public Book getById(Integer id){
Book book=cache.get(id);
if(book=null){
Book qubook=BookDao.selectById(id);
cache.put(id,qubook);
return qubook;
}
}
return cache.get(id);
}

这里面的HashMap对象充当一个缓存器,对数据库中的数据进行查询,先对缓存中进行查询,当缓存中有这个数据的时候就查询缓存中的数据,当缓存中没有的时候再在数据库中进行查询并添加到缓存器中

Spring缓存技术

SpringBoot提供了缓存技术,方便缓存使用
首先导入缓存的依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

在启动类中加入注解 @EnableCaching表示启动缓存

@SpringBootApplication
@EnableCaching
public class SpringbootApplication{
}

在服务层使用缓存技术:

@Cacheable(value="cacheSpace",key="#id")
public Book getByid(Integer id){
}

但是这里有一个问题,在这个注解中也有向外读取的操作,我们应该将注解换成 @CachePut
value属性指创建一个存储空间,其中放入key的值,#id表示可以读取名为id 的值

上述操作就是spring官方默认的缓存技术,除此之外,spring还可以整合第三方的缓存技术,统一接口,实现高效开发

第三方缓存技术

第三方缓存技术

Ehcache缓存供应

导入ehcache的依赖:

        <dependency>
            <groupId>ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>1.2</version>
        </dependency>

在配置文件中设置cache的类型启用ehcache

spring:
   cache:
      type: ehcache
      ehcache:
         config: ehcache.xml

使用ehcache需要有一个其独立的配置文件,用来配置其中的设置
在这里插入图片描述
在配置文件当中缓存还可以多次进行配置,我再写一个defaultCache用name区分

<defaultCache
    name="cacac"
    ....
    />
  • 注意

当我们改换第三方技术的时候,原有的默认注解并没有进行改变,依然可以正常使用

Redis缓存

首先先导入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

在配置文件中选择cache的类型为redis

  redis:
    host: localhost
    port: 6379

redis的相关配置也在配置文件中进行配置

spring:
  cache:
    type: redis
    redis:
      use-key-prefix: true   #是否使用前缀
      cache-null-values: false  #是否缓存空值
      key-prefix:  aa  #指定前缀
      time-to-live: 10s #最大活动周期

注意属性的层次尤其是redis
在这里插入图片描述

memcached缓存(国内)

下载memcached
地址:https://www.runoob.com/memcached/window-install-memcached.html
下载之后解压目录:
在管理员权限下运行cmd,进入到当前目录中输入命令安装并启动服务
在这里插入图片描述
当需要服务停止的时候输入memcached.exe -d stop

  • memcached客户端选择
  1. Memcached Client for java:最早期客户端,稳定可靠,用户群广
  2. SpyMemcached: 效率更高
  3. Xmemcached: 并发处理好

我们这里采用技术更加先进的Xmemcached技术,但是SpringBoot未提供对xmemcached的整合,需要使用硬编码方式实现客户端初始化管理

首先导入依赖:

        <dependency>
           <groupId>com.googlecode.xmemcached</groupId>
            <artifactId>xmemcached</artifactId>
            <version>2.4.7</version>
        </dependency>

写一个控制类


@Configuration
public class XmemcachedConfig {
    @Bean
    public MemcachedClient getmemcacheclient() throws IOException {
        MemcachedClientBuilder memcachedClientBuilder=new XMemcachedClientBuilder("localhost:11211");
        MemcachedClient memcachedClient=memcachedClientBuilder.build();
        return memcachedClient;
    }
}

像控制类中的配置信息还可以通过配置文件进行自定义配置:

memcached:
   servers: localhost:11211
   poolSize: 10               #连接池的最大连接数
   opTimeout: 3000

自定义文件之后配置一个对应的属性类进行配置

@Component
@ConfigurationProperties(prefix="memcached")
@Data
public class Xmemcachedproperties{
   private String servers;
   private int poolSize;
   private long opTimeout;
}

这个时候在配置类中就可以进行使用

@Configuration
public class XmemcachedConfig {
    @Bean
    public MemcachedClient getmemcacheclient() throws IOException {
        MemcachedClientBuilder memcachedClientBuilder=new XMemcachedClientBuilder(memcachedproperties.getServers());
        memcachedClientBuilder.setconnectionPoolSize(memcachedProperties.getPoolSzie());   //设置最大连接数
        memcachedClientBuilder.setOptimeout(memcachedProperties.getOpTimeout());
        MemcachedClient memcachedClient=memcachedClientBuilder.build();
        return memcachedClient;
    }
}

在服务类中注入使用

@Autowired
private MemcachedClient memcachedClient;
public String sendCodeTosms(String tele){
memcachedclient.set(tele,0,code); //第一个参数是key,第二个参数是过期时间,第三个参数是值,这句话需要try-catch抛出
}

jetcache缓存供应商

jetCache对SpringCache进行了封装,在原有功能基础上实现了多级缓存,缓存统计,自动刷新,异步调用,数据报表等功能
jetCache设定了本地缓存与远程缓存的多级缓存解决方案
本地缓存:(local)

  1. LinkedHashMap
  2. Caffeine
    远程缓存:(remote)
  3. Redis
  4. Tair

jetcache的基本使用

设置外部服务

首先先导入依赖:

        <dependency>
            <groupId>com.alicp.jetcache</groupId>
            <artifactId>jetcache-starter-redis</artifactId>
            <version>2.6.2</version>
        </dependency>

在配置文件中配置jetcache:
jetcache与spring是同一级别的配置

jetcache:
   remote:          #配置远程管理
     default:        #管理模式,相当于之前配置文件中的ehcache配置文件中的name可以有多个
        type: redis
        host: localhost
        port: 6379
        poolConfig:  #对应的配置
          maxTotal: 50    #设置最大连接数,必须写poolConfiig,其中最少也要写maxTotal的配置否则会报错
          keyConvertor: fastjson    #默认在缓存中将java对象数据转换为json字符串,也可以将json字符串转换为java	
          calueEncoder: java
          calueEncoder: java    #规定缓存中值进行转换时,转换成什么类型的数据
     sms:            #第二个管理模式

在开启类中jetcache启用缓存开关

@springbootApplication
@EnableCreateCacheAnnotation
public class SpringbootApplication{
}

自定义缓存空间

//注解第一个属性相当于值前的前缀,expire设置过期时间,3600默认单位秒,可以通过第三个参数设置单位
@CreateCache(name="jetcache",expire=3600,timeUnit=TimeUnit.SECONDS)
//自定义缓存空间,泛型中对应的是key和value的值
private Cache<String,String> jetcache;

存入缓存:

jetcache.put("tele",code);

读取缓存:

jetcache.get();
  • 切换管理模式

在配置中配置第二个管理模式sms如上所讲,那要如何进行切换

@CreateCache(area="sms",name="",expire=)

通过注解进行管理模式的切换,这样命名空间就会用对应的管理模式进行创建空间

设置本地服务

同样在配置文件中进行配置:

jetcache:
  local:
    default:
       type: linkedhashmap
       keyConvertor: fastjson
       limit: #缓存的数据量
       

通过注解实现本地远程进行切换:

@CreateCache(name="",expire=,cacheType=Cache.LOCAL)//有三个值可以进行切换
  • jetcache配置属性信息

配置属性信息

jetcache方法缓存

如果需要启动方法缓存需要在启动类上面加入方法缓存的注解

@springbootApplication
@EnableCreateCacheAnnotation
@EnableMethodCache(basepackages="包名")   //注解中的属性需要添加一个包名,所要添加注解的方法就在这个包下
public class SpringBootCacheApplicaton{
}

在方法上使用注解 @Cached进行缓存处理:

@Cached(name="jetcache_",key="#id",expire=3600)
public Book getbyId(Integer id){
 return bookDao.getByid(id);
}
  • @Cached@CreateCache的区别:
  1. 用途: @CreateCache 用于创建和直接操作缓存实例;@Cached 用于自动处理方法返回值的缓存。
  2. 操作: 使用 @CreateCache 时,开发者需要手动从缓存中获取和存储数据;而 @Cached 则自动化这个过程,使得方法执行与缓存透明化。
  3. 灵活性: @CreateCache 提供更多的控制权和灵活性,因为您可以直接操作缓存;@Cached 更简单易用,适合那些希望自动缓存方法返回结果的场景。

注意前面提到的jecache配置文件中的配置:keyConvertor:fastjson
我们提到它可以将java对象数据转换为json格式的字符串存储在缓存当中,而jetcache缓存底层通过序列化与反序列化的机制进行转换,这时我们首先应该将实体类对象序列化,这样才能够将序列化后的java对象数据进行转换:

@Data
public class Book implements Serializable{
   private Integer id;
   private String name;
}

接着进行操作:如果此时我们进行更新操作,此时缓存中的对应数据需要同步进行更新,那么此时,我们在进行更新操作的时候可以通过注解 @Cacheupdate同步进行更新操作:

@Cacheupdate(name="book_",key="#book.id",value="#book")
public boolean update(Book book){
return bookDao.updayeById(book)>0;
}

同时在进行删除操作的时候也应该通过注解 @CacheInvalidate在缓存中进行同步操作:

@CacheInvalidate(name="book_",key="#id")
public boolean delete(Integer id){
return bookDao.delete(id)>0;
}

通过以上三个操作就会显示出来一个问题,当多个用户同时操作一个数据的时候,可能会出现B用户操作后缓存同步完毕,A用户操作之后缓存没有进行同步看到的还是之前存在的数据这时就会出错:
我们可以通过注解 @CacheRefresh进行定时刷新,刷新缓存数据

@Cached(...)
@CacheRefresh(refresh=10)

jetcache对应的操作信息可以通过配置进行查看:

jetcache:
   statIntervalMinutes: 1 #等待一分钟将一分钟内对缓存的操作进行分析统计并输出在控制台上

j2cache

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

这里我们基于 encache + redis 进行整合讲解j2cache

第一步导入依赖:

<!--在j2cache-spring-boot2-starter中就包含了redis的依赖文件-->
        <dependency>
            <groupId>net.oschina.j2cache</groupId>
            <artifactId>j2cache-spring-boot2-starter</artifactId>
            <version>2.8.0-release</version>
        </dependency>
        <dependency>
            <groupId>net.oschina.j2cache</groupId>
            <artifactId>j2cache-core</artifactId>
            <version>2.8.4-release</version>
        </dependency>
                <dependency>
            <groupId>ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>1.2</version>
        </dependency>

然后在配置文件中进行配置:

server:
  port: 80
j2cache:
  config-location: j2cache.properties

j2cache的配置文件是properties类型,在配置文件当中配置多级缓存

# 一级缓存
j2cache.L1.provider_class =ehcache
ehcache.configXml =ehcache.xml
#设置是否启用二级缓存
j2cache.l2-cache-open=false
# 二级缓存
j2cache.L2.provider_class=net.oschina.j2cache.cache.support.redis.SpringRedisProvider
j2cache.L2.config_section=redis
redis.hosts=localhost:6379 
#一级缓存中的数据如何到达二级缓存
j2cache.broadcast=net.oschina.j2cache.cache.support.redis.SpringRedisPubSubPolicy

二级缓存的供应商应该配置j2cache中redis的SpringRedisProvider类
如何使用j2cache:

//定义一个缓存对象
@Autowired
private CacheChannel cacheChannel;
//在方法中使用该对象进行缓存的处理
cacheChannel.set("sms",tele,code);
String code=cacheChannel.get("sms",smsCode.getTele()).asString();//将我们的值变化为String类型的值 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【U8+】打开固定资产卡片提示:运行时错误‘91’,未设置对象变量或with block变量。

【问题描述】 用友U8软件&#xff0c;固定资产模中打开某张卡片后&#xff0c; 提示&#xff1a;运行时错误‘91’&#xff0c;未设置对象变量或with block变量。 Ps&#xff1a;但不是所有卡片打开的时候都会提示&#xff0c;有的正常。 【解决方法】 跟踪数据库后&#xff…

【高效开发工具系列】obsutil安装与使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

SpringBoot工程快速构建

一、构建流程 1.创建Maven项目 2.导入SpringBoot起步依赖 3.定义Controller 4.编写引导类 5.启动测试 二、使用idea快速构建 1.创建SpringBoot模块 2.勾选依赖 3.定义Controller 4.启动测试

Angular 使用DomSanitizer防范跨站脚本攻击

跨站脚本Cross-site scripting 简称XSS&#xff0c;是代码注入的一种&#xff0c;是一种网站应用程序的安全漏洞攻击。它允许恶意用户将代码注入到网页上&#xff0c;其他用户在使用网页时就会收到影响&#xff0c;这类攻击通常包含了HTML和用户端脚本语言&#xff08;JS&…

【vue】用vite创建vue项目

前置要求 要有Node.js 1. 用vite创建vue项目 在cmd中&#xff0c;进入一个文件夹 在文件资源管理器上面的文件目录中&#xff0c;输入cmd&#xff0c;回车在cmd中通过cd命令进入对应文件夹 创建项目 npm create vitelatest # 创建项目创建项目过程中的一些选项 Ok to pro…

MyBatis源码介绍

文章目录 MyBatis的核心流程介绍SqlSessionFactory的理解MyBatis中的Executor的源码理解Spring中是如何解决MySQL的SqlSession的线程安全问题MyBatis面向Mapper编程工作原理Mybatis动态sql执行原理Mybatis的一级、二级缓存实现原理Mybatis的插件运行原理以及如何编写一个插件my…

【力扣】142. 环形链表 II

142. 环形链表 II 题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&am…

Filebeat+Kafka+ELK 的服务部署

一. kafka 架构深入 1.1 Kafka 工作流程及文件存储机制 Kafka 中消息是以 topic 进行分类的&#xff0c;生产者生产消息&#xff0c;消费者消费消息&#xff0c;都是面向 topic 的。 topic 是逻辑上的概念&#xff0c;而 partition 是物理上的概念&#xff0c;每个 partit…

javaScript设计模式之简单工厂模式

简单工厂模式(Simple Factory):又叫静态工厂方法&#xff0c;由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类对象。 场景一 假设我们需要计算圆形和矩形的面积 function Circle(radius) {this.radius radius;}Circle.prototype.getArea function() {re…

[Win11·Copilot] Win11 系统更新重启后任务栏 Copilot 图标突然消失 | 解决方案

文章目录 前言Copilot介绍产生异常的原因解决方案总结 前言 在 Windows 11 的最新系统更新之后&#xff0c;一些用户报告了任务栏中 Copilot 图标消失的问题。这篇技术博文将为您提供详细的解决方案&#xff0c;帮助您恢复 Copilot 图标&#xff0c;并确保您能够继续享受 Copi…

设计模式——迭代器模式15

迭代器模式提供一种方法访问一个容器对象中各个元素&#xff0c;而又不需暴露该对象的内部细节。 设计模式&#xff0c;一定要敲代码理解 抽象迭代器 /*** 迭代抽象* */ public interface Iterator<A> {A next();boolean hasNext(); }迭代器实现 /*** author ggbond*…

git工具上传文件超过100MB解决方法

Github 上传超过100M的大文件 - 简书 (jianshu.com) 看到一个不错的贴子。 29660DESKTOP-CAB6SQB MINGW64 /d/predict-system $ git init Initialized empty Git repository in D:/predict-system/.git/29660DESKTOP-CAB6SQB MINGW64 /d/predict-system (master) $ git lfs tr…

2024年mathorcup数学建模C题思路分析-物流网络分拣中心货量预测及人员排班

# 1 赛题 C 题 物流网络分拣中心货量预测及人员排班 电商物流网络在订单履约中由多个环节组成&#xff0c;图 ’ 是一个简化的物流 网络示意图。其中&#xff0c;分拣中心作为网络的中间环节&#xff0c;需要将包裹按照不同 流向进行分拣并发往下一个场地&#xff0c;最终使包裹…

BERT论文解读及情感分类实战

文章目录 简介BERT文章主要贡献BERT模型架构技术细节任务1 Masked LM&#xff08;MLM&#xff09;任务2 Next Sentence Prediction (NSP)模型输入 下游任务微调GLUE数据集SQuAD v1.1 和 v2.0NER 情感分类实战IMDB影评情感数据集数据集构建模型构建超参数设置训练结果注意事项 简…

重生奇迹MU圣导师与弓箭手职业对比

职业定位对比 在职业定位上&#xff0c;弓箭手是一个远程物理输出职业&#xff0c;不过弓箭手也有一定的辅助能力&#xff0c;可以为队友提供控场效果&#xff0c;还能为队友提供一个攻击力加成BUFF。同时弓箭手也是一个非常需要操作的职业&#xff0c;想要玩好这个职业&#…

Springboot整合mybatis_plus + redis(使用原生的方式)

首次&#xff0c;创建一个springboot项目&#xff0c;勾选相应的依赖Lombok、Web 添加依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>…

SpringBoot-自定义Starter精华版

SpringBoot自定义Starter精华版 一、自定义 Starter 分析 项目首先加载 starter,starter加载自动配置类&#xff0c;然后再通过配置绑定对象读取配置属性&#xff0c;注册组件。 二、实现步骤 ​ 开发的自定义 Starter 需求是&#xff0c;项目依赖starterTest-spring-boot-s…

C++界面设计之道:利用Qt框架构建优雅高效的应用程序

引言 Qt是一款强大的跨平台C图形用户界面&#xff08;GUI&#xff09;应用程序开发框架&#xff0c;以其丰富的功能、高效的性能、优雅的API以及出色的跨平台能力深受开发者喜爱。本篇文章将以《C界面如何设计Qt程序&#xff1f;》为主题&#xff0c;详细介绍如何利用Qt框架设…

python路径不对安装不了pip文件

因为特殊原因改变了路径&#xff0c;所以原来安装的路径不对无法通过环境变量的改变来完成安装&#xff0c;解决方法&#xff1a; 1.卸载重新安装&#xff0c;在安装界面会出现一个界面&#xff0c;直接打勾&#xff0c;安装结束后路径会配置完成 2在环境变量与用户变量处键入…

小程序 SSL证书的重要性与选择

随着移动互联网的迅猛发展&#xff0c;微信小程序已成为众多企业和开发者连接用户的重要平台。然而&#xff0c;随之而来的是对数据安全和隐私保护的严峻挑战。在这一背景下&#xff0c;小程序SSL证书的作用变得尤为重要&#xff0c;它为小程序提供了一个安全的通信管道&#x…