sql >> Databasteknik >  >> NoSQL >> Redis

Varför är en enda Jedis-instans inte trådsäker?

En enda Jedis-instans är inte trådsäker eftersom den implementerades på detta sätt. Det är det beslut som författaren till biblioteket tog.

Du kan kolla in källkoden för BinaryJedis som är en supertyp av Jedis https://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/BinaryJedis.java

Till exempel dessa rader:

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

Som du kan se delas transaktionsfältet för alla trådar som använder Jedis-instansen och initieras i denna metod. Senare kan denna transaktion användas i andra metoder. Föreställ dig att två trådar utför transaktionsoperationer samtidigt. Resultatet kan bli att en transaktion skapad av en tråd oavsiktligt nås av en annan tråd. Transaktionsfältet i detta fall är delad tillståndsåtkomst som inte är synkroniserad. Detta gör Jedis icke-trådsäkra.

Anledningen till att författaren bestämde sig för att göra Jedis icke-trådsäker och JedisPool trådsäker kan vara för att ge flexibilitet för klienter så att om du har en enkeltrådig miljö kan du använda Jedis och få bättre prestanda eller om du har en flertrådsmiljö du kan använda JedisPool och få trådsäkerhet.




  1. Hur man kontrollerar kopplingen mellan mysql och memcached i php

  2. $in kräver en array som ett andra argument, hittat:saknas

  3. mongodb:hitta det högsta numeriska värdet i en kolumn

  4. 3 sätt att returnera distinkta värden i MongoDB