热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot集成GuavaCache实现本地缓存「区别于redis缓存实现」

前言好久没有写文章了,前段时间由于公司项目比较忙,因此耽搁了一些时间。本篇文章也是本头条号转正后发的第一篇文章,在此跟各位看官道歉,同时也感谢各位看官的不离不弃。希望各位看
前言

好久没有写文章了,前段时间由于公司项目比较忙,因此耽搁了一些时间。本篇文章也是本头条号转正后发的第一篇文章,在此跟各位看官道歉,同时也感谢各位看官的不离不弃。希望各位看官可以关注本头条号以便持续获取最新资讯。

SpringBoot和GuavaCache

当各位看官打开这篇文章时,相信对SpringBoot的使用已经足够了解了,我就不做过多的赘述了,这篇文章主要是讲解如何在SpringBoot框架中集成GuavaCache从而实现本地缓存。相信大家都明白,在多线程高并发的情况下缓存(cache)的存在是必须的,但是需要根据不同的应用场景来使用不同的缓存策略。现阶段经常使用的缓存策略有很多,也很成熟。比如分布式缓存:redis、memcached,本地缓存:ehcache、CaffeineCache以及本篇文章将要讲到的GuavaCache。

GuavaCache

Guava Cache是一种本地缓存机制,之所以叫本地缓存,是因为它不会把缓存数据放到外部文件或者其他服务器上,而是存放到了应用内存中。

Guava Cache的优点是:简单、强大、轻量级。

本篇示例还有一个优点是:可以根据不同的业务场景设置不同的缓存过期时间,详细代码配置可在【guava缓存配置】项中找到。

GuavaCache适用场景

1.某些接口或者键值会被查询多次以上;

2.愿意使用或牺牲一些内存空间来提升访问或者计算速度;

3.缓存内容或者结果值较小,不会超过内存总容量;

GuavaCache中基于注解的声明式缓存操作

  • @Cacheable 触发缓存逻辑

    Spring 在执行 @Cacheable 标注的方法前先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,执行该方法并将方法返回值放进缓存。

    参数: value缓存名、 key缓存键值、 condition满足缓存条件、unless否决缓存条件

SpringBoot集成GuavaCache实现本地缓存「区别于redis缓存实现」

@Cacheable使用示例

  • @CacheEvict

    触发缓存逐出逻辑

方法执行成功后会从缓存中移除相应数据。

参数: value缓存名、 key缓存键值、 condition满足缓存条件、 unless否决缓存条件、 allEntries是否移除所有数据 (设置为true时会移除所有缓存)

SpringBoot集成GuavaCache实现本地缓存「区别于redis缓存实现」

@CacheEvict使用示例

SpringBoot集成GuavaCache实现本地缓存「区别于redis缓存实现」

@CacheEvict使用示例

  • @CachePut

  • 不干涉方法执行地更新缓存

    和 @Cacheable 类似,但会把方法的返回值放入缓存中, 主要用于数据新增和修改方法。

SpringBoot集成GuavaCache实现本地缓存「区别于redis缓存实现」

@CachePut使用示例

  • @Caching

  • 重组一个方法上的多重缓存操作

代码实现

一、maven-pom.xml配置文件新增

SpringBoot集成GuavaCache实现本地缓存「区别于redis缓存实现」

pom.xml新增

二、guava缓存配置

  • import java.util.ArrayList;

  • import java.util.concurrent.TimeUnit;

  • import org.springframework.cache.CacheManager;

  • import org.springframework.cache.annotation.EnableCaching;

  • import org.springframework.cache.guava.GuavaCache;

  • import org.springframework.cache.support.SimpleCacheManager;

  • import org.springframework.context.annotation.Bean;

  • import org.springframework.context.annotation.Configuration;

  • import com.google.common.cache.CacheBuilder;

  • /**

  • *

    guava缓存配置

  • * @author Bruce

  • *

  • */

  • @Configuration

  • @EnableCaching

  • public class GuavaConfig {

  • private static final int DEFAULT_MAXSIZE = 1000;

  • private static final int DEFAULT_TTL = 3600;

  • /**

  • * 个性化配置缓存

  • */

  • @Bean

  • public CacheManager cacheManager() {

  • SimpleCacheManager manager = new SimpleCacheManager();

  • //把各个cache注册到cacheManager中,GuavaCache实现了org.springframework.cache.Cache接口

  • ArrayList caches = new ArrayList<>();

  • for (Caches c : Caches.values()) {

  • caches.add(new GuavaCache(c.name(), CacheBuilder.newBuilder().recordStats().expireAfterWrite(c.getTtl(), TimeUnit.SECONDS).maximumSize(c.getMaxSize()).build()));

  • }

  • manager.setCaches(caches);

  • return manager;

  • }

  • /**

  • * 定义cache名称、超时时长秒、最大个数

  • * 每个cache缺省3600秒过期,最大个数1000

  • */

  • public enum Caches {

  • API_PAGESUB(7200),

  • API_MATERIAL(30);

  • private int maxSize = DEFAULT_MAXSIZE; //最大數量

  • private int ttl = DEFAULT_TTL; //过期时间(秒)

  • Caches() {

  • }

  • Caches(int ttl) {

  • this.ttl = ttl;

  • }

  • Caches(int ttl, int maxSize) {

  • this.ttl = ttl;

  • this.maxSize = maxSize;

  • }

  • public int getMaxSize() {

  • return maxSize;

  • }

  • public void setMaxSize(int maxSize) {

  • this.maxSize = maxSize;

  • }

  • public int getTtl() {

  • return ttl;

  • }

  • public void setTtl(int ttl) {

  • this.ttl = ttl;

  • }

  • }

  • }

  • 三、springboot启动器配置

  • package com.zhibo.xmt;

  • import org.springframework.boot.SpringApplication;

  • import org.springframework.boot.autoconfigure.SpringBootApplication;

  • import org.springframework.cache.annotation.EnableCaching;

  • import com.unionpay.acp.sdk.SDKConfig;

  • /**

  • * springboot启动器

  • * @author Bruce

  • *

  • */

  • @SpringBootApplication

  • @EnableCaching

  • public class App {

  • public static void main(String[] args) {

  • System.out.println("xmt api start........");

  • SDKConfig.getConfig().loadPropertiesFromSrc();

  • SpringApplication.run(App.class, args);

  • }

  • }

四、servie层缓存添加

SpringBoot集成GuavaCache实现本地缓存「区别于redis缓存实现」

service层缓存添加-自动过期时间30秒

SpringBoot集成GuavaCache实现本地缓存「区别于redis缓存实现」

service层缓存添加-自动过期时间7200秒


推荐阅读
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
author-avatar
坤哥小妹
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有