Opublikowano wydanie systemu zarządzania bazą danych Redis 7.0, który należy do klasy systemów NoSQL. Redis oferuje funkcje przechowywania danych w formacie klucz/wartość, z rozszerzoną obsługą strukturalnych formatów danych, takich jak listy, hashe i zbiory, a także możliwości wykonywania skryptów serwerowych w języku Lua. Kod projektu jest dostarczany na licencji BSD. Dodatkowe moduły, które oferują rozszerzone możliwości dla użytkowników korporacyjnych, takie jak RediSearch, RedisGraph, RedisJSON, RedisML, RedisBloom, od 2019 roku dostarczane są na bazie licencji RSAL. Rozwój otwartych wariantów tych modułów na licencji AGPLv3 próbował kontynuować projekt GoodFORM, który ostatnio przeżywa stagnację.
W odróżnieniu od systemów przechowywania w pamięci, takich jak Memcached, Redis zapewnia trwałe przechowywanie danych na dysku i gwarantuje bezpieczeństwo bazy danych w przypadku nieplanowanego zamknięcia. Źródła projektu są udostępniane na bazie licencji BSD. Biblioteki klienckie dostępne są dla większości popularnych języków, w tym Perl, Python, PHP, Java, Ruby i Tcl. Redis wspiera transakcje, które pozwalają na wykonanie grupy poleceń w ramach jednego kroku, gwarantując spójność i ciągłość (polecenia z innych zapytań nie mogą się wcisnąć) realizacji określonego zestawu poleceń, a w przypadku problemów umożliwiając wycofanie zmian. Wszystkie dane są w pełni cachowane w pamięci operacyjnej.
Do zarządzania danymi udostępniane są takie polecenia jak inkrementacja/dekrementacja, standardowe operacje na listach i zbiorach (łączenie, przecięcie), zmiana nazw kluczy, wielokrotne wybory i funkcje sortowania. Obsługiwane są dwa tryby przechowywania: okresowa synchronizacja danych na dysk oraz prowadzenie logu zmian na dysku. W drugim przypadku gwarantowane jest pełne zachowanie wszystkich zmian. Możliwa jest organizacja replikacji danych w trybie master-slave, serwerówrealizowana w trybie nieblokującym. Dostępny jest także tryb wymiany wiadomości "publikacja/subskrypcja", w którym tworzony jest kanał, a wiadomości z niego są przekazywane klientom według subskrypcji.
Kluczowe zmiany w Redis 7.0:
- Dodano wsparcie dla funkcji wykonywanych po stronie serweraW przeciwieństwie do wcześniej obsługiwanych skryptów w języku Lua, funkcje nie są przypisane do aplikacji i mają na celu realizację dodatkowej logiki, rozszerzającej możliwości serwera. Funkcje są przetwarzane nieprzerwanie z danymi i związane z bazą danych, a nie z aplikacją, w tym replikowane i przechowywane w trwałym magazynie.
- Zaprezentowano drugą wersję ACL, która umożliwia zarządzanie dostępem do danych na podstawie kluczy i pozwala na definiowanie różnych zestawów reguł dostępu do poleceń z możliwością powiązania kilku selektorów (zestawów uprawnień) z każdym użytkownikiem. Każdy klucz może być powiązany z określonymi uprawnieniami, na przykład można ograniczyć dostęp tylko do odczytu lub zapisu konkretnego podzbioru kluczy.
- Zaproponowano działającą w klastrze sekcjonowaną (sharded) implementację paradygmatu publikacji i subskrypcji (Publish-Subscribe), w której wiadomość jest przesyłana do określonego węzła, do którego przypisany jest kanał wiadomości, a następnie ta wiadomość jest przesyłana do pozostałych węzłów wchodzących w skład sekcji (shard). Klienci mogą otrzymywać wiadomości przez subskrypcję kanału, zarówno łącząc się z głównym węzłem, jak i z wtórnymi węzłami sekcji. Zarządzanie odbywa się za pomocą poleceń SSUBSCRIBE, SUNSUBSCRIBE i SPUBLISH.
- Dodano wsparcie dla przetwarzania podpoleceń w większości kontekstów.
- Dodano nowe komendy:
- ZMPOP, BZMPOP.
- LMPOP, BLMPOP.
- SINTERCARD, ZINTERCARD.
- SPUBLISH, SSUBSCRIBE, SUNSUBSCRIBE, PUBSUB SHARDCHANNELS/SHARDNUMSUB.
- EXPIRETIME, PEXPIRETIME.
- EVAL_RO, EVALSHA_RO, SORT_RO.
- FUNCTION *, FCALL, FCALL_RO.
- COMMAND DOCS, COMMAND LIST.
- LATENCY HISTOGRAM.
- CLUSTER SHARDS, CLUSTER LINKS, CLUSTER DELSLOTSRANGE, CLUSTER ADDSLOTSRANGE.
- CLIENT NO-EVICT.
- ACL DRYRUN.
- Zaproponowano możliwość przetwarzania kilku konfiguracji w jednym wywołaniu CONFIG SET/GET.
- Do narzędzia redis-cli dodano opcje "—json", "-2", "—scan", "—functions-rdb".
- Domyślnie zablokowano dostęp klientom do ustawień i poleceń wpływających na bezpieczeństwo (na przykład zablokowano polecenia DEBUG i MODULE, zabroniono zmiany konfiguracji z flagą PROTECTED_CONFIG). W redis-cli zaprzestano zapisywania do pliku historii poleceń zawierających poufne dane.
- Wprowadzono szereg optymalizacji mających na celu zwiększenie wydajności i zmniejszenie zużycia pamięci. Na przykład, znacznie obniżono zużycie pamięci przy włączonym trybie klastra, podczas wykonywania operacji copy-on-write oraz przy pracy z haszami i kluczami zset. Udoskonalono logikę zapisywania danych na dysk (wywołanie fsync). Zredukowano liczbę pakietów sieciowych i wywołań systemowych podczas wysyłania odpowiedzi do klienta. Zwiększona efektywność replikacji.
- Usunięto lukę CVE-2022-24735 w środowisku do wykonywania skryptów Lua, która umożliwiała podmianę własnego kodu Lua i jego wykonanie w kontekście innego użytkownika, w tym takiego, który ma wyższe uprawnienia.
- Usunięto lukę CVE-2022-24736, która umożliwiała awaryjne zakończenie procesu redis-server w wyniku dereferencjonowania wskaźnika null. Atak polega na załadowaniu specjalnie przygotowanych skryptów Lua.
Źródło: opennet.ru
