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

Zarządzanie połączeniami

Ciągi połączeń Redis #

Ciągi połączeń Redis zostały rozszerzone, aby obsługiwać bardziej wszechstronny format URI, który jest teraz w stanie przechwycić większość ustawień klienta Redis w jednym ciągu połączenia (podobnie jak ciągi połączeń DB).

Parametry połączenia Redis obsługują wiele formatów podobnych do URI, od prostej nazwy hosta lub Adres IP i port sparuj z w pełni kwalifikowanym URI z wieloma opcjami określonymi w ciągu zapytania.

Kilka przykładów obsługiwanych formatów:

localhost
127.0.0.1:6379
redis://localhost:6379
password@localhost:6379
clientid:password@localhost:6379
redis://clientid:password@localhost:6380?ssl=true&db=1

INFORMACJE

Więcej przykładów można zobaczyć w ConfigTests.cs

Dowolną dodatkową konfigurację można określić jako parametry QueryString. Pełna lista opcji, które można określić, obejmuje:

Ssl bool Jeśli jest to połączenie SSL
Db int Redis DB to połączenie powinno być ustawione na
Klient ciąg Alias ​​tekstowy do określenia dla tego połączenia do celów analitycznych
Hasło ciąg Wersja hasła zakodowana przez URL dla tego połączenia
Czas połączenia int Limit czasu w ms na nawiązanie połączenia TCP Socket
Czas wysłania int Limit czasu w ms na wykonanie synchronicznego wysyłania przez gniazdo TCP
Limit czasu odbioru int Limit czasu oczekiwania w ms na synchroniczny odbiór gniazda TCP
IdleTimeOutSecs int Limit czasu w sekundach, aby połączenie bezczynne zostało uznane za aktywne
Prefiks przestrzeni nazw ciąg Użyj niestandardowego prefiksu dla wewnętrznych kolekcji indeksów ServiceStack.Redis

Obsługa SSL ServiceStack.Redis #

ServiceStack.Redis obsługuje połączenia SSL dzięki czemu nadaje się do uzyskiwania dostępu do zdalnych instancji serwera Redis przez bezpieczne połączenie SSL .

Określ protokół SSL #

Obsługa zmiany protokołów SSL używanych do szyfrowanych połączeń SSL może być ustawiona w ciągu połączenia za pomocą sslprotocols modyfikator, np.:

var connString = $"redis://{Host}?ssl=true&sslprotocols=Tls12&password={Password.UrlEncode()}";
var redisManager = new RedisManagerPool(connString);
using var client = redisManager.GetClient();
//...

Łączenie z usługą Azure Redis #

Ponieważ nawiązywanie połączenia z usługą Azure Redis Cache za pośrednictwem protokołu SSL było głównym przypadkiem użycia tej funkcji, dodaliśmy nowe nawiązywanie połączenia z usługą Azure Redis za pośrednictwem protokołu SSL, aby ułatwić rozpoczęcie pracy.

Redis GEO #

Wydanie Redis 3.2.0 wprowadza nowe, ekscytujące możliwości GEO, które pozwolą Ci przechowywać współrzędne szerokości/długości w Redis i wyszukiwać lokalizacje w określonym promieniu. Aby zademonstrować tę funkcjonalność, stworzyliśmy nowe demo Redis GEO Live, które pozwala kliknąć w dowolnym miejscu w USA, aby znaleźć listę najbliższych miast w danym promieniu, Live Demo na:https://redis.netcore.io

Menedżerowie klienta Redis #

Zalecany sposób uzyskania dostępu do RedisClient wystąpień jest użycie jednego z dostępnych poniżej menedżerów klienta Thread-Safe. Menedżerowie klientów to fabryki połączeń, które powinny być zarejestrowane jako Singleton w twoim IOC lub klasie statycznej.

RedisManagerPula #

Dzięki ulepszonym parametrom połączenia URI Redis byliśmy w stanie uprościć i usprawnić istniejący PooledRedisClientManager implementacji i wyodrębniłem go do nowego menedżera klientów o nazwie RedisManagerPool .

Oprócz usunięcia wszystkich powyższych opcji w samym Menedżerze Klienta, parametry połączenia tylko do odczytu zostały również usunięte, dzięki czemu konfiguracja jest znacznie prostsza i bardziej zgodna z typowym przypadkiem użycia:

container.Register<IRedisClientsManager>(c => 
    new RedisManagerPool(redisConnectionString));

Zachowanie łączenia

Wszelkie połączenia wymagane po osiągnięciu maksymalnego rozmiaru puli zostaną utworzone i usunięte poza pulą. Nie będąc ograniczonym do maksymalnego rozmiaru puli, zachowanie puli w RedisManagerPool może utrzymać mniejszy rozmiar puli połączeń kosztem potencjalnie większej liczby otwartych/zamkniętych połączeń.

PooledRedisClientManager #

Jeśli wolisz zdefiniować opcje w samym Menedżerze Klienta lub chcesz zapewnić oddzielne serwery redis do odczytu/zapisu i tylko do odczytu (tj. Master i Replica), użyj PooledRedisClientManager zamiast tego:

container.Register<IRedisClientsManager>(c => 
    new PooledRedisClientManager(redisReadWriteHosts, redisReadOnlyHosts) { 
        ConnectTimeout = 100,
        //...
    });

Zachowanie łączenia

PooledRedisClientManager narzuca maksymalny limit połączeń, a po osiągnięciu maksymalnego rozmiaru puli blokuje wszystkie nowe żądania połączenia do następnego RedisClient jest wypuszczany z powrotem do basenu. Jeśli żaden klient nie stał się dostępny w ciągu PoolTimeout , pula TimeoutException zostanie rzucony.

Klienci tylko do odczytu #

Domyślnie rozwiązywanie RedisClient za pomocą GetRedisClient() lub GetRedisClientAsync() zwróci klienta połączonego ze skonfigurowanym hostem głównym (głównym), jeśli masz również skonfigurowane hosty repliki (podrzędne), możesz uzyskać do niego dostęp za pomocą GetReadOnlyClient() lub GetReadOnlyClientAsync() API, np.:

using var redisReadOnly = clientsManager.GetReadOnlyClient();

BasicRedisClientManager #

Jeśli nie chcesz używać puli połączeń (tzn. uzyskujesz dostęp do lokalnej instancji redis-server), możesz użyć podstawowego (nie połączonego) menedżera klientów, który tworzy nowego RedisClient instancja za każdym razem:

container.Register<IRedisClientsManager>(c => 
    new BasicRedisClientManager(redisConnectionString));

Dostęp do klienta Redis #

Po zarejestrowaniu dostęp do RedisClient jest taki sam we wszystkich menedżerach klienta, np.:

var clientsManager = container.Resolve<IRedisClientsManager>();
using var redis = clientsManager.GetClient();

redis.IncrementValue("counter");
List<string> days = redis.GetAllItemsFromList("days");

//Access Typed API
var redisTodos = redis.As<Todo>();

redisTodos.Store(new Todo {
    Id = redisTodos.GetNextSequence(),
    Content = "Learn Redis",
});

var todo = redisTodos.GetById(1);

//Access Native Client
var redisNative = (IRedisNativeClient)redis;

redisNative.Incr("counter");
List<string> days = redisNative.LRange("days", 0, -1);

Bardziej szczegółową listę dostępnych interfejsów API RedisClient użytych w przykładzie można zobaczyć w poniższych interfejsach C#:

  • IRedisClientsManager
  • IRedisClient
  • IRedisNativeClient
  • IRedisSubskrypcja

Interfejsy API potoków i transakcji #

  • IRedisTransakcja
  • IRedisPipelineShared
  • IRedisQueueableOperation
  • Operacja IRedisQueueCompletable

Ogólne interfejsy API klienta #

  • IRedisTypedClient
  • IRedisHash
  • IRedisList
  • IRedisSet
  • IRedisSortedSet
  • IRedisTypedQueueableOperation

Interfejsy API kolekcji serwerów #

  • IRedisHash
  • IRedisList
  • IRedisSet
  • IRedisSortedSet

Async Redis #

Obsługa asynchroniczna w ServiceStack.Redis została zaprojektowana z myślą o optymalnej wydajności i wykorzystuje ValueTask i inne nowoczesne interfejsy API asynchroniczne dostępne tylko w .NET Standard 2.0 i .NET Framework 4.7.2+ projekty, w których istnieją odpowiedniki asynchronicznego interfejsu API dla większości interfejsów API synchronizacji zawartych w poniższych interfejsach Async Redis:

  • IRedisClientsManagerAsync
  • IRedisClientAsync
  • IRedisNativeClientAsync
  • IRedisSubscriptionAsync

Async Pipeline &Transaction API #

  • IRedisTransactionAsync
  • IRedisPipelineSharedAsync
  • IRedisQueueableOperationAsync
  • IRedisQueueCompletableOperationAsync

Async Generic Client API #

  • IRedisTypedClientAsync
  • IRedisHashAsync
  • IRedisListAsync
  • IRedisSetAsync
  • IRedisSortedSetAsync
  • IRedisTypedTransactionAsync
  • IRedisTypedQueueableOperationAsync

Async Server Collection API #

  • IRedisHashAsync
  • IRedisListAsync
  • IRedisSetAsync
  • IRedisSortedSetAsync

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. RQ — Opróżnij i usuń kolejki

  2. Redis jako unikalny generator id atomowych - bezpieczny sposób na wątki dla aplikacji internetowej, aby uniknąć wyścigu

  3. Skrypt Lua dla Redisa, który sumuje wartości kluczy

  4. Stackexchange.Redis dlaczego ConnectionMultiplexer.Connect nawiązuje dwa połączenia klientów?

  5. Dekodowanie Go JSON jest bardzo powolne. Jaki byłby lepszy sposób na zrobienie tego?