2016-05-24 27 views
1

我在我的駱駝應用程序中使用Redis組件。一個問題是它會自動將字符串前綴到鍵。例如,假設我跑在我的駱駝的應用程序如下:駱駝Redis自動將字符串前綴到密鑰

 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的客戶端和運行下面列出的所有鍵在DB:

> keys * 

返回:

1) "\xac\xed\x00\x05t\x00\x03key" 

在這裏,你可以看到它前面加上\西飛\固定的\ X00 \ x05t \ X00 \ X03的鍵,我不知道它的確切位置做到這一點。

如果我只使用GET和SET Redis命令,這不會成爲問題,因爲出於某種原因,它會爲這些命令預先輸入與該鍵相同的字符串,所以沒有鍵錯誤匹配。但是,如果我嘗試執行不同的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*" 

對這個有什麼想法?

回答

1

以下兩個職位幫我解決這個問題:

Redis serialization prefixed with extra string

Weird redis key with spring data Jedis

所以我在RedisTemplate StringRedisSerializer設置DefaultRedisSerializer固定它。

由於我使用的吉斯的依賴性/豆注入,我增加了以下我GuiceCamelModule

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; 
    } 
} 

我的路線URI是這樣的:

"spring-redis://localhost:6379?redisTemplate=#redisTemplateBean"