redis自定义RedisCacheManager


1.redis自定义配置

package com.meritdata.cloud.shellmiddleplatform.dataservice.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.meritdata.shellmodel.ShellMerchant;
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.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;

/**
 * 2020/8/13 4:41 PM
 *
 * @author shoo
 * @describe
 */
@Configuration
@EnableCaching
public class MyRedisCacheConfiguration {
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jacksonSeial.setObjectMapper(om);

        //设置默认缓存序列器为json序列化器
        redisTemplate.setDefaultSerializer(jacksonSeial);
        return redisTemplate;
    }

    //springboot 2.x 创建方式
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jacksonSeial.setObjectMapper(om);

        //配置缓存管理器为json序列化器
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jacksonSeial));
        //使用自定义的配置构建缓存管理器
        RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build();
        return cacheManager;
    }
}

2.用法

 2.1 类上添加注解 @CacheConfig(cacheNames = "shellMerchant")

 2.2 查询方法上添加注解 @Cacheable(key = "#clientId")

 2.3 更新方法上添加注解 @CachePut(key = "#shellMerchant.clientId")

package com.meritdata.cloud.shellmiddleplatform.dataservice.fourInOne.service.impl;/**
 * 2020/7/2 11:29 AM
 *
 * @author shoo
 * @describe 商户
 *
 */
@Service
@CacheConfig(cacheNames = "shellMerchant")
public class ShellMerchantService implements IShellMerchantService {

    @Autowired
    private ShellMerchantRepository shellMerchantRepository;

    @Override
    @CachePut(key = "#shellMerchant.clientId")
    public ShellMerchant add(ShellMerchant shellMerchant) {return shellMerchantRepository.save(shellMerchant);
    }

    @Override
    @Cacheable(key = "#clientId")
    public ShellMerchant sel(String clientId) {
        return shellMerchantRepository.findByClientId(clientId);
    }

    @Override
    @CachePut(key = "#shellMerchant.clientId")
    public ShellMerchant update(ShellMerchant shellMerchant) {
        ShellMerchant merchant = shellMerchantRepository.getById(shellMerchant.getId());
        merchant = shellMerchantRepository.save(merchant);
        return merchant;
    }

}

3.redis缓存如下