Статии7 май 2023 г.7 мин четене
Redis: от просто key-value хранилище до универсално решение за база данни

Въведение:
Redis, in-memory хранилището на структури от данни, измина дълъг път от скромното си начало като просто key-value хранилище. То еволюира до гъвкаво и мощно решение за база данни, подходящо за широк кръг от приложения. В тази блог публикация ще се потопим в историята на Redis и ще разберем нарастващата му популярност като решение за кеширане. Ще разгледаме и новите модули, които издигнаха Redis на следващо ниво, превръщайки го в единствената база данни, от която се нуждаете.
История на Redis
Redis, съкращение от Remote Dictionary Server, е създаден през 2009 г. от Салваторе Санфилипо. Първоначално проектиран като просто key-value хранилище, Redis се развива през годините, за да поддържа по-сложни структури от данни и команди. Отвореният му код и дизайнът, фокусиран върху производителността, допринесоха за широкото му разпространение в различни индустрии.
Защо Redis стана толкова популярен като кеш
Redis придоби популярност като решение за кеширане поради факта, че работи в паметта, което позволява бързо извличане и съхранение на данни. Поддръжката му на различни структури от данни и атомарни операции го превърна в идеален избор за кеширане, управление на сесии, анализи в реално време и други.
Лесна инсталация, поддръжка и прости команди в Redis
Една от причините за широкото разпространение и популярност на Redis е лесната му инсталация и поддръжка, в съчетание с простотата на командите му.
Инсталация и настройка:
Redis е проектиран да бъде лек и лесен за инсталиране. Той поддържа различни платформи, включително Linux, macOS и Windows (чрез Windows Subsystem for Linux). Настройката на Redis включва само няколко стъпки:
- Изтеглете изходния код на Redis от официалния уебсайт или GitHub хранилището.
- Разархивирайте архива и отидете в разархивираната папка.
- Компилирайте изходния код с помощта на командата
make. - По желание изпълнете командата
make test, за да проверите правилната работа на сървъра. - Накрая, стартирайте сървъра на Redis, като изпълните командата
redis-server.
Redis също така предоставя Docker образи и може лесно да бъде разгърнат на облачни платформи като AWS, Google Cloud и Azure.
Поддръжка:
Redis е проектиран за минимални разходи по поддръжката. Неговите опции за персистентност (RDB и AOF) осигуряват трайност на данните без значителни спадове в производителността. Redis поддържа и master-slave репликация, която позволява резервираност на данните и висока достъпност. Redis Sentinel и Redis Cluster допълнително подобряват надеждността, като предоставят съответно възможности за автоматично превключване при отказ (failover) и шардинг.
Прости команди:
Командите на Redis са проектирани да бъдат прости, разбираеми за човека и лесни за използване. Командите следват последователен модел, като името на командата е последвано от ключа и всякакви допълнителни аргументи. Някои примери включват:
SET <key> <value>: Съхранява двойка ключ-стойност.GET <key>: Извлича стойността, свързана с даден ключ.HSET <key> <field> <value>: Задава двойка поле-стойност в хеш.SADD <key> <member>: Добавя член към множество.
Простотата и последователността на командите на Redis го правят лесен за научаване и използване, дори за разработчици с минимален опит с Redis.
Нови модули, които издигат Redis на следващо ниво
Въвеждането на модули разшири възможностите на Redis, правейки го подходящ за по-широк кръг от случаи на употреба. По-долу обсъждаме някои популярни модули на Redis, заедно с техните случаи на употреба и примерни команди.
JSON (ReJSON)
Случай на употреба: Съхраняване и манипулиране на JSON данни
Примерни команди:
-
JSON.SET <key> <path> <json-value> -
JSON.GET <key> [<path>]
Бизнес казус: Уебсайт за електронна търговия може да използва ReJSON за съхранение и управление на информация за продукти в JSON формат. Това им позволява лесно да съхраняват и актуализират атрибути на продуктите, като цена, описание и изображения, като същевременно осигуряват бързо извличане при потребителски заявки.
Redis Search (RediSearch)
Случай на употреба: Пълнотекстово търсене и индексиране
Примерни команди:
-
FT.CREATE <index> SCHEMA <field> [TEXT|NUMERIC|GEO] ... -
FT.SEARCH <index> <query>
Бизнес казус: Платформа за търсене на работа може да използва RediSearch за индексиране и търсене на обяви за работа въз основа на различни критерии като длъжност, име на компания, местоположение и необходими умения. Това позволява на потребителите бързо да намират релевантни обяви за работа въз основа на своите заявки за търсене.
Bloom Filters (RedisBloom)
Случай на употреба: Вероятностна структура от данни за проверка на принадлежност
Примерни команди:
-
BF.ADD <key> <item> -
BF.EXISTS <key> <item>
Бизнес казус: Система за препоръчване на съдържание може да използва RedisBloom, за да проверява ефективно дали даден потребител вече е виждал определена статия или видео. Като избягва дублиращи се препоръки, системата може да подобри потребителското изживяване и да увеличи ангажираността.
Streams
Случай на употреба: Обработка на данни и предаване на съобщения в реално време
Примерни команди:
-
XADD <key> * <field> <value> ... -
XREAD COUNT <count> STREAMS <key> <ID>
Бизнес казус: Логистична компания може да използва Redis Streams, за да проследява и управлява в реално време местоположението на своите превозни средства за доставка. Това ѝ позволява да следи състоянието на превозните средства, да оптимизира маршрутите и да предоставя точни прогнози за доставка на своите клиенти.
Graph (RedisGraph)
Случай на употреба: Графова база данни за съхранение и заявки към свързани данни
Примерни команди:
-
GRAPH.QUERY <key> <query> -
GRAPH.DELETE <key>
Бизнес казус: Платформа за социална мрежа може да използва RedisGraph за съхранение и анализ на взаимоотношенията между потребителите, като приятели и последователи. Като отправя ефективни заявки към тези свързани данни, платформата може да предлага персонализирано съдържание и предложения за приятели, за да подобри ангажираността на потребителите.
TimeSeries (RedisTimeSeries)
Случай на употреба: Съхранение и заявки към времеви редове от данни (time-series)
Примерни команди:
-
TS.ADD <key> <timestamp> <value> [RETENTION <milliseconds>] -
TS.RANGE <key> <start-timestamp> <end-timestamp>
Бизнес казус: Платформа за търговия с акции може да използва RedisTimeSeries за съхранение и анализ на исторически цени на акции, което позволява на потребителите да достъпват ценови графики и да извършват технически анализ. Това помага на инвеститорите да вземат информирани решения и да следят представянето на портфолиото си.
Използване на Lua скриптове в Redis:
За да изпълните Lua скрипт в Redis, използвайте командата EVAL или EVALSHA, последвана от самия скрипт (или неговия SHA1 хеш), броя на включените ключове и всякакви допълнителни аргументи, необходими на скрипта. Ето един пример:
EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 mykey myvalue
В този пример Lua скриптът задава двойка ключ-стойност, използвайки вградената функция redis.call(). Таблиците KEYS и ARGV се използват за достъп до предоставените съответно ключове и аргументи.
За да заредите и изпълните Lua скрипт, съхранен във файл, използвайте следния модел:
redis-cli --eval /path/to/script.lua , key1 key2 arg1 arg2
В този случай ключовете и аргументите се подават като списък, разделен със запетаи, след пътя до файла със скрипта.
Lua скриптовете в Redis предлагат на разработчиците мощен и гъвкав начин да разширят функционалността на Redis и да оптимизират производителността на своите приложения. Чрез създаване на персонализирани команди и възползване от обработката от страна на сървъра, Lua скриптовете подобряват възможностите на Redis и го правят още по-гъвкав и незаменим инструмент в съвременната разработка на софтуер.
RedisGears: Усъвършенстван serverless енджин за Redis
RedisGears е динамична serverless рамка, която позволява на разработчиците да изпълняват персонализирани функции и задачи за обработка на данни директно в сървъра на Redis. Тя предоставя мощен и гъвкав начин за разширяване на функционалността на Redis, оптимизиране на производителността и опростяване на логиката на приложението.
Ключови характеристики на RedisGears:
- Програмируем енджин: RedisGears позволява на разработчиците да пишат персонализирани функции на Python, които могат да се изпълняват от страна на сървъра, елиминирайки нуждата от сложна логика от страна на клиента или допълнителни системи за обработка.
- Обработка, управлявана от събития: RedisGears поддържа обработка, управлявана от събития, което позволява на разработчиците да изпълняват функции в отговор на конкретни събития, като актуализации или изтичане на ключове. Това позволява обработка на данни в реално време и ефективна обработка на потоци от данни.
- Разпределено изпълнение: С RedisGears разработчиците могат да изпълняват функции върху множество Redis възли, което го прави подходящ за задачи за разпределена обработка на данни в клъстеризирани среди.
- Разширена обработка на данни: RedisGears предоставя вградена поддръжка за сложни задачи за обработка на данни, като филтриране, съпоставяне (mapping), редуциране и групиране на данни, което го прави идеално решение за анализ и трансформация на данни.
Използване на RedisGears:
За да започнете работа с RedisGears, трябва да инсталирате модула RedisGears на вашия Redis сървър. Веднъж инсталиран, можете да използвате командата RG.PYEXECUTE, за да изпълнявате Python скриптове директно в Redis. Ето един пример:
RG.PYEXECUTE "def my_function(x): return x['key'] * x['value']; GearsBuilder('KeysReader').map(my_function).register()"
RedisGears също така поддържа регистриране на функции като „слушатели“ на събития (event listeners), което ви позволява да задействате персонализирана логика в отговор на конкретни събития:
RG.PYEXECUTE "def on_key_change(x): <your_logic_here>; GearsBuilder('KeysReader').foreach(on_key_change).register(eventTypes=['set'])"
В този пример функцията on_key_change е регистрирана като „слушател“ на събития, който ще се задейства всеки път, когато в базата данни бъде зададен ключ.
RedisGears е мощно и гъвкаво допълнение към Redis, което позволява на разработчиците да изпълняват персонализирани функции от страна на сървъра, да извършват разширени задачи за обработка на данни и да се справят с потоци от данни в реално време с лекота. Възползвайки се от силата на RedisGears, разработчиците могат да изграждат по-ефективни и мащабируеми приложения, като същевременно опростяват цялостната си архитектура.
Заключение:
Redis еволюира от просто key-value хранилище до цялостно решение за база данни. С въвеждането на модули, Redis вече може да се справя с голямо разнообразие от случаи на употреба, включително съхранение на JSON, пълнотекстово търсене, bloom филтри, потоци, графови бази данни и времеви редове от данни. Гъвкавостта и производителността му правят Redis незаменим инструмент в съвременната разработка на софтуер.