SpringBoot & Redis list - проблема с многопоточностью списка redis - PullRequest
0 голосов
/ 16 июня 2020
@AutoWired

private RedisTemplate<String, String> redisTemplate;

public void method() {

    Long redisSize = redisTemplate.opsForList().size(key);

    long size = 0L;

    while(redisSize > size) {

        String str = (String) redisTemplate.opsForList().rightPop(key);

        //do something

        redisTemplate.opsForList().leftPush(Json.toJsonString(object));

    }

}

В многопоточной работе (например: потоки задачи времени, вызываемые контроллером), очередь redis оценивается несколькими потоками, тогда в это время она быстрее достигнет конца исходной очереди, но из-за к условию redisSize> size, он будет многократно принимать значения из списка redis.

Например: в начале есть 10 значений (1,2,3 ... 10) , поток занимает 1, поток b занимает 2, c поток занимает 3. Таким образом поток может достичь 10 быстрее. Что нужно сделать, чтобы избежать этой ситуации, в конце этой исходной очереди, а затем продолжить принимать значения с начала очереди?

...