Redis ( / ˈ r ɛ d ɪ s / ; [6] [7] Remote Dictionary Server ) [ 6] — это хранилище в памяти с открытым исходным кодом , используемое в качестве распределенной базы данных «ключ-значение» в памяти , кеша и сообщений. брокер , с дополнительной долговечностью . [8] Поскольку Redis хранит все данные в памяти и благодаря своей конструкции, он обеспечивает чтение и запись с малой задержкой , что делает его особенно подходящим для случаев использования, требующих кэша. Redis — самая популярная база данных NoSQL [9] [10] [11] и одна из самых популярных баз данных в целом. [12] Redis используется в таких компаниях, как Twitter , [13] [14] Airbnb , [15] Tinder , [16] Yahoo , [17] Adobe , [18] Hulu , [19] Amazon [20] и OpenAI . [21]
Redis поддерживает различные виды абстрактных структур данных , такие как строки , списки , карты , наборы , отсортированные наборы, HyperLogLogs , растровые изображения , потоки и пространственные индексы .
Проект разрабатывался и поддерживался Сальваторе Санфилиппо, начиная с 2009 года. [22] С 2015 по 2020 год он возглавлял основную команду проекта, спонсируемую Redis Labs . [23] Сальваторе Санфилиппо покинул Redis в качестве сопровождающего в 2020 году. [24] В 2021 году Redis Labs исключила название Labs из своего названия и теперь известна просто как «Redis». [25]
Redis выпускается под лицензией BSD с тремя пунктами . [5]
Имя Redis означает сервер удаленного словаря. [6] Проект Redis начался, когда Сальваторе Санфилиппо по прозвищу antirez , первоначальный разработчик Redis, пытался улучшить масштабируемость своего итальянского стартапа, разрабатывая анализатор веб-журналов в реальном времени . Столкнувшись со значительными проблемами при масштабировании некоторых типов рабочих нагрузок с использованием традиционных систем баз данных, Санфилиппо в 2009 году начал создавать прототип первой экспериментальной версии Redis на Tcl . [26] Позже Санфилиппо перевел этот прототип на язык C и реализовал первый тип данных — список. После нескольких недель успешного внутреннего использования проекта Санфилиппо решил открыть его исходный код, объявив о проекте на Hacker News . Проект начал набирать обороты, особенно среди сообщества Ruby: GitHub и Instagram стали одними из первых компаний, принявших его. [27] [28]
Санфилиппо был принят на работу в VMware в марте 2010 года. [29] [30] [31]
В мае 2013 года спонсором Redis выступила Pivotal Software (дочерняя компания VMware). [32]
В июне 2015 года спонсором разработки стала Redis Labs . [33]
В октябре 2018 года был выпущен Redis 5.0, в котором представлен Redis Stream — новая структура данных, которая позволяет хранить несколько полей и строковых значений с автоматической временной последовательностью по одному ключу. [34]
В июне 2020 года Сальваторе Санфилиппо ушел с поста единственного сопровождающего Redis. Санфилиппо сменили Йоси Готлиб и Оран Агра. [35] [36]
Redis популяризировал идею системы, которую можно считать хранилищем и кэшем одновременно . Он был спроектирован так, чтобы данные всегда модифицировались и считывались из основной памяти компьютера, но также сохранялись на диске в формате, непригодном для произвольного доступа к данным. Отформатированные данные восстанавливаются в памяти только после перезагрузки системы.
Redis также предоставляет модель данных, которая очень необычна по сравнению с системой управления реляционными базами данных (СУБД). Пользовательские команды описывают не запрос, который должен выполнить механизм базы данных, а скорее конкретные операции, которые выполняются над заданными абстрактными типами данных. Поэтому данные должны храниться таким образом, чтобы их можно было впоследствии быстро извлечь. Поиск осуществляется без помощи системы базы данных в форме вторичных индексов, агрегатов или других общих функций традиционных СУБД. Реализация Redis активно использует системный вызов fork для дублирования процесса, содержащего данные, так что родительский процесс продолжает обслуживать клиентов, пока дочерний процесс записывает данные в памяти на диск.
Согласно ежемесячным рейтингам DB-Engines , Redis часто является самой популярной базой данных «ключ-значение» . [9] Redis также был признан базой данных NoSQL №4 по удовлетворенности пользователей и присутствию на рынке на основе отзывов пользователей, [37] самой популярной базой данных NoSQL в контейнерах, [38] и хранилищем данных №4 2019 года по рейтингу веб-сайтов stackshare. .io. [39] Эта база данных была признана самой любимой базой данных в опросе разработчиков Stack Overflow в 2017, 2018, 2019, 2020 и 2021 годах. [40]
Начиная с версии 2.6, Redis поддерживает серверные сценарии на языке Lua . [41]
Многие языки программирования имеют привязки к языку Redis на стороне клиента, в том числе: [42] ActionScript , C , C++ , C# , Chicken , Clojure , Common Lisp , Crystal , D , Dart , Delphi , [43] Elixir , Erlang , Go , Haskell. , Haxe , Io , Java , Nim , JavaScript ( Node.js ), Julia , Lua , Objective-C , OCaml , Perl , PHP , Pure Data , Python , R , [44] Racket , Ruby , Rust , Scala , Smalltalk , Swift и Tcl . На этих языках существует несколько клиентских программ. [42]
Redis сопоставляет ключи с типами значений. Важным отличием Redis от других структурированных систем хранения является то, что Redis поддерживает не только строки , но и абстрактные типы данных:
Тип значения определяет, какие операции (называемые командами) доступны для этого значения. Redis поддерживает высокоуровневые атомарные операции на стороне сервера, такие как пересечение, объединение и различие между наборами, а также сортировку списков, наборов и отсортированных наборов.
На основе API модулей Redis поддерживается больше типов данных. Обратите внимание, что некоторые из них имеют двойную лицензию и не соответствуют пункту BSD 3: [46]
Предыдущие реализации включают в себя:
Redis обычно хранит весь набор данных в памяти. Версии до 2.4 можно настроить на использование так называемой виртуальной памяти [56] , в которой часть набора данных хранится на диске, но эта функция устарела. Сохранение в Redis может быть достигнуто двумя разными методами. Во-первых, путем создания моментальных снимков, когда набор данных асинхронно переносится из памяти на диск через регулярные промежутки времени в виде двоичного дампа, используя формат файла дампа Redis RDB. В качестве альтернативы можно использовать журналирование , при котором запись каждой операции, изменяющей набор данных, добавляется в файл, доступный только для добавления (AOF), в фоновом процессе. Redis может перезаписать файл, предназначенный только для добавления, в фоновом режиме, чтобы избежать неопределенного роста журнала. Ведение журнала было введено в версии 1.1 и обычно считается более безопасным подходом.
По умолчанию Redis записывает данные в файловую систему не реже, чем каждые 2 секунды, при необходимости доступны более или менее надежные параметры. В случае полного сбоя системы при настройках по умолчанию будет потеряно всего несколько секунд данных.
Redis поддерживает репликацию мастер-реплика . Данные с любого сервера Redis могут реплицироваться на любое количество реплик. Реплика может быть главной для другой реплики. Это позволяет Redis реализовать однокорневое дерево репликации. Реплики Redis можно настроить на прием операций записи, допуская преднамеренные и непреднамеренные несогласованности между экземплярами. Функция публикации -подписки полностью реализована, поэтому клиент реплики может подписаться на канал и получать полный поток сообщений, опубликованных мастеру, в любом месте дерева репликации. Репликация полезна для масштабирования чтения (но не записи) или избыточности данных. [57]
Когда надежность данных не требуется, Redis, хранящийся в памяти, позволяет ему работать лучше по сравнению с системами баз данных, которые записывают каждое изменение на диск, прежде чем считать транзакцию зафиксированной. [6] Redis работает как единый процесс и может быть однопоточным или двухпоточным при перезаписи AOF (файла, доступного только для добавления). [58] Таким образом, один экземпляр Redis не может использовать параллельное выполнение таких задач, как хранимые процедуры .
Redis представил кластеризацию в апреле 2015 года с выпуском версии 3.0. [59] Спецификация кластера реализует подмножество команд Redis: доступны все одноклавишные команды, многоклавишные операции (команды, связанные с объединениями и пересечениями) ограничены ключами, принадлежащими одному и тому же узлу, а также команды, связанные с операциями выбора базы данных. недоступны. [60] Кластер Redis может масштабироваться до 1000 узлов, достигать «приемлемой» безопасности записи и продолжать работу в случае сбоя некоторых узлов. [61] [62]
Из-за особенностей конструкции базы данных типичными вариантами использования являются кэширование сеансов, полностраничное кэширование, приложения очередей сообщений, списки лидеров и подсчет других. [63] Парадигма обмена сообщениями «публикация-подписка» обеспечивает связь между серверами в режиме реального времени.
Amazon Web Services предлагает управляемый сервис Redis под названием ElastiCache для Redis, Google предлагает управляемый сервис Redis под названием Cloud Memorystore, [64] Microsoft предлагает Azure Cache для Redis в Azure , [65] а Alibaba предлагает ApsaraDB для Redis в Alibaba Cloud . [66]
Redis используется в таких компаниях, как Twitter, [13] [14] [67] AirBnB, [15] Tinder, [16] Yahoo, [17] Adobe, [18] Hulu, [19] и Amazon. [20]
Redis написан на ANSI C и работает в большинстве систем POSIX, таких как Linux, *BSD, OS X, без внешних зависимостей.