Spring+Redis 缓存

导入依赖

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
其余引入Springboot 依赖项

配置类

@SuppressWarnings("all")
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public KeyGenerator simpleKeyGenerator() {
        return (o, method, objects) -> {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(o.getClass().getSimpleName());
            stringBuilder.append(".");
            stringBuilder.append(method.getName());
            stringBuilder.append("[");
            for (Object obj : objects) {
                stringBuilder.append(obj.toString());
            }
            stringBuilder.append("]");

            return stringBuilder.toString();
        };
    }
    
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        return new RedisCacheManager(
                RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory),
                this.getRedisCacheConfigurationWithTtl(5), // 默认策略,未配置的 key 会使用这个
                this.getRedisCacheConfigurationMap() // 指定 key 策略
        );
    }

    /**
     * @how to use   eg:
     * @Cacheable(value = "USER1", keyGenerator = "simpleKeyGenerator") //10min
     * @Cacheable(value = "USER10", keyGenerator = "simpleKeyGenerator") //10min
     * @Cacheable(value = "USER30", keyGenerator = "simpleKeyGenerator") // 30min
     * @Cacheable(value = "USER60", keyGenerator = "simpleKeyGenerator") // 60min,未指定的key,使用默认策略
     ****/
    private Map<String, RedisCacheConfiguration> getRedisCacheConfigurationMap() {
        Map<String, RedisCacheConfiguration> redisCacheConfigurationMap = new HashMap<>();
        redisCacheConfigurationMap.put("USER1", this.getRedisCacheConfigurationWithTtl(1));
        redisCacheConfigurationMap.put("USER10", this.getRedisCacheConfigurationWithTtl(10));
        redisCacheConfigurationMap.put("USER30", this.getRedisCacheConfigurationWithTtl(30));
        redisCacheConfigurationMap.put("USER60", this.getRedisCacheConfigurationWithTtl(60));
        return redisCacheConfigurationMap;
    }


    /**
     * key String ,value JSON
     *
     * @param Minute
     * @return
     */
    private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Integer minute) {
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = getJacksonSerializer();
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(minute));
        RedisSerializationContext.SerializationPair<Object> serializationPair = RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer);
        RedisSerializationContext.SerializationPair<String> stringSerializationPair = RedisSerializationContext.SerializationPair
                .fromSerializer(getStringSerializer());
        redisCacheConfiguration.serializeValuesWith(serializationPair).serializeKeysWith(stringSerializationPair);
        return redisCacheConfiguration;
    }

    @Resource
    private RedisTemplate<String, List<String>> redisTemplate;

    public RedisTemplate<String, List<String>> getRedisTemplate() {
        this.redisTemplate.setValueSerializer(getJacksonSerializer());
        this.redisTemplate.setKeySerializer(getStringSerializer());
        return this.redisTemplate;
    }

    public ObjectMapper getObjectMapper() {
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        return om;
    }

    public Jackson2JsonRedisSerializer<Object> getJacksonSerializer() {
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        jackson2JsonRedisSerializer.setObjectMapper(getObjectMapper());
        return jackson2JsonRedisSerializer;
    }

    public StringRedisSerializer getStringSerializer() {
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        return stringRedisSerializer;
    }


}

启动类加上注解@EnableCaching,用法和这几个注解的方式一样 @Cacheable @CachePut @CacheEvict

posted @ 2024-01-25 12:04  lyu6  阅读(2)  评论(0)    收藏  举报