1. 程式人生 > >SpringBoot整合Redis實現自動快取、更新、刪除

SpringBoot整合Redis實現自動快取、更新、刪除

1:引入springboot redis的maven依賴(建議使用spring-boot-dependencies或者使用spring-io-platform進行構建專案)

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
        </dependency>

2:配置RedisConfig

/**
 * @author liuenyuan
 **/
@Configuration
@EnableCaching
@Slf4j
public class RedisConfig extends CachingConfigurerSupport {

    @Autowired
    private RedisProperties redisProperties;

    /**
     * redis cache name
     **/
    public static final String REDIS_CACHE_NAME = "epc";

    /**
     * {@link org.springframework.cache.annotation.Cacheable}第一個註解代表從快取中查詢指定的key,如果有,從快取中取,不再執行方法.如果沒有則執
     * 行方法,並且將方法的返回值和指定的key關聯起來,放入到快取中.<br/>
     * {@link org.springframework.cache.annotation.CacheEvict}從快取中清除指定的key對應的資料.<br/>
     * {@link org.springframework.cache.annotation.CachePut}在新增或者更新的時候,進行使用;更新時,則會覆蓋原先的資料<br/>
     * {@link com.adc.da.main.util.RedisService}是使用示例
     *
     * @see org.springframework.cache.annotation.CacheEvict
     * @see org.springframework.cache.annotation.Cacheable
     * @see org.springframework.cache.annotation.CachePut
     * @see com.adc.da.main.util.RedisService
     **/
    @Bean
    public CacheManager cacheManager(@Autowired RedisTemplate redisTemplate) {
        RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate);
        //0表示永不過期
        redisCacheManager.setDefaultExpiration(0);
        return redisCacheManager;
    }

    /**
     * key redis serializer: {@link StringRedisSerializer} and
     * key redis serializer: {@link Jackson2JsonRedisSerializer}
     **/
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        Jackson2JsonRedisSerializer valueRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //設定Redis的value為json格式,並存儲物件資訊的序列化型別
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        valueRedisSerializer.setObjectMapper(objectMapper);

        RedisSerializer keyRedisSerializer = new StringRedisSerializer();
        template.setKeySerializer(keyRedisSerializer);
        template.setValueSerializer(valueRedisSerializer);
        template.setHashKeySerializer(keyRedisSerializer);
        template.setHashValueSerializer(valueRedisSerializer);
        template.setConnectionFactory(factory);
        template.afterPropertiesSet();

        log.info("redis server host:{},port:{},database:{}",
                redisProperties.getHost(), redisProperties.getPort(), redisProperties.getDatabase());
        return template;
    }
}

3:配置application.properties的redis相關配置

#redis
# Redis資料庫索引(預設為0)
spring.redis.database=0
# Redis伺服器地址
spring.redis.host=106.2.13.200
# Redis伺服器連線埠
spring.redis.port=6379
# 連線池最大連線數(使用負值表示沒有限制)
spring.redis.pool.max-active=16
# 連線池最大阻塞等待時間(使用負值表示沒有限制:毫秒)
spring.redis.pool.max-wait=5000
# 連線池中的最大空閒連線
spring.redis.pool.max-idle=8
# 連線池中的最小空閒連線
spring.redis.pool.min-idle=0
# 連線超時時間(毫秒)
spring.redis.timeout=3000

4:自動快取的使用

/**
 * redis use for example
 *
 * @author liuenyuan
 **/
@Service
@CacheConfig(cacheNames = RedisConfig.REDIS_CACHE_NAME)
public class RedisService {

    //#p0,代表第一個引數
    //Cacheable如果快取沒有值,從則執行方法並快取資料,如果快取有值,則從快取中獲取值.
    @Cacheable(key = "#p0")
    public BusRefImg findOne(String id) {
        return new BusRefImg(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID());
    }

    //刪除,從快取中刪除相關的key-value值
    // 用來標註在需要清除快取元素的方法或類上
    @CacheEvict(key = "#p0")
    public boolean deleteOne(String id) {
        return true;
    }


    //新增
    //#p0代表第一個引數,其中spring的cache支援Spel表示式
    @CacheEvict(key = "#p0.id")
    public BusRefImg saveOne(BusRefImg busRefImg) {
        return busRefImg;
    }


    //修改
    //執行前不會去檢查快取中是否存在之前執行過的結果,而是每次都會執行該方法,並將執行結果以鍵值對的形式存入指定的快取中。
    @CachePut(key = "#p0.id")
    public BusRefImg updateOne(BusRefImg busRefImg) {
        return busRefImg;
    }
}