spring 配置 cache 缓存使用 Redis(基于注解)

Spring boot默认使用的是SimpleCacheConfiguration,即使用ConcurrentMapCacheManager来实现缓存。

Spring cache是代码级的缓存,一般是使用一个ConcurrentMap,也就是说实际上还是是使用JVM的内存来缓存对象的,这势必会造成大量的内存消耗。但好处是显然的:使用方便。
Redis 作为一个缓存服务器,是内存级的缓存。它是使用单纯的内存来进行缓存。
集群环境下,每台服务器的spring cache是不同步的,这样会出问题的,spring cache只适合单机环境。
Redis是设置单独的缓存服务器,所有集群服务器统一访问redis,不会出现缓存不同步的情况。

CacheManager负责对缓存的增删改查, CacheManager的缓存的介质可配置ConcurrentMap/EhCache/Redis等,这里我用的是redis配置

Redis配置类

@Configuration
public class RedisConfiguration {

    @Bean
    @ConfigurationProperties(prefix = "session.redis")
    protected RedisConfigVo redisConfig() {
        return new RedisConfigVo();
    }

    /**
     * 解决redis.clients.jedis.exceptions.JedisDataException: ERR unknown command ' CONFIG '
     *
     * @return
     */
    @Bean
    public static ConfigureRedisAction configureRedisAction() {
        return ConfigureRedisAction.NO_OP;
    }

    /**
     * 创建连接工厂
     *
     * @return
     */
    @Bean
    public RedisConnectionFactory connectionFactory() {
        RedisConfigVo configVo = redisConfig();
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
        jedisConnectionFactory.setHostName(configVo.getHost());
        jedisConnectionFactory.setPort(configVo.getPort());
        jedisConnectionFactory.setTimeout(configVo.getTimeout());
        if (configVo.getPassword() != null && !"".equals(configVo.getPassword())) {
            jedisConnectionFactory.setPassword(configVo.getPassword());
        }
        jedisConnectionFactory.setDatabase(configVo.getDatabase());
        jedisConnectionFactory.setPoolConfig(poolCofig(configVo));
        jedisConnectionFactory.setUsePool(true);
        // 初始化连接pool
        jedisConnectionFactory.afterPropertiesSet();
        return jedisConnectionFactory;
    }

    /**
     * 创建连接池配置
     *
     * @return
     */
    private static JedisPoolConfig poolCofig(RedisConfigVo configVo) {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(configVo.getMaxIdle() > 0 ? configVo.getMaxIdle() : GenericObjectPoolConfig.DEFAULT_MAX_IDLE);
        jedisPoolConfig.setMinIdle(configVo.getMinIdle() > 0 ? configVo.getMinIdle() : GenericObjectPoolConfig.DEFAULT_MIN_IDLE);
        jedisPoolConfig.setMaxTotal(configVo.getMaxTotal() > 0 ? configVo.getMaxTotal() : GenericObjectPoolConfig.DEFAULT_MAX_TOTAL);
        jedisPoolConfig.setMaxWaitMillis(configVo.getMaxWaitMillis() > 0 ? configVo.getMaxWaitMillis() : GenericObjectPoolConfig.DEFAULT_MAX_WAIT_MILLIS);
        jedisPoolConfig.setTestOnBorrow(configVo.isTestOnBorrow());
        return jedisPoolConfig;
    }

    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {

        RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
        //seconds
        rcm.setDefaultExpiration(5 * 60L);
        return rcm;
    }
}

使用@Cacheable 注解
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值