sql >> Database >  >> NoSQL >> Redis

Waarom is een enkele Jedis-instantie niet threadsafe?

Een enkele Jedis-instantie is niet threadsafe omdat het op deze manier is geïmplementeerd. Dat is de beslissing die de auteur van de bibliotheek heeft genomen.

Je kunt de broncode van BinaryJedis controleren, wat een supertype van Jedis is https://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/BinaryJedis.java

Bijvoorbeeld deze regels:

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

Zoals u kunt zien, wordt het transactieveld gedeeld voor alle threads met behulp van de Jedis-instantie en geïnitialiseerd in deze methode. Later kan deze transactie in andere methoden worden gebruikt. Stel je voor dat twee threads tegelijkertijd transactiebewerkingen uitvoeren. Het resultaat kan zijn dat een transactie die door de ene thread is gemaakt, onbedoeld wordt benaderd door een andere thread. Het transactieveld is in dit geval gedeelde statustoegang waarvoor niet is gesynchroniseerd. Dit maakt Jedis niet-threadsafe.

De reden waarom de auteur heeft besloten om Jedis non-threadsafe en JedisPool threadsafe te maken, is misschien om klanten flexibiliteit te bieden, zodat als je een omgeving met één thread hebt, je Jedis kunt gebruiken en betere prestaties kunt krijgen of als je een omgeving met meerdere threads hebt die je kunt gebruiken. JedisPool en krijg draadveiligheid.




  1. MongoDB best practice voor verwijzingen

  2. Redis:nieuwsfeeds in lijst of gesorteerde set uitwaaieren?

  3. Node.js en Mongoose regex-query op meerdere velden

  4. Time-out voor Jedis configureren