SpringBoot 配置Redis详解及使用
本文内容纲要:
-一、SpringBoot配置Reids
-1、pom引入spring-boot-starter-data-redis包
-2、application.yml配置Redis地址、端口及基本信息
-二、增加RedisConfig.java启动加载类
-三、如何使用Redis,三种注解方式@Cacheable、@CachePut、@CacheEvict
环境:SpringBoot2.1.1.RELEASE版本
一、SpringBoot配置Reids
1、pom引入spring-boot-starter-data-redis包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、application.yml配置Redis地址、端口及基本信息
注:如果Redis开启了密码,在timeout前增加password:mima
#Spring配置
spring:
#redis配置
redis:
#地址
host:127.0.0.1
#端口,默认为6379
port:6379
#连接超时时间
timeout:10s
lettuce:
pool:
#连接池中的最小空闲连接
min-idle:0
#连接池中的最大空闲连接
max-idle:8
#连接池的最大数据库连接数
max-active:8
##连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait:-1m
二、增加RedisConfig.java启动加载类
importjava.time.Duration;
importorg.springframework.cache.CacheManager;
importorg.springframework.cache.annotation.CachingConfigurerSupport;
importorg.springframework.cache.annotation.EnableCaching;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.data.redis.cache.RedisCacheConfiguration;
importorg.springframework.data.redis.cache.RedisCacheManager;
importorg.springframework.data.redis.cache.RedisCacheManager.RedisCacheManagerBuilder;
importorg.springframework.data.redis.connection.RedisConnectionFactory;
importorg.springframework.data.redis.core.HashOperations;
importorg.springframework.data.redis.core.ListOperations;
importorg.springframework.data.redis.core.RedisTemplate;
importorg.springframework.data.redis.core.SetOperations;
importorg.springframework.data.redis.core.ValueOperations;
importorg.springframework.data.redis.core.ZSetOperations;
importorg.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
importorg.springframework.data.redis.serializer.RedisSerializationContext;
importorg.springframework.data.redis.serializer.StringRedisSerializer;
importcom.fasterxml.jackson.annotation.JsonAutoDetect;
importcom.fasterxml.jackson.annotation.PropertyAccessor;
importcom.fasterxml.jackson.databind.ObjectMapper;
/***
*redis配置
*@author*/
@Configuration
@EnableCaching
publicclassRedisCongifextendsCachingConfigurerSupport{
/**
*分割符
*/
publicstaticfinalStringDECOLLATOR=":";
/**
*应用前缀
*/
publicstaticfinalStringAPP_PREFIX="redis";
/**
*缓存名前缀
*/
publicstaticfinalStringCACHE_NAMES_PREFIX=APP_PREFIX+DECOLLATOR+"cacheNames"+DECOLLATOR;
/**
*永不过期的缓存名
*/
publicstaticfinalStringCACHE_NAME_FOREVER=CACHE_NAMES_PREFIX+"forever";
/**
*10分钟有效期的缓存名
*/
publicstaticfinalStringCACHE_NAME_MINUTES_10=CACHE_NAMES_PREFIX+"minutes-10";
/**
*30分钟有效期的缓存名
*/
publicstaticfinalStringCACHE_NAME_MINUTES_30=CACHE_NAMES_PREFIX+"minutes-30";
/**
*1个小时有效期的缓存名
*/
publicstaticfinalStringCACHE_NAME_HOURS_01=CACHE_NAMES_PREFIX+"hours-1";
/**
*24小时有效期的缓存名
*/
publicstaticfinalStringCACHE_NAME_HOURS_24=CACHE_NAMES_PREFIX+"hours-24";
/**
*12小时有效期的缓存名
*/
publicstaticfinalStringCACHE_NAME_HOURS_12=CACHE_NAMES_PREFIX+"hours-12";
/**
*30天有效期的缓存名
*/
publicstaticfinalStringCACHE_NAME_DAYS_30=CACHE_NAMES_PREFIX+"days-30";
/**
*选择redis作为默认缓存工具
*SpringBoot2.0以上CacheManager配置方式
*@paramredisTemplate
*@return
**/
@Bean
publicCacheManagercacheManager(RedisTemplate<String,Object>redisTemplate){
RedisCacheConfigurationdefaultCacheConfiguration=RedisCacheConfiguration.defaultCacheConfig()
//设置key为String
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getStringSerializer()))
//设置value为自动转Json的Object
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()))
//不缓存null
.disableCachingNullValues()
//缓存数据保存1小时
.entryTtl(Duration.ofHours(1));
RedisCacheManagerredisCacheManager=RedisCacheManagerBuilder
//Redis连接工厂
.fromConnectionFactory(redisTemplate.getConnectionFactory())
//缓存配置
.cacheDefaults(defaultCacheConfiguration)
//配置同步修改或删除put/evict
.transactionAware()
.build();
//RedisCacheManagerrcm=newRedisCacheManager(redisTemplate);
returnredisCacheManager;
}
/**
*retemplate相关配置
*@paramfactory
*@return
*/
@Bean
publicRedisTemplate<String,Object>redisTemplate(RedisConnectionFactoryfactory){
RedisTemplate<String,Object>template=newRedisTemplate<>();
//配置连接工厂
template.setConnectionFactory(factory);
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
Jackson2JsonRedisSerializerjacksonSeial=newJackson2JsonRedisSerializer(Object.class);
ObjectMapperom=newObjectMapper();
//指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
om.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY);
//指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jacksonSeial.setObjectMapper(om);
//值采用json序列化
template.setValueSerializer(jacksonSeial);
//使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(newStringRedisSerializer());
//设置hashkey和value序列化模式
template.setHashKeySerializer(newStringRedisSerializer());
template.setHashValueSerializer(jacksonSeial);
template.afterPropertiesSet();
returntemplate;
}
/**
*对hash类型的数据操作
*
*@paramredisTemplate
*@return
*/
@Bean
publicHashOperations<String,String,Object>hashOperations(RedisTemplate<String,Object>redisTemplate){
returnredisTemplate.opsForHash();
}
/**
*对redis字符串类型数据操作
*
*@paramredisTemplate
*@return
*/
@Bean
publicValueOperations<String,Object>valueOperations(RedisTemplate<String,Object>redisTemplate){
returnredisTemplate.opsForValue();
}
/**
*对链表类型的数据操作
*
*@paramredisTemplate
*@return
*/
@Bean
publicListOperations<String,Object>listOperations(RedisTemplate<String,Object>redisTemplate){
returnredisTemplate.opsForList();
}
/**
*对无序集合类型的数据操作
*
*@paramredisTemplate
*@return
*/
@Bean
publicSetOperations<String,Object>setOperations(RedisTemplate<String,Object>redisTemplate){
returnredisTemplate.opsForSet();
}
/**
*对有序集合类型的数据操作
*
*@paramredisTemplate
*@return
*/
@Bean
publicZSetOperations<String,Object>zSetOperations(RedisTemplate<String,Object>redisTemplate){
returnredisTemplate.opsForZSet();
}
}
需要注意的是,SpringBoot2.0以上版本(不太确定)RedisTempate<K,V>必须要定义K和V,在SpringBoot1.5x版本以下是不需要的,CacheManager配置如下:
@Bean
publicCacheManagercacheManager(RedisTemplateredisTemplate){
RedisCacheManagerredisCacheManager=newRedisCacheManager(redisTemplate);
//设置默认缓存过期时间(0为不失效)
//redisCacheManager.setDefaultExpiration(0);//秒
//设置缓存的value属性的过期时间(单位秒)
Map<String,Long>expiresMap=newHashMap<String,Long>();
expiresMap.put(CACHE_NAME_FOREVER,0L);//0表示永不失效
expiresMap.put(CACHE_NAME_MINUTES_10,60L*10);
expiresMap.put(CACHE_NAME_MINUTES_30,60L*30);
expiresMap.put(CACHE_NAME_HOURS_01,60L*60);
expiresMap.put(CACHE_NAME_HOURS_24,60L*60*24);
expiresMap.put(CACHE_NAME_HOURS_12,60L*60*12);
expiresMap.put(CACHE_NAME_DAYS_30,60L*60*24*30);
redisCacheManager.setExpires(expiresMap);
returnredisCacheManager;
}
三、如何使用Redis,三种注解方式@Cacheable、@CachePut、@CacheEvict
/**
*redis在serviceImpl里使用方式
*1、Cacheable的用法
*缓存有数据时,从缓存获取;没有数据时,执行方法,并将返回值保存到缓存中
*@Cacheable一般在查询中使用
*1)cacheNames指定缓存区,没有配置使用@CacheConfig指定的缓存区
*2)key指定缓存区的key
*3)注解的值使用SpEL表达式(eq==lt<le<=gt>ge>=)
*1.1、时效性缓存(缓存24小时)
*@Cacheable(value=RedisCongif.CACHE_NAME_HOURS_24)
*1.2、缓存到指定key
*@Cacheable(key="'list'")
*1.3、condition满足条件缓存数据
*@Cacheable(key="#id",condition="#numberge20")//>=20
*1.4、unless满足条件时否决缓存数据
*@Cacheable(key="#id",unless="#numberlt20")//<20
*2、CachePut的用法
*一定会执行方法,并将返回值保存到缓存中
*@CachePut一般在新增和修改中使用
*2.1、缓存到指定key
*@CachePut(key="#user.id")
*2.2、condition满足条件缓存数据
*@CachePut(key="#user.id",condition="#user.agege20")
*3、CacheEvict的用法
*CacheEvict来删除缓存,@CacheEvict就是一个触发器,在每次调用被它注解的方法时,就会触发删除它指定的缓存的动作
*3.1、根据key删除缓存区中的数据
*@CacheEvict(key="#id")
*3.2、根据条件配置
*allEntries=true:删除整个缓存区的所有值,此时指定的key无效
*beforeInvocation=true:默认false,表示调用方法之后删除缓存数据;true时,在调用之前删除缓存数据(如方法出现异常)
*@CacheEvict(key="#id",allEntries=true)
*/
以上是个人配置Redis步骤,使用的是时效缓存方式:@Cacheable(value=RedisCongif.CACHE_NAME_HOURS_24),缓存24小时,24小时之后过期,会重新查询数据库获取最新的数据再次缓存24小时。时效可以根据自己的需求进行配置10分钟、30分钟、1小时、12小时、1天、30天等等。
本文内容总结:一、SpringBoot配置Reids,1、pom引入spring-boot-starter-data-redis包,2、application.yml配置Redis地址、端口及基本信息,二、增加RedisConfig.java启动加载类,三、如何使用Redis,三种注解方式@Cacheable、@CachePut、@CacheEvict,
原文链接:https://www.cnblogs.com/wencg/p/13671769.html