【问题标题】:I'm getting a corrupted value from Spring Redis MessageReceiver我从 Spring Redis MessageReceiver 得到一个损坏的值
【发布时间】:2016-01-23 17:15:27
【问题描述】:

我正在使用 Spring/Redis/Jedis 来构建一个简单的消息队列系统。我提出了一个仅使用字符串的简单测试用例,但由于某种原因,字符串返回已损坏。我最初尝试使用 POJO,但也有损坏,所以我认为只需简单的字符串即可,但到目前为止还没有运气。

当我使用 redis-cli 并订阅频道时,它显示给我的原始数据是

1) "message"
2) "test"
3) "\xac\xed\x00\x05t\x00\x03wee"

这是我的示例代码

@Service
public class MessageService {
    @Autowired private RedisTemplate<String, String> testTemplate;

    @Bean
    RedisMessageListenerContainer container(JedisConnectionFactory jedisConnectionFactory,
                                            MessageListenerAdapter listenerAdapter) {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(jedisConnectionFactory);
        container.addMessageListener(listenerAdapter, new PatternTopic("test"));

        return container;
    }

    @Bean
    MessageListenerAdapter listenerAdapter() {
        return new MessageListenerAdapter(this, "receiveMessage");
    }

    public void sendMessage(){
        TestObject message = new TestObject();
        message.test = 5;
        testTemplate.convertAndSend("test", "wee");
    }

    public void receiveMessage(String testObject) {
        System.out.println("I got a message " + testObject);
    }
}

receieveMessage 的输出是I got a message ?? t wee,在stackoverflow 中有两个字符不能显示在't' 之前和之后的空格。

关于导致这种损坏的任何想法?

【问题讨论】:

  • Spring Data Redis 使用 JdkSerializationRedisSerializer 序列化值。如果要使用字符串,请使用 StringRedisSerializerRedisStringTemplate。见docs.spring.io/spring-data/data-redis/docs/current/api/org/…docs.spring.io/spring-data/redis/docs/1.6.0.RELEASE/reference/…
  • 我已经在使用 RedisTemplate,即使我输入了testTemplate.setKeySerializer(new StringRedisSerializer()); testTemplate.setDefaultSerializer(new StringRedisSerializer());,我仍然会遇到同样的损坏。从 RedisMessageListenerContainer 看来,它似乎使用了默认的 StringRedisSerializer。
  • 也有setValueSerializer(),不过setDefaultSerializer()应该没问题。

标签: java spring redis jedis


【解决方案1】:
    @Bean
    public RedisTemplate<String,String> redisTemplate() {
        final RedisTemplate<String,String> redisTemplate = new RedisTemplate<String,String>();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new GenericToStringSerializer<>(Object.class));
        redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(jedisConnectionFactory());
        return redisTemplate;
    }

您的 RedisTemplate 值序列化器应该是 StringRedisSerializer。将此配置用于 RedisTemplate。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-07
    • 2017-03-31
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多