【问题标题】:Spring boot + Redis - Generating a strange keySpring boot + Redis - 生成一个奇怪的密钥
【发布时间】:2018-12-19 20:28:23
【问题描述】:

我正在使用 Spring-boot + Redis 将我的数据存储在缓存中。

我的控制器有这个配置:

public class CacheController {    
@GetMapping("/{key}")
    @Cacheable(value = "myCacheValue", keyGenerator = "customKeyGenerator")
    public String getByKey(@PathVariable("key") String key) {
        return key + System.currentTimeMillis();
    }
}

我的 customKeyGenerator 是:

public class CustomKeyGenerator implements KeyGenerator {
    public Object generate(Object target, Method method, Object... params) {
        StringBuilder sb = new StringBuilder();
        sb.append(target.getClass().getSimpleName())
                .append("-")
                .append(method.getName());

        if (params != null) {
            for (Object param : params) {
                sb.append("-")
                        .append(param.getClass().getSimpleName())
                        .append(":").append(param);
            }
        }
        return sb.toString();
    }
}

当我在我的 redis 中连接时,我有这个密钥:

1 - redis-cli --raw
KEYS *
myCacheValue~keys
��t$CacheController-getByKey-String:key9

2 - redis-cli
KEYS *
myCacheValue~keys
\xac\xed\x00\x05t\x00$CacheController-getByKey-String:key9

为什么这个字符出现在“CacheController”之前?

注意:我的密钥生成器以我的班级名称开头。

我希望我的键名只有这样: CacheController-getByKey-String:myKey

【问题讨论】:

    标签: spring-boot redis jedis


    【解决方案1】:

    我解决了我的问题。 我正在搜索,发现this post

    我更改了代码以使用 RedisTemplate 的某些属性:

    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(cf);
    
        configureSerializers(redisTemplate);
    
        JedisConnectionFactory jedisConnectionFactory = (JedisConnectionFactory) cf;
        JedisPoolConfig actualPoolConfig = jedisConnectionFactory.getPoolConfig();
        jedisConnectionFactory.setPoolConfig(createJedisPoolConfig(actualPoolConfig));
    
        return redisTemplate;
    }
    
    private void configureSerializers(RedisTemplate<String, String> redisTemplate) {
        RedisSerializer<String> serializerKey = new StringRedisSerializer();
        redisTemplate.setKeySerializer(serializerKey);
        redisTemplate.setHashKeySerializer(serializerKey);
    
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        om.configure(
                DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        jackson2JsonRedisSerializer.setObjectMapper(om);
    
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
    }    
    

    问题是因为默认的Serializer是“JdkSerializationRedisSerializer”,现在我使用“StringRedisSerializer”来生成key。 为了产生价值,我使用“Jackson2JsonRedisSerializer”在 JsonValue 中转换我的数据。

    现在,我的钥匙没有“奇怪”的字符了。

    【讨论】:

      【解决方案2】:

      doc,您可以使用RedisCacheConfiguration Bean 自定义您的redisCacheManager

      @Configuration
      public class CacheConfiguration {
          @Bean
          public RedisCacheConfiguration redisCacheConfiguration() {
          return RedisCacheConfiguration.defaultCacheConfig();
          }
      }
      

      默认配置为:

          public static RedisCacheConfiguration defaultCacheConfig() {
      
          DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
      
          registerDefaultConverters(conversionService);
      
          return new RedisCacheConfiguration(Duration.ZERO, true, true, CacheKeyPrefix.simple(),
                  SerializationPair.fromSerializer(new StringRedisSerializer()),// this will use string as the key serializer
                  SerializationPair.fromSerializer(new JdkSerializationRedisSerializer()), conversionService);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-26
        • 2016-04-25
        • 1970-01-01
        • 2010-09-08
        • 2023-04-04
        • 1970-01-01
        • 2021-01-20
        相关资源
        最近更新 更多