Redis
 sql >> база данни >  >> NoSQL >> Redis

Защо един екземпляр на джедаите не е нишки?

Един екземпляр на джедаите не е безопасен за нишки, тъй като е реализиран по този начин. Това е решението, което е взел авторът на библиотеката.

Можете да проверите в изходния код на BinaryJedis, който е супер тип джедаи https://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/BinaryJedis.java

Например тези редове:

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

Както можете да видите, полето за транзакция се споделя за всички нишки, използващи Jedis екземпляр и се инициализира по този метод. По-късно тази транзакция може да се използва и по други методи. Представете си, че две нишки извършват транзакционни операции по едно и също време. Резултатът може да бъде, че транзакция, създадена от една нишка, е неволно достъпна от друга нишка. Полето за транзакция в този случай е споделено състояние за достъп, до което не е синхронизирано. Това прави джедаите небезопасни за нишки.

Причината, поради която авторът реши да направи Jedis не-threadsafe и JedisPool threadsafe може да е да осигури гъвкавост на клиентите, така че ако имате еднонишкова среда, можете да използвате Jedis и да получите по-добра производителност или ако имате многонишкова среда, можете да използвате JedisPool и получете безопасност на нишките.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Намалете резултата в Redis или премахнете, ако е 0

  2. Използване на redis с node.js (експрес)

  3. docker:MISCONF Redis е конфигуриран да запазва RDB моментни снимки

  4. Redis ключовете не се показват, докато използвате Cache фасада в Laravel

  5. Как да актуализирам redis след актуализиране на базата данни?