我在Camel应用程序中使用Redis组件。一个问题是它会自动将字符串添加到键中。例如,让我说我在我的Camel应用程序中运行以下内容:
from("direct://path/to/store/in/redis")
.setHeader(RedisConstants.COMMAND, constant("SET"))
.setHeader(RedisConstants.KEY, constant("key"))
.setHeader(RedisConstants.VALUE, constant("value"))
.to(spring-redis://localhost:6379);
然后,如果我打开命令行Redis客户端并运行以下命令来列出数据库中的所有密钥:
> keys *
它返回:
1) "\xac\xed\x00\x05t\x00\x03key"
在这里你可以看到它将 \ xac \ xed \ x00 \ x05t \ x00 \ x03 添加到密钥中,我不确定它到底在哪里。
如果我只使用GET和SET Redis命令,这不会有问题,因为由于某种原因,它会为这些命令的前缀添加相同的字符串,所以没有关键错误比赛。但是,如果我尝试通过Camel应用程序执行不同的Redis命令,例如 KEYS ,请执行以下操作:
from("direct://some/other/path/to/redis")
.setHeader(RedisConstants.COMMAND, constant("KEYS"))
.setHeader(RedisConstants.PATTERN, constant("*"))
.to(spring-redis://localhost:6379);
它会在星号前面添加一个稍微不同的字符串,这会导致查询没有返回任何内容,因为该模式没有匹配项。那就是
> KEYS *
命令转换为Redis中的以下内容:
> KEYS "\xac\xed\x00\x05t\x00\x05t*"
对此有何想法?
答案 0 :(得分:1)
以下两篇文章帮我解决了这个问题:
Redis serialization prefixed with extra string
Weird redis key with spring data Jedis
所以我通过将 RedisTemplate 中的 DefaultRedisSerializer 设置为 StringRedisSerializer 来修复它。
由于我使用Guice进行依赖/ bean注入,我将以下内容添加到我的 GuiceCamelModule 中:
.flex-item {
flex: 1;
}
.big {
flex: 3;
}
我的路径URI如下所示:
public class GuiceCamelTestModule extends CamelModuleWithMatchingRoutes {
...
@Provides
@JndiBind("redisTemplateBean")
Object provideRedisTemplateBean() {
JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory();
redisConnectionFactory.afterPropertiesSet();
RedisTemplate<?, ?> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
template.setDefaultSerializer(new StringRedisSerializer());
template.afterPropertiesSet();
return template;
}
}
答案 1 :(得分:0)
如果单独使用骆驼组件spring-redis(即不使用Jedis),则使用下面的代码。
pom.xml
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-spring-redis-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
RedisConfiguration.java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfiguration {
@Bean("redisTemplate")
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
return template;
}
}
Route.java
.setHeader(RedisConstants.COMMAND, constant("SETEX"))
.setHeader(RedisConstants.KEY, simple("${body.parentId}"))
.setHeader(RedisConstants.VALUE, simple("${body}"))
.setHeader(RedisConstants.TIMEOUT, constant(100))
.to("spring-redis://" + redisHost + ":" + redisPort + "?redisTemplate=#redisTemplate");