SpringBoot 配置Redis详解及使用
环境: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启动加载类
import java.time.Duration; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.cache.RedisCacheManager.RedisCacheManagerBuilder; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.ListOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.SetOperations; import org.springframework.data.redis.core.ValueOperations; import org.springframework.data.redis.core.ZSetOperations; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.StringRedisSerializer; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; /*** * redis 配置 * @author*/ @Configuration @EnableCaching public class RedisCongif extends CachingConfigurerSupport { /** * 分割符 */ public static final String DECOLLATOR = ":"; /** * 应用前缀 */ public static final String APP_PREFIX = "redis"; /** * 缓存名前缀 */ public static final String CACHE_NAMES_PREFIX = APP_PREFIX + DECOLLATOR + "cacheNames" + DECOLLATOR; /** * 永不过期的缓存名 */ public static final String CACHE_NAME_FOREVER = CACHE_NAMES_PREFIX + "forever"; /** * 10分钟有效期的缓存名 */ public static final String CACHE_NAME_MINUTES_10 = CACHE_NAMES_PREFIX + "minutes-10"; /** * 30分钟有效期的缓存名 */ public static final String CACHE_NAME_MINUTES_30 = CACHE_NAMES_PREFIX + "minutes-30"; /** * 1个小时有效期的缓存名 */ public static final String CACHE_NAME_HOURS_01 = CACHE_NAMES_PREFIX + "hours-1"; /** * 24小时有效期的缓存名 */ public static final String CACHE_NAME_HOURS_24 = CACHE_NAMES_PREFIX + "hours-24"; /** * 12小时有效期的缓存名 */ public static final String CACHE_NAME_HOURS_12 = CACHE_NAMES_PREFIX + "hours-12"; /** * 30天有效期的缓存名 */ public static final String CACHE_NAME_DAYS_30 = CACHE_NAMES_PREFIX + "days-30"; /** * 选择redis作为默认缓存工具
* SpringBoot2.0以上CacheManager配置方式 * @param redisTemplate * @return * */ @Bean public CacheManager cacheManager(RedisTemplate<String, Object> redisTemplate) { RedisCacheConfiguration defaultCacheConfiguration = 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)); RedisCacheManager redisCacheManager = RedisCacheManagerBuilder // Redis 连接工厂 .fromConnectionFactory(redisTemplate.getConnectionFactory()) // 缓存配置 .cacheDefaults(defaultCacheConfiguration) // 配置同步修改或删除 put/evict .transactionAware() .build(); // RedisCacheManager rcm = new RedisCacheManager(redisTemplate); return redisCacheManager; } /** * retemplate相关配置 * @param factory * @return */ @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); // 配置连接工厂 template.setConnectionFactory(factory); //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式) Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); // 指定要序列化的域,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(new StringRedisSerializer()); // 设置hash key 和value序列化模式 template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(jacksonSeial); template.afterPropertiesSet(); return template; } /** * 对hash类型的数据操作 * * @param redisTemplate * @return */ @Bean public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForHash(); } /** * 对redis字符串类型数据操作 * * @param redisTemplate * @return */ @Bean public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForValue(); } /** * 对链表类型的数据操作 * * @param redisTemplate * @return */ @Bean public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForList(); } /** * 对无序集合类型的数据操作 * * @param redisTemplate * @return */ @Bean public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForSet(); } /** * 对有序集合类型的数据操作 * * @param redisTemplate * @return */ @Bean public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForZSet(); } }
需要注意的是,SpringBoot2.0以上版本(不太确定)RedisTempate<K, V> 必须要定义K和V,在SpringBoot1.5x版本以下是不需要的,CacheManager配置如下:
@Bean public CacheManager cacheManager(RedisTemplate redisTemplate) { RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate); // 设置默认缓存过期时间(0为不失效) // redisCacheManager.setDefaultExpiration(0);//秒 // 设置缓存的value属性的过期时间(单位秒) Map<String, Long> expiresMap = new HashMap<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); return redisCacheManager; }
三、如何使用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 = "#number ge 20") // >= 20 * 1.4、unless 满足条件时否决缓存数据 * @Cacheable(key = "#id", unless = "#number lt 20") // < 20 * 2、CachePut 的用法 * 一定会执行方法,并将返回值保存到缓存中 * @CachePut 一般在新增和修改中使用 * 2.1、缓存到指定key * @CachePut(key = "#user.id") * 2.2、condition 满足条件缓存数据 * @CachePut(key = "#user.id", condition = "#user.age ge 20") * 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天等等。
【来一场说走就走的旅行,不如学一种说学就学的语言】
作者:小温
出处:https://www.cnblogs.com/wencg/
版权:本文采用「CC BY 4.0」知识共享许可协议进行许可。