在多个消费者用于redis消息传递的情况下丢失数据

时间:2014-10-01 07:33:59

标签: java redis spring-boot spring-data-redis

在我的应用程序中我使用多个消费者接收来自redis发行商的消息。但现在问题是丢失数据和重复数据我的意思是多个消费者收到了相同的消息。如何在redis中解决这个问题?并且还可以在java中提供示例我是redis messaging的新手。请帮助我。

这是我的接收器

@Configuration
@EnableScheduling
public class ScheduledRecevierService {

    private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Bean
    RedisConnectionFactory redisConnectionFactory() {
        LOGGER.info("in redisConnectionFactory");
        JedisConnectionFactory redis = new JedisConnectionFactory();
        redis.setHostName("ipaddress");
        redis.setPort(6379);
        return redis;
    }

    @Bean
    StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
        LOGGER.info("in template");
        return new StringRedisTemplate(connectionFactory);
    } 

    @Scheduled(fixedRate = 1000)
    public void getScheduledMessage() {

        StringRedisTemplate template = template(redisConnectionFactory());
        System.out.println("The time is now " + dateFormat.format(new Date()));
        LOGGER.info("Sending messages...");

        String message = template.opsForList().leftPop("point-to-point-test"); // latch.await();
        // template.convertAndSend("chat", "Hello from Redis! count: " + i);
        LOGGER.info("Got  message " + message + " from chat1 channel"); //
    }

}

我在多个消费者实例中运行这个应用程序。我的队列“点对点测试”有1000条消息,我观察到的是在多个服务器日志中读取同一消息。

我们可以使用java在redis中实现点对点协议通信吗?

redis中的RPOPLPUSH命令解决了这个问题?如果是,请在java中发布一些示例。

从快速的几天开始,我很难在redis消息中解决这些问题,请帮助我

1 个答案:

答案 0 :(得分:0)

使用redis事务确保所有命令按顺序执行http://redis.io/topics/transactions

使用Jedis作为Java客户端库,请参阅其测试以了解事务https://github.com/xetorthio/jedis/blob/master/src/test/java/redis/clients/jedis/tests/commands/TransactionCommandsTest.java

的用法