SpringBoot+SpringCache实现两级缓存(Redis+Caffeine)

网友投稿 584 2023-01-24

SpringBoot+SpringCache实现两级缓存(Redis+Caffeine)

SpringBoot+SpringCache实现两级缓存(Redis+Caffeine)

1. 缓存、两级缓存

1.1 内容说明

Spring cache:主要包含spring cache定义的接口方法说明和注解中的属性说明

springboot+spring cache:rediscache实现中的缺陷

caffeine简介

spring boot+spring cache实现两级缓存

使用缓存时的流程

1.2 Sping Cache

spring cache是spring-context包中提供的基于注解方式使用的缓存组件,定义了一些标准接口,通过实现这些接口,就可以通过在方法上增加注解来实现缓存。这样就能够避免缓存代码与业务处理耦合在一起的问题。spring cache的实现是使用spring aop中对方法切面(MethodInterceptor)封装的扩展,当然spring aop也是基于Aspect来实现的。

spring cache核心的接口就两个:Cache和CacheManager

1.2.1 Cache接口

提供缓存的具体操作,比如缓存的放入,读取,清理,spring框架中默认提供的实现有

1.2.2 CacheManager接口

主要提供Cache实现bean的创建,每个应用里可以通过cacheName来对Cache进行隔离,每个CaheName对应一个Cache实现,spring框架中默认提供的实现与Cache的实现都是成对出现的

1.2.3 常用的注解说明

@Cacheable:主要应用到查询数据的方法上

@CacheEvict:清除缓存,主要应用到删除数据的方法上

@CachePut:放入缓存,主要用到对数据有更新的方法上

@Caching:用于在一个方法上配置多种注解

@EnableCaching:启用spring cache缓存,作为总的开关,在spring boot的启动类或配置类上需要加入次注解才会生效

2.实战多级缓存的用法

package com.xfgg.demo.config;

import lombok.AllArgsConstructor;

import com.github.benmanes.caffeine.cache.Caffeine;

import org.springframework.cache.CacheManager;

import org.springframework.cache.caffeine.CaffeineCacheManager;

import org.springframework.conteMoxJFdxt.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import java.util.concurrent.TimeUnit;

@Configuration

@AllArgsConstructor

//把定义的缓存加入到Caffeine中

public class CacheConfig {

@Bean

public CacheManageMoxJFdr cacheManager(){

CaffeineCacheManager cacheManager = new CaffeineCacheManager();

cacheManager.setCaffeine(Caffeine.newBuilder()

//使用refreshAfterWrite必须要设置cacheLoader

//在5分钟内没有创建/覆盖时,会移除该key,下次取的时候从loading中取【重点:失效、移除Key、失效后需要获取新值】

.expireAfterWrite(5, TimeUnit.MINUTES)

//初始容量

.initialCapacity(10)

//用来控制cache的最大缓存数量

.maximumSize(150)

);

return MoxJFdcacheManager;

}

}

package com.xfgg.demo.config;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Bean;

import org.springframework.data.redis.connection.RedisConnectionFactory;

import org.springframework.data.redis.connection.RedisPassword;

import org.springframework.data.redis.connection.RedisStandaloneConfiguration;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.data.redis.serializer.StringRedisSerializer;

//生成的redis连接

public class RedisConfig {

@Value("${spring.redis1.host}")

private String host;

@Value("${spring.redis1.port}")

private Integer port;

@Value("${spring.redis1.password}")

private String password;

@Value("${spring.redis1.database}")

private Integer database;

@Value("${spring.redis1.lettuce.pool.max-active}")

private Integer maxActive;

@Value("${spring.redis1.lettuce.pool.max-idle}")

private Integer maxIdle;

@Value("${spring.redis1.lettuce.pool.max-wait}")

private Long maxWait;

@Value("${spring.redis1.lettuce.pool.min-idle}")

private Integer minIdle;

@Bean

public RedisStandaloneConfiguration redis1RedisConfig() {

RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();

config.setHostName(host);

config.setPassword(RedisPassword.of(password));

config.setPort(port);

config.setDatabase(database);

return config;

}

//配置序列化器

@Bean

public RedisTemplate redisTemplate(RedisConnectionFactory factory){

RedisTemplatetemplate=new RedisTemplate<>();

//关联

template.setConnectionFactory(factory);

//设置key的序列化器

template.setKeySerializer(new StringRedisSerializer());

//设置value的序列化器

template.setValueSerializer(new StringRedisSerializer());

return template;

}

}

一个使用cacheable注解,一个使用redistemplate进行缓存

因为公司项目中用到的是jedis和jediscluster所以这里只是做个了解,没有写的很细

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:手机电脑跨端开发框架对比(手机跨平台开发框架)
下一篇:SpringBoot+SpringSession+Redis实现session共享及唯一登录示例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~