springBoot集成guava cache缓存

8 篇文章 0 订阅
4 篇文章 1 订阅

前言

感觉只用redis缓存已经达到一定瓶颈,便想着引入本地缓存试试,众多选择下最终定了guava缓存。以下简要谈谈项目中使用的guava缓存


一、guava cache实现本地缓存

1、引入依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.6.3</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
        </dependency>

        <!--工具类 -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.0.M3</version>
        </dependency>

        <!--guava本地缓存依赖包-->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>30.1.1-jre</version>
        </dependency>

        <!--数据库        -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.21</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>

        <!-- JdbcTemplate  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
            <version>2.6.3</version>
        </dependency>
    </dependencies>

2、定义GuavaLocalCache类

package com.youyue.data.utils;

import cn.hutool.extra.spring.SpringUtil;
import com.google.common.cache.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Slf4j
public class GuavaLocalCache {


    public static LoadingCache<String, List<String>> weiboCache = CacheBuilder.newBuilder()
            //设置缓存初始大小,应该合理设置,后续会扩容
            .initialCapacity(10)
            //最大值
            .maximumSize(100)
            //并发数设置
            .concurrencyLevel(5)
            //缓存过期时间,写入后10分钟过期
            .expireAfterWrite(600,TimeUnit.SECONDS)
            // 此缓存对象经过多少秒没有被访问则过期。
            .expireAfterAccess(10,TimeUnit.SECONDS)
            //统计缓存命中率
            .recordStats()
            .build(new WeiboCacheLoader());

    public static class WeiboCacheLoader extends CacheLoader<String, List<String>> {
        @Override
        public List<String> load(String key) {
            log.info("加载weibo screeName开始");
            String sql = "select column_url from gtcom_media where type_code = 'weibo' limit 10";
            JdbcTemplate jdbcTemplate = SpringUtil.getApplicationContext().getBean("appJdbcTemplate",JdbcTemplate.class);
            List<String> list = jdbcTemplate.queryForList(sql, String.class);
            log.info("select column_url from gtcom_media where type_code = 'weibo' ");
            log.info("list:{} ",list.size());
            log.info("加载数据结束");
            return list;
        }
    }
}

3、引入配置类

package com.youyue.data.config.datasource;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;

@Configuration
public class AppsqlDataSource {
    @Value("${mysql.app.url}")
    private String url;
    @Value("${mysql.app.userName}")
    private String userName;
    @Value("${mysql.app.password}")
    private String password;
    @Value("${mysql.app.driverClassName}")
    private String driverClassName;

    @Bean(name = "appdataSource")
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(url);
        dataSource.setUsername(userName);
        dataSource.setPassword(password);
        dataSource.setDriverClassName(driverClassName);
        return dataSource;
    }

    @Bean(name = "appJdbcTemplate")
    public JdbcTemplate myJdbcTemplate(
            @Qualifier("appdataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

4、配置application.properties数据库信息

mysql.app.url=jdbc:mysql://182.192.203.160:3306/user-center?characterEncoding=utf8&serverTimezone=Asia/Shanghai
mysql.app.userName=root
mysql.app.password=123456
mysql.app.driverClassName=com.mysql.jdbc.Driver

5、DataApplication启动类测试

package com.youyue.data;

import com.youyue.data.utils.GuavaLocalCache;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Import;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import java.util.concurrent.TimeUnit;

@SpringBootApplication
@Slf4j
@EnableScheduling
@EnableAsync
@Import(cn.hutool.extra.spring.SpringUtil.class)
public class DataApplication{

    public static void main(String[] args) throws Exception{
        SpringApplication.run(DataApplication.class, args);
        System.out.println(GuavaLocalCache.weiboCache.get("weiboCache"));
        TimeUnit.SECONDS.sleep(1);
        System.out.println("=====================================");
        System.out.println(GuavaLocalCache.weiboCache.get("weiboCache"));
    }
}

以下截图可以看出 控制台第一次访问打印日志 “加载数据结束”,第二次访问没有打印出访问数据库相关日志。说明返回的数据是本地缓存内的。
在这里插入图片描述

二、Guava简介(详细)


总结

如果此篇文章有帮助到您, 希望打大佬们能关注点赞收藏评论支持一波,非常感谢大家!
如果有不对的地方请指正!!!
源码
Guava简介

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lfwh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值