目录

  • 1 EhCache3
    • 1 执行环境设置
    • 2 Ehcache3 应用
    • 3 Ehcache3 xml设置
  • 2 Caffeine
  • 3 Infinispan
    • 1 SpringBoot嵌入式缓存
    • 2 Java元素嵌入式缓存

Spring Boot项目中支持以下几个主要缓存。本文介绍EhCache 3, Caffeine, Infinispan这三个很有代表性的缓存插件使用。

  • JCache (JSR-107) (EhCache 3, Hazelcast, Infinispan)
  • EhCache 2.x
  • Hazelcast
  • Infinispan
  • Couchbase
  • Redis
  • Caffeine
  • Simple cache

Spring框架为不同的缓存提供了缓存抽象API注解 。这些缓存注解使用起来很方便而且功能强大。介绍几个SpringBoot中会使用到的缓存注解。
@EnableCaching:Spring 容器提供了一个默认 hashmap 作为默认缓存,我们通过它将外部第三方缓存引用与CacheManager注册缓和spring内容缓存。
@Cacheable:触发缓存填充。
@CachePut :在不干扰方法执行的情况下更新缓存。
@CacheEvict:清空缓存

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

1 EhCache3

EhCache3 是在spring boot中使用率很高的一个缓存,最常用的方法是将它作为数据库二级缓存和一些系统公共数据储存器来使用。

1 执行环境设置

1 pom引入

spring-boot-starter-cache将 EhCache 系列缓存添加到spring boot项目中来。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId><version>2.2.3.RELEASE</version>
</dependency>
<dependency><groupId>javax.cache</groupId><artifactId>cache-api</artifactId><version>1.1.0</version>
</dependency>
<dependency><groupId>org.ehcache</groupId><artifactId>ehcache</artifactId><version>3.6.2</version>
</dependency>

2 设置ehcache.xml

在springboot项目 src/main/resources/ 下创建 ehcache.xml。

EhCache 缓存功能设置有二种方法,第一种是在配置文件(xml)中设置,第二种是在启动类中设置。重这些年的开发效果来看,第一种xml文件设置的方法比较好,用起来维护简单,语义简洁易懂,操作起来方便。

ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<configxmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xmlns='http://www.ehcache.org/v3'xmlns:jsr107='http://www.ehcache.org/v3/jsr107'><service><jsr107:defaults enable-statistics="true"/></service><cache alias="zhtUserCache"><key-type>java.lang.Long</key-type><value-type>cn.core.sys.pojo.UserPojo</value-type><expiry><ttl unit="seconds">10000</ttl></expiry><resources><heap unit="entries">2000</heap><offheap unit="MB">100</offheap></resources></cache>
</config>

3 application.properties

ehcache缓存设置添加到 application.properties ,spring 容器可以找ehcache缓存配置。

spring:cache:jcache:config: classpath:ehcache.xml

2 Ehcache3 应用

1 @EnableCaching 缓存注入spring

创建一个CacheConfig类,注解上@Configuration和@EnableCaching注解,spring项目中引入缓存注解功能。这样设置后整个spring boot项目可以使用spring自带的缓存注解方来查询,增加,删除缓存数据。

@Configuration
@EnableCaching
public class CacheConfig {}

2 缓存注解使用
缓存@Cacheable@CachePut在数据保存与查询中的使用,例子中模仿数据库的查询与保存功能。

import cn.core.sys.pojo.UserPojo;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import java.util.HashMap;
@Service
public class ZhtUserManager{//模仿数据库中的表HashMap<Long, UserPojo> db = new HashMap<>();@Cacheable(cacheNames="zhtUserCache", key="#id")public UserPojo getUserById(Long id) {System.out.println("---获得数据库中数据,如果没有执行到这里说明在缓存中获可数据---");return db.get(id);}@CachePut(cacheNames="zhtUserCache",key="#id")public UserPojo setUser(Long id,UserPojo user) {System.out.println("----------保存数据到缓存 zhtUserCache 中------------");//保存数据到数据库中db.put(id,user);return db.get(id)==null?user:db.get(id);}
}

缓存数据pojo类

public class UserPojo implements Serializable {public UserPojo(String userid,String name, String deptid, String sex) {super();this.userid = userid;this.name = name;this.deptid = deptid;this.sex = sex;}public String userid;public String name;public String deptid;public String sex;public String getDeptid() {return deptid;}public void setDeptid(String deptid) {this.deptid = deptid;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getUserid() {return userid;}public void setUserid(String userid) {this.userid = userid;}@Overridepublic String toString() {return " UserPojo [userid=" + userid + ", name=" + name + ", deptid=" + deptid + ",sex ="+sex+"]";}
}

3 缓存调用

  • ZhtUserManager 是注入到spring容器中的缓存。
  • CacheManager 是EhCache原生缓存在spring容器的引用对象。CacheManager 可以不使用spring 缓存注解直接操作缓存。
@RestController()
public class ZhtbsController {@Autowiredprivate ZhtUserManager zhtUserManager;//spring注解引用@Autowiredprivate CacheManager cacheManager;//原生缓存引用@GetMapping((value = "/")public String index(){System.out.println("保存="+zhtUserManager.setUser(3L,new UserPojo("223s", "zhtbs", "3344","男")));System.out.println("查询="+zhtUserManager.getUserById(3L));Cache cache = cacheManager.getCache("zhtUserCache");System.out.println("原生查询="+cache.get(3L).get());//保存数据cache.put(1L,new UserPojo("11", "王","1","女"));System.out.println("查询="+zhtUserManager.getUserById(1L));return "main";}
}

后台打印

[http-nio-8080-exec-1] DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped to cn.core.sys.ZhtbsController#index()
----------保存缓存中 zhtUserCache 中数据信息------------
保存= UserPojo [userid=223s, name=zhtbs, deptid=3344,sex =男]
查询= UserPojo [userid=223s, name=zhtbs, deptid=3344,sex =男]
原生查询= UserPojo [userid=223s, name=zhtbs, deptid=3344,sex =男]
查询= UserPojo [userid=11, name=王, deptid=1,sex =女]

4 监听设置

如果在项目中对缓存有其他设置要求,可以定义缓存监听。通过这个监听来对缓存数据进行二次修改。

public class CustomCacheEventLogger implements CacheEventListener<Object, Object> {@Overridepublic void onEvent(CacheEvent cacheEvent) {System.out.println("-------缓存方法监听---");System.out.println(String.format("Cache event = {%s}, Key = {%s},  Old value = {%s}, New value = {%s}",cacheEvent.getType(),cacheEvent.getKey(), cacheEvent.getOldValue(), cacheEvent.getNewValue()));}
}

ehcache.xml中设置监听

<cache alias="zhtUserCache"><key-type>java.lang.Long</key-type><---------- 缓存数据值类型  ---------><value-type>cn.core.sys.pojo.UserPojo</value-type><expiry><ttl unit="seconds">10000</ttl></expiry><listeners><listener><---------- 引入监听类  ---------><class>cn.core.sys.uilt.CustomCacheEventLogger</class><event-firing-mode>ASYNCHRONOUS</event-firing-mode><event-ordering-mode>UNORDERED</event-ordering-mode><events-to-fire-on>CREATED</events-to-fire-on><events-to-fire-on>UPDATED</events-to-fire-on><events-to-fire-on>EXPIRED</events-to-fire-on><events-to-fire-on>REMOVED</events-to-fire-on><events-to-fire-on>EVICTED</events-to-fire-on></listener></listeners><resources><heap unit="entries">2000</heap><offheap unit="MB">100</offheap></resources>
</cache>

打印

-------缓存方法监听---
Cache event = {CREATED}, Key = {3},  Old value = {null}, New value = { UserPojo [userid=223s, name=zhtbs, deptid=3344,sex =男]}
-------缓存方法监听---
Cache event = {CREATED}, Key = {1},  Old value = {null}, New value = { UserPojo [userid=11, name=王, deptid=1,sex =女]}

3 Ehcache3 xml设置

1 根元素

根元素

CacheManager所管理服务的扩展元素

<?xml version="1.0" encoding="UTF-8"?>
<configxmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xmlns='http://www.ehcache.org/v3'xmlns:jsr107='http://www.ehcache.org/v3/jsr107'><service><jsr107:defaults enable-statistics="true"/></service>
</config>

2 cache

cache实例用于定义缓存策略信息,每个cache元素必须定义alias属性。这个实例将会被CacheManager容器,通过CacheManager.getCache方法获得到它的引用。通过引用来操作缓存内容。也可以在uses-template属性中通过它建立对应关系。

设置alias缓存引用名称

//定义缓存引用名称
<cache alias="zhtUserCache">缓存设置
</cache>
//缓存容器
@Autowired
CacheManager cacheManager;
//获得这个缓存引用
Cache cache = cacheManager.getCache("zhtUserCache");
//缓存注解方法定义 cacheNames="zhtUserCache"获得缓存引用
@Cacheable(cacheNames="zhtUserCache", key="#id")
public UserPojo getUserById(Long id) {业务逻辑
}

cache元素中的内设属性

  • : Cache<K,V>中K的全限定类名,默认是java.lang.Object
  • : Cache<K,V>中V的全限定类名,默认是java.lang.Object
  • : 控制expiry的类型和他的参数
  • : 实现org.ehcache.config.EvictionAdvisor<K,V>类的全限定名,默认是null
  • : 用于配置cache-through模式的CacheLoaderWriter
  • : 配置层的信息和层的容量,当只是用heap层时,你可以使用元素代替它
<cache alias="zhtUserCache"><key-type>java.lang.Long</key-type><value-type>cn.core.sys.pojo.UserPojo</value-type><expiry>//缓存生存时间<ttl unit="seconds">10000</ttl></expiry><resources><heap unit="entries">2000</heap><offheap unit="MB">100</offheap></resources>
</cache>
缓存中 key-type键值  value-type值类型key-type      value-type|              |
cache.put(1L,new UserPojo("11", "王","1","女"));

expiry TTL(生存时间)和 TTI(空闲时间),注意TTL与TTI在expiry 中定义只会出现一个,两个不可以同时出现。

<expiry>//tti 与 ttl 选择出现一个,两个属性不能同时定义<tti unit="seconds">10</tti><ttl unit="minutes">2</ttl>
</expiry>

resources元素

<resources>//缓存 2000 条数据容量<heap unit="entries">2000</heap>//堆外存储大小<offheap unit="MB">100</offheap>
</resources>

cache-template 元素

cache-template定义通用缓存模板,多个cache可以引用一个cache-template缓存设置。

<config>
<!-- 定义一个通用缓存设置  -->
<cache-template name="zhtDefaults"> <key-type>java.lang.Long</key-type> <value-type>java.lang.String</value-type> <heap unit= "entries">200</heap>
</cache-template>
<!-- 引用模板zhtDefaults -->
<cache alias="zht1" uses-template="zhtDefaults"><key-type>java.lang.Number</key-type>
</cache>
<!--引用模板zhtDefaults -->
<cache alias="zht2" uses-template="zhtDefaults" />
</config>

Java 执行

URL myUrl = getClass().getResource("/my-config.xml");
Configuration xmlConfig = new XmlConfiguration(myUrl);
CacheManager cacheManager = CacheManagerBuilder.newCacheManager(xmlConfig);
Cache cache1 = cacheManager.getCache("zht1");
cache1.get(1).get();
Cache cache2 = cacheManager.getCache("zht2");
cache2.get(1L).get();

2 Caffeine

Springboot项目中缓存引入成本最低的是Caffeine,使用起来最简单的一个缓存。

pom引入

<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.0.5</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId><version>2.2.3.RELEASE</version>
</dependency>

application.properties

ehcache缓存设置添加到 application.properties ,spring 容器可以找ehcache缓存配置。

spring:cache:cache-names: zhtCachecaffeine:spec: maximumSize=100, expireAfterWrite=60s

缓存配置类

@Configuration
@EnableCaching
public class CacheConfig {}

缓存操作类

import cn.core.sys.pojo.UserPojo;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import java.util.HashMap;
@Service
public class ZhtUserManager
{HashMap<Long, UserPojo> db = new HashMap<>();@Cacheable(cacheNames="zhtCache", key="#id")public UserPojo getUserById(Long id) {System.out.println("----------获得缓存中 zhtUserCache 中数据信息------------");return db.get(id);}@CachePut(cacheNames="zhtCache",key="#id")public UserPojo setUser(Long id,UserPojo user) {System.out.println("----------保存缓存中 zhtUserCache 中数据信息------------");return db.get(id)==null?user:db.get(id);}
}

spring容器使用缓存

操作和EhCache3 缓存操作一样,使用spring注解与org.springframework.cache.CacheManage和org.springframework.cache.Cache操作缓存的公共api。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ZhtbsController {@Autowiredprivate ZhtUserManager zhtUserManager;@Autowiredprivate CacheManager cacheManager;@RequestMapping(value = "/")public String index(){System.out.println("保存="+zhtUserManager.setUser(3L,new UserPojo("223s", "zhtbs", "3344","男")));System.out.println("查询="+zhtUserManager.getUserById(3L));Cache cache = cacheManager.getCache("zhtCache");System.out.println("原生查询="+cache.get(3L).get());cache.put(1L,new UserPojo("11", "王","1","女"));System.out.println("查询="+zhtUserManager.getUserById(1L));return "main";}
}
----------保存缓存中 zhtUserCache 中数据信息------------
保存= UserPojo [userid=223s, name=zhtbs, deptid=3344,sex =]
查询= UserPojo [userid=223s, name=zhtbs, deptid=3344,sex =]
原生查询= UserPojo [userid=223s, name=zhtbs, deptid=3344,sex =]
查询= UserPojo [userid=11, name=, deptid=1,sex =]

3 Infinispan

Infinispan 分为嵌入式缓存与远程缓存两种模式,这里主要介绍一下嵌入式缓存模式。Infinispan 也可以看成是内存数据库它可以将缓存信息保存到本地磁盘中,以键值数据库的形式使用。Infinispan官网 API https://infinispan.org/ , Infinispan。

1 SpringBoot嵌入式缓存

pom引入

<dependency><groupId>org.infinispan</groupId><artifactId>infinispan-core</artifactId><version>13.0.0.Final</version>
</dependency>
<dependency><groupId>javax.cache</groupId><artifactId>cache-api</artifactId><version>1.1.0</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.2.3.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId><version>2.2.3.RELEASE</version>
</dependency>
<dependency><groupId>org.infinispan</groupId><artifactId>infinispan-spring-boot-starter-embedded</artifactId<version>13.0.0.Final</version>
</dependency>

application.yml

infinispan:embedded:enabled: trueconfigXml: zht.xml
  • embedded 内嵌模式

infinispan.xml

在springboot项目 src/main/resources/ 下创建 infinispan.xml。

<infinispan><cache-container statistics="true"><local-cache name="zht-cache" statistics="true"><persistence passivation="false"><file-store shared="false" fetch-state="true"purge="true"><index path="./tempcache/index" /><data path="./tempcache/data" /></file-store></persistence></local-cache></cache-container>
</infinispan>

缓存配置类

@Configuration
@EnableCaching
public class CacheConfig {}

缓存操作类

import org.infinispan.Cache;
import org.infinispan.manager.EmbeddedCacheManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
@RestController
public class ZhtbsController {@AutowiredEmbeddedCacheManager cacheManager;@RequestMapping(value = "/")public String index() throws IOException {Cache cache=cacheManager.getCache("zht-cache");cache.put("mesg","欢迎来个我的代码世界");System.out.println(cache.get("mesg"));return "main";}
}

项目使用infinispan-spring-boot-starter-embeddedsrpingboot启用嵌入式模式。

在spring容器中 @Autowired 注解 EmbeddedCacheManager cacheManager;来操作缓存。

内存数据文件

infinispan 内存数据都保存以下文件目录中,文件目录生成说明文件保持成功。

Project
└─src
└─tempcache  └─data └─zht-cache └─数据文件└─index └─zht-cache└─数据文件

2 Java元素嵌入式缓存

Infinispan中 SpringBoot嵌入式保存的内存数据必须要在SpringBoot中才能通用,如果是普通模式下保存的内存数据无法使用。普通模式在调试与兼容性上更好一些,也可以在springboot项目中使用。

infinispan.xml

<?xml version="1.0" encoding="UTF-8"?>
<infinispan><cache-container><local-cache name="zhtbs-cache"><persistence passivation="false"><file-storeshared="false" preload="true"fetch-state="false"read-only="false"purge="false"><index path="./tempcache/index" /><data path="./tempcache/data" />                    </file-store></persistence></local-cache></cache-container>
</infinispan>

执行方法

public static void main(String[] args) throws IOException {EmbeddedCacheManager m = new DefaultCacheManager("infinispan.xml");Cache c = m.getCache("zhtbs-cache");c.start();c.put("z1","测试字符");System.out.println(c.get("z1"));c.stop();
}

Java 类保存

Infinispan 不允许对任意 Java 类进行反序列化保存。如果要保存java类需要在配置文件中定义那些类可以被Infinispan 加载保存。

<serialization marshaller="org.infinispan.commons.marshall.JavaSerializationMarshaller"<allow-list>
<class>java.util.Map</class>
<regex>cn.core.sys.*</regex>
</allow-list>
</serialization>

Java 类必须实现序列化 JavaSerializable接口的对象。

  • class 要保存的序列化类
  • regex 保存类包规则

Infinispan.xml

<infinispan><cache-container><serialization marshaller="org.infinispan.commons.marshall.JavaSerializationMarshaller"><allow-list><class>java.util.Map</class><regex>cn.core.sys.*</regex></allow-list></serialization><local-cache name="zhtbs-cache"><persistence passivation="false"><file-storeshared="false" preload="true"fetch-state="false"read-only="false"purge="false"><index path="./tempcache/index" /><data path="./tempcache/data" /></file-store></persistence></local-cache></cache-container>
</infinispan>

使用例子

  public static void main(String[] args) throws IOException {EmbeddedCacheManager m = new DefaultCacheManager("infinispan.xml");Cache c = m.getCache("zhtbs-cache");c.start();Map map2=new HashMap<>();map2.put("id",123);map2.put("name","名称");map2.put("dpet","部门");c.put("z2",map2);System.out.println(c.get("z2"));}

系列文章目录

【Springboot 入门培训 】#1 MyBatis项目运行环境配置
【Springboot 入门培训 】#2 MyBatis 增改删除与查询 in like foreach操作
【Springboot 入门培训 】#3 MyBatis 多数据源与缓存和数据连接池设置
【Springboot 入门培训 】#4 WEB+JSP MVC项目搭建
【Springboot 入门培训 】#5 WEB+Thymeleaf MVC项目搭建与测试
【Springboot 入门培训 】#6 (Framework7 移动 webapp) WEB APP 项目搭建
【Springboot 入门培训 】#7 (Framework7 移动webapp) 页面路由跳转
【Springboot 入门培训 】#8 (Framework7 移动webapp) Component 模板MVVM与AJAX
【Springboot 入门培训 】# 9 Security(一) 登录验证初始化
【Springboot 入门培训 】#10 Security(二) 数据库DB 登录验证
【Springboot 入门培训 】#11 Security(三) json 前后端分离跨域登录
【Springboot 入门培训 】#12 Security(四) Jwt 前后端分离跨域登录
【Springboot 入门培训 】#13 Security(五) oauth2 基础应用
【Springboot 入门培训 】#14 WebJars 样式包BootStrap 5架构
【Springboot 入门培训 】#15 MyBatis-Thymeleaf 插件在项目中的应用
【Springboot 入门培训 】#16 Spring boot 日志 Slf4j + Logback
【Springboot 入门培训 】#17 WebJars + BootStrap5 常用JS组件应用
【Springboot 入门培训 】#18 SpringBoot Cache 缓存实现
Spring boot 中Thymeleaf 模板 html 标签使用

【Springboot 入门培训 】#18 SpringBoot Cache 缓存实现相关推荐

  1. 【Springboot 入门培训】# 17 WebJars + BootStrap5 常用JS组件应用

    在传统的前后一体项目开发中,大部分人会使用到BootStrap加其它JS组件的配合方式来完成页面UI功能的实现.下面介绍几种常用的JS库的使用方法.代码例子下载 目录 1 树形组件 1.1 TreeJ ...

  2. 【Springboot 入门培训】#7 (Framework7 移动webapp) 页面路由跳转

    ​ 学习使用routes 路由来进行页面访问,如何定义路由类routes属性与方法引用.掌握routes 路由类的使用就掌握了Framework7 页面之间的访问控制,才能真正的发挥Framework ...

  3. SpringBoot入门到精通-SpringBoot启动流程(七)

    定义自己的starter SpringBoot入门到精通-Spring的注解编程(一) SpringBoot入门到精通-SpringBoot入门(二) SpringBoot入门到精通-Spring的基 ...

  4. 【Springboot 入门培训】#3 MyBatis 多数据源与缓存和数据连接池设置

    介绍MyBatis项目中如何配置多个数据源连接数据库,以及设置sql文的二级缓存功能,配置多数据源与数据连接池等功能.为大家开发和平时练习的时候提供参考和查询的工具文章. 代码下载百度网盘下载:htt ...

  5. 【Springboot 入门培训】#14 WebJars 样式包BootStrap 5架构

    通过Mave加载前端常用的bootstrap,jquery框架js包,这些js都封装在java中的jar包中,我们通过引入jar包的方式将前端样式导入到工程中,这样就不用在Spring boot工程中 ...

  6. SpringBoot——什么是SpringBoot、SpringBoot入门、创建SpringBoot

    目录 一.回顾什么是Spring 二.Spring是如何简化Java开发 三.什么是SpringBoot 1.SpringBoot的主要优点 2.准备工作 四.如何通过IDEA创建SpringBoot ...

  7. springBoot入门第一章springBoot第一个程序

    前置条件 1.jdk安装完成 2.maven配置成功 3.myeclipse的maven插件配置成功 作者本人环境配置 1.mac Sierra 10.12.4 2.myeclipse2015 3.j ...

  8. SpringBoot 入门04

    SpringBoot笔记 一.SpringBoot入门 1.SpringBoot简介 简化spring应用的框架 整个Spring技术栈的大整合 j2ee开发的一站式解决方案 2.微服务 2014 马 ...

  9. SpringBoot集成Cache缓存(Ehcache缓存框架,注解方式)

    1.说明 Spring定义了CacheManager和Cache接口, 用来统一不同的缓存技术, 例如JCache,EhCache,Hazelcast,Guava,Redis等. 本文通过Spring ...

最新文章

  1. Brilliant Programmers Show
  2. Linux 内存映射函数 mmap()函数笔记
  3. vue配置二级目录vue-axios跨域办法谷歌浏览器设置跨域
  4. ERDAS软件应用(三)遥感图像的拼接
  5. MySQL索引对NULL值的处理
  6. 不使用java内置函数,将String字符串转换为int类型
  7. SDWebImage 4 0 迁移指南
  8. 连续交付友好的Maven版本
  9. 从生产故障解锁RocketMQ集群部署的最佳实践
  10. 作业调度进程c语言代码,进程调度 时间片轮转调度算法源代码(C语言)
  11. JS ||(或运算)详解
  12. kis显示用户登录服务器失败,金蝶KIS专业版提示用户KISAdmin登陆失败。原因:未与信任SQL Server连接相关联...
  13. spring boot文件的上传与下载
  14. np.roll()的理解和用法
  15. charles请求转发_使用Charles代理进行请求转发
  16. Elasticsearch.service failed after enable elasticsearch security features
  17. R 语言 optim 使用
  18. 【租房合同】2017北京市房屋租赁合同(自行成交版).doc
  19. 苹果iPhone14频繁自动重启是什么原因?如何修复这个问题?
  20. Python课堂笔记之判断一个数组中是否含有数字0

热门文章

  1. 计算圆台高度的c语言程序,知道圆台的上面一个圆直径为2米下面圆的直径为3.6 米高为1.6米怎么算圆台的体积...
  2. 406、电梯监控无线桥解决方案及注意事项
  3. 0型系统, I型系统, II型系统对PID的影响
  4. 女友生日,她最喜欢猫。这款猫咪日历最适合做她的生日礼物。
  5. python自动排班表
  6. Material组件库中table组件的sticky属性
  7. 关于自信的故事(卖石头的小故事)
  8. 广西高中有没有计算机课程,【广西高中课改网】_广西高中课改网
  9. UI设计干货可临摹素材|打造精美的UI界面!
  10. 金融知识国民读本(三)