Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Por que uma única instância Jedis não é threadsafe?


Uma única instância Jedis não é threadsafe porque foi implementada dessa maneira. Essa é a decisão que o autor da biblioteca tomou.

Você pode verificar o código fonte de BinaryJedis que é um super tipo de Jedis https://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/BinaryJedis.java

Por exemplo estas linhas:
public Transaction multi() {
    client.multi();
    client.getOne(); // expected OK
    transaction = new Transaction(client);
    return transaction;
}

Como você pode ver, o campo de transação é compartilhado para todos os threads usando a instância Jedis e inicializado neste método. Mais tarde esta transação pode ser usada em outros métodos. Imagine dois threads realizando operações transacionais ao mesmo tempo. O resultado pode ser que uma transação criada por um encadeamento seja acessada involuntariamente por outro encadeamento. O campo de transação neste caso é o acesso de estado compartilhado ao qual não está sincronizado. Isso torna os Jedis não threadsafe.

A razão pela qual o autor decidiu tornar o Jedis non-threadsafe e o JedisPool threadsafe pode ser fornecer flexibilidade para os clientes para que, se você tiver um ambiente de thread único, possa usar o Jedis e obter melhor desempenho ou, se tiver um ambiente multithread, poderá usar JedisPool e obtenha segurança de thread.