首页 文章资讯内容详情

SpringBoot 配置Redis详解及使用

2026-06-01 4 花语

本文内容纲要:

-一、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