Spring boot + Redis - 生成一个奇怪的密钥 [英] Spring boot + Redis - Generating a strange key

查看:61
本文介绍了Spring boot + Redis - 生成一个奇怪的密钥的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am using Spring-boot + Redis to store my data on cache.

我的控制器有这样的配置:

My Controller has this configuration:

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

我的 customKeyGenerator 是:

My customKeyGenerator is:

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 时,我有这个密钥:

When I connect in my redis I have this key:

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"之前?

Why this characters are present before "CacheController"?

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

Note: My key Generator starts with my Class name.

我希望我的密钥名称仅为:CacheController-getByKey-String:myKey

I would like that my key name be only this: CacheController-getByKey-String:myKey

推荐答案

我解决了我的问题.我在搜索并发现 这个发布.

I solved my problem. I was searching and found this post.

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

I changed my code for use some properties of 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 中转换我的数据.

The problem is because the default Serializer is "JdkSerializationRedisSerializer", now I am using "StringRedisSerializer" to generate a key. To generate value I am using "Jackson2JsonRedisSerializer" to transform my data in JsonValue.

现在,我的钥匙没有奇怪"的字符.

Now, my keys does not have the "strange" characters.

这篇关于Spring boot + Redis - 生成一个奇怪的密钥的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆