Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Dlaczego pojedyncza instancja Jedis nie jest bezpieczna wątkowo?

Pojedyncza instancja Jedis nie jest bezpieczna wątkowo, ponieważ została zaimplementowana w ten sposób. Taką decyzję podjął autor biblioteki.

Możesz sprawdzić kod źródłowy BinaryJedis, który jest super typem Jedis https://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/BinaryJedis.java

Na przykład te wiersze:

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

Jak widać pole transakcji jest współdzielone dla wszystkich wątków korzystających z instancji Jedis i inicjowane w tej metodzie. Później transakcja ta może być wykorzystana w innych metodach. Wyobraź sobie, że dwa wątki wykonują jednocześnie operacje transakcyjne. Wynikiem może być to, że do transakcji utworzonej przez jeden wątek nieumyślnie uzyskuje dostęp inny wątek. Pole transakcji w tym przypadku to współdzielony dostęp do stanu, do którego nie jest synchronizowany. To sprawia, że ​​Jedis nie jest bezpieczny dla wątków.

Powodem, dla którego autor zdecydował, aby Jedis nie był bezpieczny wątkowo i JedisPool bezpieczny wątkowo, może być zapewnienie elastyczności dla klientów, dzięki czemu jeśli masz środowisko jednowątkowe, możesz użyć Jedis i uzyskać lepszą wydajność lub jeśli masz środowisko wielowątkowe, z którego możesz korzystać JedisPool i uzyskaj bezpieczeństwo wątków.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Problem z wydajnością harmonogramu współbieżności golang + redis

  2. To samo zadanie wykonywane wielokrotnie

  3. Używanie Redis z Node.js i Socket.IO

  4. Jakie są podstawowe różnice między select, epoll, kqueue i evport?

  5. Szybszy sposób iteracji wszystkich kluczy i wartości w redis db