package com.saintdan.framework.config;

import com.saintdan.framework.param.RequestCount;
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.core.annotation.Order;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * Redis for caching config.
 *
 * @author <a href="http://github.com/saintdan">Liao Yifan</a>
 * @date 2018/11/20
 * @since JDK1.8
 */
@Configuration
@EnableCaching
@Order(1)
public class RedisConfig extends CachingConfigurerSupport {

  @Bean(name = "limitRedisTemplate")
  public RedisTemplate<String, RequestCount> limitRedisTemplate(RedisConnectionFactory cf) {
    RedisTemplate<String, RequestCount> redisTemplate = new RedisTemplate<>();
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(RequestCount.class));
    redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer(RequestCount.class));
    redisTemplate.setEnableTransactionSupport(true);
    redisTemplate.setConnectionFactory(cf);
    return redisTemplate;
  }
}