Redis

Кратко въведение 

Redis, познат още като Remote Dictionary Server (отдалечен сървър за речници), е хранилище за бази данни от тип ключ-стойност (key/value) в паметта (in-memory) с отворен код. То съхранява данните в паметта на сървъра, а не на твърди дискове и SSD устройства. 

Използва се главно като кеш за приложения или бърза база данни, като основната цел на кеширането е да се ускорят процесите, вместо винаги да се прави обръщение към първоизточника. 

Redis предоставя структури от данни като низове (strings), хешове (hashes), списъци (lists), множества (sets), сортирани множества със заявки за диапазони (sorted sets with range queries), битови карти (bitmaps), геопространствени индекси (geospatial indexes) и потоци (streams).

Освен това разполага с вградена репликация, скриптове на Lua (Lua-scripting), изтласкване на базата на LRU (LRU eviction), транзакции и различни нива на устойчивост на диска (on-disk persistence) и осигурява висока наличност чрез Redis-Sentinel и автоматично разделяне (partitioning) чрез Redis Cluster. Всички тези функции, разбира се, ще бъдат разгледани по-нататък в тази статия.

Как работи?
Redis действа като кеширащ слой между базата данни и клиента, за да ускори достъпа до данните и да намали натоварването върху основната база данни. Когато даден клиент заяви данни, API шлюзът (API Gateway) препраща заявката към Redis (кеша), за да провери дали исканите данни вече са налични. По този начин се обработват заявките.

Redis използва еднонишков (single-thread) работен процес, за да гарантира, че всяка задача се обработва по възможно най-безупречния и ефективен начин. Еднонишковият подход прави дизайна по-прост и гарантира, че командите се изпълняват последователно без усложненията от управлението на множество нишки и потенциалните проблеми със синхронизацията. Тази простота също така допринася за минимизиране на пропуските в кеша (cache misses) и оптимизиране на производителността. Попадение в кеша (Cache Hit) е когато исканите данни са намерени в Redis и веднага се връщат на клиента; това значително подобрява времето за реакция. Пропуск в кеша (Cache Miss) е когато данните не са налични в Redis и заявката се препраща към основната база данни, след което базата данни обработва заявката и връща необходимите данни на приложението.

Сега да представим по-подробно Redis-Sentinel и Redis Cluster, споменати по-горе:

Redis-Sentinel е самостоятелна разпределена система, която позволява на разработчиците да калибрират своите инстанции така, че да бъдат високодостъпни за клиентите. Sentinel използва серия от процеси за мониторинг, известия и автоматично превключване при отказ (automatic failover), за да информира потребителите, когато има проблем с инстанциите от тип "главен-работник" (master-worker), като същевременно автоматично преконфигурира новите връзки за приложенията, когато е необходимо. 

Redis Cluster е разпределена имплементация на Redis, която автоматично разделя наборите от данни между множество възли (nodes). Това подпомага по-високата производителност и мащабируемост.

Redis Pub/Sub 

Поддържа използването на команди за публикуване и абониране (publish/subscribe), чрез които потребителите могат да проектират високопроизводителни услуги за чат и съобщения във всички свои приложения и услуги. Това включва възможността за използване на структури от данни тип списък, както и изпълнението на атомарни операции и възможности за блокиране.

Устойчивост на данните в Redis (Redis Persistence) 

Redis използва постоянно (persistent) дисково хранилище, за да преодолее прекъсвания на електрозахранването, сривове на сървъра, тесни места (bottlenecks), рестартирания или изключвания. Това се случва чрез правене на редовни снимки (snapshots) на данните и добавянето към тях на промените, когато станат налични. Redis може да бъде конфигуриран да генерира тези резервни копия на базата данни при поискване или на автоматични интервали, за да се гарантира дълготрайността и целостта на базата данни. 

Трите основни метода за устойчивост са RDB (Redis database backup - резервно копие на базата данни на Redis, което е описано по-горе), но се използват и два други метода, а именно AOF (append-only file - файл само за добавяне), който записва всяка операция за запис във файл, който може да бъде възпроизведен за възстановяване на набора от данни; и не на последно място, хибридният метод, който комбинира RDB и AOF, за да ви даде скоростта на снимките (snapshots) и безопасността на записването (logging) на всяка промяна.

Когато Redis се рестартира след повреда, той зарежда последно запазените данни от постоянното хранилище обратно в паметта. Това гарантира, че данните не са загубени и последното известно състояние е възстановено. 

Репликация в Redis

Репликацията е процес на създаване на множество копия (реплики) на едни и същи данни, за да се гарантира наличност и безопасност. По подразбиране Redis използва асинхронна репликация – данните първо се записват на главен (Master/Primary) сървър или възел, а по-късно се копират в така наречените възли-реплики (replica nodes), които обработват заявките за четене от потребителите на базата данни. Това отново гарантира висока производителност, но носи и риск от загуба на данни, ако възелът се срине преди репликацията да е завършила. За да намали тези рискове, Redis позволява опционален синхронен сценарий, при който данните се копират в главния възел и репликите едновременно чрез командата wait (изчакване).

Политики за изтласкване (Eviction Policies)

Когато паметта на Redis се изчерпи, той трябва да реши кои данни да премахне, за да освободи място, и тук на помощ идват политиките за изтласкване. Redis ви позволява да избирате от различни политики за изтласкване, както следва:


LRU (Least recently used) – първо премахва ключовете, до които е осъществяван достъп най-отдавна. 

LFU (Least frequently used) – премахва елементите, които са използвани най-рядко.

TTL (time-to-live) – автоматично изтрива данни, чийто срок на валидност е изтекъл.

Random (Случайно) – случайно изтласкване на ключове, когато паметта е пълна.

Предимства 

Едно от най-изявените предимства на Redis е неговата висока скорост.
За разлика от традиционните бази данни, които съхраняват данните на диск, Redis кешира всичко в RAM паметта, което позволява четене и запис на данни за наносекунди, правейки платформата много по-бърза от базите данни, разчитащи на твърди дискове или SSD устройства. 

Друго ключово предимство е неговият удобен за потребителя интерфейс; той е относително лесен за настройка и усвояване, дори за разработчици, които са нови в NoSQL базите данни. 

Към предимствата му се добавя и гъвкавостта на структурите от данни. За разлика от простите хранилища от тип ключ-данни, Redis поддържа над 20 типа данни, които споменахме в началото на тази статия. Нещо повече, благодарение на вградената поддръжка за скриптове на Lua (Lua-scripting), той позволява на разработчиците да изпълняват персонализиран код директно в сървъра на Redis. 

Вместо да изпращате множество команди към Redis и да чакате изпълнението на всяка една от тях, можете да групирате няколко команди в един потребителски скрипт на Lua и да ги изпълните всички наведнъж; това прави работата по-бърза и по-ефективна. 

Както може би се досещате, Redis е подкрепен от силна общност с отворен код, която непрекъснато отстранява програмни грешки (bugs) и внедрява нови функции, както и надгражда версии и обогатява библиотеки, рамки (frameworks) и плъгини, които подобряват неговите възможности и улесняват интеграцията с други технологии.

Недостатъци 

Както всеки друг продукт, Redis също има няколко недостатъка, които ще коментираме накратко по-долу. 

Redis не е идеален за съхранение на големи обеми данни; въпреки че начинът му на съхранение допринася за скоростта, 

той не помага за поемане на по-голям обем натоварване (load). Използвайки Redis, трябва също да вземете предвид, че RAM паметта е значително по-скъпа от дисковото хранилище, което означава, че използването на Redis за големи набори от данни може да бъде доста скъпо, особено при мащабиране. Ако представлявате компания, която съхранява и обработва терабайти данни,
трябва да сте готови да направите значителна инвестиция, когато работите с Redis.

Друго известно ограничение е, че Redis не управлява автоматично данните, както правят повечето релационни бази данни. Разработчиците трябва ръчно да конфигурират политиките за изтласкване, за да решат какво се случва, когато паметта се напълни. Въпреки това, този недостатък се решава, след като преминете към Redis Cloud, тъй като това е напълно управлявана (fully-managed) услуга на Redis.

И накрая, Redis е податлив на ограничения на паметта и загуба на данни. Вече обяснихме, че за разлика от базите данни, базирани на дискове, където данните се записват в постоянно хранилище незабавно, Redis съхранява всичко в RAM паметта, което означава, че ако даден сървър се срине, всички данни могат да бъдат загубени. Въпреки опциите за устойчивост като RDB и AOF, които помагат за намаляване на риска, те не са напълно защитени от грешки (foolproof). Например, ако Redis бъде изключен между направата на RDB снимка (snapshooting) и записа, всички промени от последното резервно копие насам ще бъдат загубени.

В заключение, Redis е отличен инструмент за кеширане на уеб страници и намаляване на натоварването на сървъра, и разполага с функции, които могат да се използват за създаване на мощни разпределени приложения. Той е бърз, мащабируем и поддържа усъвършенствани функции, както бе споменато по-горе – скриптове на Lua, Pub/Sub функции и други. Дори и със споменатите недостатъци, Redis продължава да бъде предпочитан инструмент сред разработчиците, начинаещите и софтуерните ентусиасти.

Основни изводи

  • Redis е хранилище за данни в паметта (in-memory) от тип ключ-стойност с отворен код, използвано главно като кеширащ слой за подобряване на производителността на приложенията и намаляване на натоварването на базата данни.
  • Работи чрез обработка на клиентски заявки чрез попадения (hits) и пропуски (misses) в кеша, използвайки еднонишков модел за последователно и ефективно изпълнение на команди.
  • Redis поддържа широк спектър от структури от данни и функции, включително репликация, устойчивост (RDB, AOF, хибридна), Pub/Sub съобщения и скриптове, което го прави гъвкав за различни случаи на употреба.
  • Мащабируемостта и наличността се осигуряват чрез Redis Sentinel и Redis Cluster, позволявайки мониторинг, превключване при отказ (failover) и разпределено управление на данни между възлите.
  • Въпреки че Redis предлага скорост и гъвкавост, той има и ограничения като изисквания за ръчна конфигурация и потенциални рискове от загуба на данни, ако устойчивостта (persistence) не се управлява правилно.

Адрес

Улица Слънце 3, Велико Търново, България

Контакти

Въведете име
Въведете фамилия
Въведете имейл
Невалиден имейл
Въведете съобщение