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

Existuje nějaký klient Redis (preferovaná Java), který podporuje transakce na clusteru Redis?

Transakce v rámci Redis Cluster jsou jiný příběh než transakce s Redis Standalone.

TL;DR;

To je spíše koncepční problém týkající se záruk a kompromisů než problém klienta.

Vysvětlení

V Redis Cluster je konkrétní uzel hlavní pro jeden nebo více hash slotů, což je schéma rozdělení dat mezi více uzlů. Jeden hash-slot, vypočítaný z klíčů použitých v příkazu, žije na jednom uzlu. Příkazy s více klíči jsou omezeny na stejný hash slot. V opačném případě jsou zamítnuty. Taková konstelace se nazývají cross-slot.

Transakce se zdají být řešením pro provádění příkazů pro klíče napříč sloty, ale v určitém okamžiku by člověk opustil rozsah jednoho uzlu a potřeboval by další uzel, aby transakce pokračovala. To může být, pokud jeden klíč žije v jednom uzlu a druhý klíč žije v jiném uzlu. Stále neexistuje žádná koordinace transakcí a to může být někdy problém s problémy Redis Cluster.

API na vysoké úrovni poskytující transakční podporu pro Redis Cluster čelí mnoha problémům a zatím existují dvě strategie, jak se vypořádat s transakcemi v Redis Cluster:

Podpora transakcí, pokud jsou všechny klíče umístěny na jednom uzlu

Tato možnost umožňuje plně funkční transakce. Klientská knihovna musí sledovat uzel, v němž je transakce provedena, a zakázat klíče mimo rozsah slotu po dobu, kdy transakce probíhá. Protože slot lze určit pouze pomocí příkazu obsahujícího klíč, klient musí nastavit transakční příznak a na úplně prvním příkazu obsahujícím klíč musí být vydán příkaz MULTI, těsně před prvním příkazem v rámci transakce. Omezení zde jednoznačně spočívá v požadavku mít všechny klíče umístěny na jednom uzlu.

Distribuované transakce

V tomto případě se spustí více transakcí na všech uzlech, které se připojí k distribuované transakci. Tato distribuovaná transakce může zahrnovat klíče ze všech hlavních uzlů. Jakmile je transakce provedena, klientská knihovna spustí provedení transakce, knihovna shromáždí všechny výsledky (aby zachovala pořadí výsledků příkazů) a vrátí je volajícímu.

Tento styl transakcí je pro klienta transparentní. Jakmile je požadován klíč na konkrétním uzlu a uzel ještě není součástí transakce, zobrazí se MULTI je vydán příkaz k připojení uzlu k transakci. Nevýhodou je, že transakce již nemohou být podmíněné (WATCH ). Jednotlivé transakce nevědí, zda byl klíč změněn na jiném uzlu, takže jedna transakce může být vrácena zpět, zatímco ostatní transakce budou úspěšné. Zní to trochu jako dvoufázové potvrzení.

Závěr

Redis Transactions působí jako atomické dávkování příkazů, které lze podmínit. Je důležité si pamatovat, že provedení příkazu je odloženo, protože výsledky čtení se vracejí v okamžiku provedení transakce, nikoli v okamžiku vydání příkazu.

Pro Redis Cluster se klienti nerozhodli pro globální strategii. Je bezpečné spouštět transakce na konkrétním uzlu Redis Cluster, ale jste omezeni na klíče obsluhované tímto uzlem. Obě možné strategie mají vlastnosti, které mohou být užitečné pro určité případy použití, ale mají také omezení.




  1. Průměr pole dílčího dokumentu napříč dokumenty v Mongo

  2. Fronta Laravel 5.5 redis je příliš pomalá

  3. Jak nainstalovat Redis

  4. projekce nefunguje s vyhledávacím dotazem