spring boot 2.1.2.RELEASE整合cache和redis

针对spring boot 2.1.2.RELEASE,其中问题尚需改动。
pom.xml

        
            org.springframework.boot
            spring-boot-starter-cache
        
        
            org.springframework.boot
            spring-boot-starter-data-redis
        
        
            org.apache.commons
            commons-pool2
        

application.properties(哨兵模式)

#Matser的ip地址
spring.redis.host=192.168.1.100
#端口号
spring.redis.port=6379
spring.cache.redis.time-to-live=1800
spring.redis.database=1
spring.redis.sentinel.master=mymaster
spring.redis.sentinel.nodes=192.168.1.101:6379
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.max-wait=-1ms
spring.redis.lettuce.pool.min-idle=0
spring.redis.timeout=2000

RedisConfig.java


import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.Cache;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.CacheErrorHandler;
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.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import java.time.Duration;
/*************************************************************
 * cache配置
 * @author Jabwin
 * @since 2019-06-09
 *************************************************************
 */
@Configuration
@EnableCaching
@Slf4j
public class RedisConfig extends CachingConfigurerSupport
{
    @Value("${spring.cache.redis.time-to-live}")
    private Long redisKeyTtl;

    /** 异常处理 */
    @Override
    public CacheErrorHandler errorHandler()
    {
        CacheErrorHandler cacheErrorHandler = new CacheErrorHandler()
        {
            @Override public void handleCacheGetError(RuntimeException exception, Cache cache, Object key)
            {
                RedisErrorException(exception, key);
            }
            @Override public void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value)
            {
                RedisErrorException(exception, key);
            }
            @Override public void handleCacheEvictError(RuntimeException exception, Cache cache, Object key)
            {
                RedisErrorException(exception, key);
            }
            @Override public void handleCacheClearError(RuntimeException exception, Cache cache)
            {
                RedisErrorException(exception, null);
            }
        };
        return cacheErrorHandler;
    }
    protected void RedisErrorException(Exception exception,Object key)
    {
        log.error("redis异常:key=[{}], exception={}", key, exception.getMessage());
    }
    @Bean
    public RedisCacheConfiguration redisCacheConfiguration() {
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        om.disable(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS);
        om.registerModule(new JavaTimeModule());
        jackson2JsonRedisSerializer.setObjectMapper(om);

        RedisSerializationContext.SerializationPair pair = RedisSerializationContext.SerializationPair
                .fromSerializer(jackson2JsonRedisSerializer);

        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(redisKeyTtl))
                .serializeValuesWith(pair);

        return redisCacheConfiguration;
    }
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        //初始化一个RedisCacheWriter
        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
        //初始化RedisCacheManager
        RedisCacheManager cacheManager = new RedisCacheManager(redisCacheWriter, redisCacheConfiguration());
        return cacheManager;
    }
}
 
 

使用:
@Cacheable(cacheNames = "goodsCate", key = "'cateList'")
@CacheEvict(cacheNames = "goodsCate",key = "'cateList'", allEntries = true)
注解需要加在public方法之上,注意这里有个坑,本类中使用此方法的时候,必须通过spring的自动注入,将自己注入,纳入spring管理后,通过注入的变量来调用此方法才会起效。

你可能感兴趣的:(spring boot 2.1.2.RELEASE整合cache和redis)