sql >> Databáze >  >> NoSQL >> Redis

Proč jedna instance Jedis není bezpečná pro vlákna?

Jedna instance Jedis není bezpečná pro vlákna, protože byla implementována tímto způsobem. To je rozhodnutí, které učinil autor knihovny.

Můžete zkontrolovat zdrojový kód BinaryJedis, což je super typ Jedisů https://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/BinaryJedis.java

Například tyto řádky:

public Transaction multi() {
    client.multi();
    client.getOne(); // expected OK
    transaction = new Transaction(client);
    return transaction;
}

Jak můžete vidět, pole transakce je sdíleno pro všechna vlákna pomocí instance Jedis a inicializováno touto metodou. Později může být tato transakce použita v jiných metodách. Představte si, že dvě vlákna provádějí transakční operace současně. Výsledkem může být, že k transakci vytvořené jedním vláknem neúmyslně přistoupí jiné vlákno. Pole transakce je v tomto případě sdíleným stavovým přístupem, který není synchronizován. Díky tomu nejsou Jedisové zabezpečeni proti vláknům.

Důvodem, proč se autor rozhodl učinit Jedis non-threadsafe a JedisPool threadsafe, může být poskytnutí flexibility pro klienty, takže pokud máte jednovláknové prostředí, můžete používat Jedis a získat lepší výkon, nebo pokud máte vícevláknové prostředí, které můžete použít JedisPool a získejte bezpečnost vláken.




  1. Jaký je nejúčinnější databázový stroj orientovaný na dokumenty pro ukládání tisíců středně velkých dokumentů?

  2. MongoDB, odeberte objekt z pole

  3. Porovnání vzorů nasazení pro MongoDB

  4. Použití S3 jako databáze vs. databáze (např. MongoDB)