spring-boot - Spring boot + Redis - 生成一个奇怪的 key

标签 spring-boot redis jedis

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

我的 Controller 有这样的配置:

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

我的自定义 key 生成器是:

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 中连接时,我有这个 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”之前?

注意:我的 key 生成器以我的类名开头。

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

最佳答案

我解决了我的问题。 我正在搜索并找到 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。 为了产生值(value),我使用“Jackson2JsonRedisSerializer”在 JsonValue 中转换我的数据。

现在,我的 key 上没有“奇怪”的字符了。

关于spring-boot - Spring boot + Redis - 生成一个奇怪的 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51291548/

相关文章:

events - 有没有办法使用像redis这样的持久性数据库来延迟特定时间?

exception - 与 Jedis 客户端交易的 Redis 异常

redis - 使用带有 Redis 的 Storm 作为数据源

java - 从外部服务发送命令时,聚合中的 axon 3.4 CommandHandler 不会被触发

spring-boot - Axon 4 XStream 配置

node.js - 多 Node js 服务器与 socket.io-redis 相互通信不接收事件

php - 使用 PHP 7.0 的 Redis 中的 Codeigniter session 错误

java - 绝地武士获取数据 : JedisConnectionFailureException iterating a section of code over long period of time

java - Autowiring 在 Apache Shiro 自定义 Realm 类中不起作用

spring-boot - Spring Boot 2 war 文件尝试加载 el-api v3.0 类 (NoClassDefFoundError : javax/el/ELManager) on tomcat 7 (el-api 2. 2)