文章目录
前言
感觉只用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简介