Ali P7, сторона 2: Redis выполняет Lua, может ли он гарантировать атомарность?
Ali P7, сторона 2: Redis выполняет Lua, может ли он гарантировать атомарность?

Привет,ядаобезьяна Ява

Redis и Lua, два общих золотых партнера в реальной разработке, часто появляются в технических интервью. Итак, может ли Redis гарантировать атомарность при выполнении Lua? Давайте поговорим сегодня. 

1. Атомность

Прежде чем ответить на вопрос, похоже, нам необходимо по-новому понять понятие «атомарности». Поэтому первое, что нам нужно проанализировать, — это понятие атомарности.

Атомарность реляционных баз данных

Вообще говоря, атомарность, о которой мы говорим, относится к атомарности реляционной базы данных RDBMS (например, MySQL), которая является атрибутом атомарности в ACID (атомарность, согласованность, изоляция, долговечность).

изамарность в ACID относится к да: дела изиметь операции либо все изучают успешно, либо все терпят неудачу и откатываются назад.

Вот реальный пример банковского перевода, объясняющий атомарность: Счет А переводит 100 юаней на счет Б. Атомарность означает, что когда счет А вычитает 100 юаней, счет Б должен увеличиться на 100 юаней. Если счет А уменьшается на 100 юаней, счет Б. Если увеличения на 100 юаней нет, операция не является атомарной и ее необходимо откатить, чтобы добавить обратно 100 юаней, уменьшенные на счет А. Код Java реализован следующим образом:

картина
картина

атомарность Lua

Если вы хотите узнать атомарность Lua, вы должны сначала понять, что такое Lua. Следующая картинка взята из официального описания Lua:

what's lua
what's lua

Lua — мощный, эффективный, легкий, встраиваемый язык сценариев. Он поддерживает процедурное программирование, объектно-ориентированное программирование, функциональное программирование, программирование, управляемое данными, и описание данных. Lua сочетает в себе простой процедурный синтаксис с мощными структурами описания данных, основанными на ассоциативных массивах и расширяемой семантике. Lua является динамически типизированным, работает путем интерпретации байт-кода с использованием виртуальной машины на основе регистров и обеспечивает автоматическое управление памятью и инкрементную сборку мусора, что делает его идеальным для настройки, написания сценариев и быстрого прототипирования.

Lua сам по себе не обеспечивает прямой поддержки атомарности. Это просто язык сценариев, который обычно встраивается в другие хост-программы для запуска, такие как Redis.

В Redis атомарность выполнения сценариев Lua означает, что весь сценарий Lua не будет прерываться командами других клиентов во время выполнения.

Чтобы лучше понять атомарность Redis, выполняющего Lua, вот пример трех команд, которые необходимо выполнить в сценарии Lua: `SET key1 value1`, `INCRBY key2 value2` и `SET key3 value3`:

картина
картина

В приведенном выше примере весь luaScript Строковый скрипт в целом изучается и не прерывается другими делами, что является атомарной операцией.

Хорошо, давайте подытожим концептуальные различия между атомарностью ACID и атомарностью Redis, выполняющего сценарии Lua:

  • ACIDизатомарностьдаобратитесь к:Заказ Либо всеосуществлять,Либо все Нет частиосуществлять;
  • Выполнить в Redis Атомарностьда Lua-скрипта означает: Lua-скрипт должен работать как единое целое и не прерываться другими делами, что касается Luaвнутри сценарияиз Заказда Нет, должно все получиться,или все не получится,Не требуется. об этом,существование Содержимое ниже будет объяснено подробно;

2. Редис дела

существуют. Анализируя концепцию атомарности, мы можем обнаружить, что «амарность» на самом деле является характеристикой дадела, поэтому давайте проанализируем ее дальше. Редисиздела – это само собой разумеющееся. Изображение ниже да Официальное описание делаиз резюме Redis:

картина
картина

Документ выглядит очень длинным, но его можно резюмировать одним предложением: Redis делапозволятьосуществлятьпартия Заказ,проходитьосуществлять MULTIЗаказвключатьдела,осуществлять EXECЗаказ Заканчиватьдела,WATCH и DISCARD Вместе с деломиспользовать это обеспечивает CAS(check-and-set) Оптимистичный запорный механизм. СМОТРЕТЬ для мониторинга Ключ, если его контролировать Если какой-либо из Кейиметь изменится, дела будут прерваны (дела пассивно закрыты), а DISCARD Используется для активного прекращения дел.

команда MULTI/EXEC

Используйте пример, чтобы понять MULTI/EXEC:

картина
картина

проходитьосуществлятьиз Результаты можно увидеть:Redisизделадак Команда MULTI позволяет Команда EXEC завершается. В течение этого периода все команды сначала попадают в очередь и только выполняются. При выполнении команды EXEC все команды в очереди будут выполняться последовательно, и будет возвращен массив всех результатов выполнения команд, включая информацию об ошибках выполнения команд.

Следует отметить, что: в EXEC После изучения, даже если очередь дел иметь Заказосуществлять не удалась, другие Заказы в очереди будут обработаны, Redis Выполнение этих команд не будет остановлено.

DISCARD и WATCH Слишком Redis Используется в делаиз двух заказов, они связаны с MULTI и EXEC Вместе они обеспечивают более сложный механизм обработки.

команда СМОТРЕТЬ

команда СМОТРЕТЬдля Диптихиодин или несколько Key,еслисуществоватьосуществлятьдела во время этих Любой ключ в ключе Если значение будет изменено другим делом, все текущие дела будут прерваны. (Примечание: ниже 6.0.9 из Redis версия, срок действия ключа не прерывается (дела)

Пример ниже: дела1 watch key1 ключ2, измененный во время дела2существоватьдела1осуществлять key2 = 10,когдадела1осуществляют При выполнении команды exec, поскольку смотреть мониторы ключ2 был изменен другими делами (дела2) (значение=10) , Таким образом, дела1 отменяются, а все изаметь Заказ в очереди дел очищаются, т.е. `set key1 value1` и `incrby key 2`два Заказ Ни одиносуществлять,key2из значение по-прежнему равно 10;

дела1

дела2

watch key1 key2

multi

set key1 value1

incrby key2 2

set key2 10

exec

ключи * // Только ключ2=10

ключи * // Только ключ2=10

картина
картина

Команда ОТМЕНИТЬ

Команда ОТМЕНИТЬдля прерываниядела。

В следующем примере выполните После DISCARD Заказа текущие дела прекращаются, поэтому изучите EXEC «ERR» будет сообщено, когда EXEC without МУЛЬТИ" ошибка.

картина
картина

деласерединаизError

В делах есть два основных типа ошибок:

  1. Произошла ошибка до того, как дела Заказ попал в очередь дел. Например,Синтаксическая ошибка заказа (ошибка параметра, ошибка имени заказа и т. д.),Или это может спасти некоторые ключевые ситуации.,Например, недостаточно памяти. Пример, как показано ниже,Заказ`incr key2 1/0` существование сообщило об ошибке перед входом в очередь дел, поэтому текущие дела были прерваны, изучить EXEC Заказ сообщит об ошибке:
картина
картина
  1. вызов EXEC После Заказа очередь дел из Заказосуществлять не удалась. Например, добавьте 1 к строковому значению. В качестве примера ниже, keyiz значениеда строка, когда пара key Выполните `incr key` Во время операции произошла ошибка, поэтому статью Заказосуществлять не удалось:
картина
картина

делаоткат

Redis не поддерживает откат.Официальное описание следующее:

картина
картина

Redis Откат дела не поддерживается, поскольку поддержка отката приведет к Redis Простота и производительность имеют большое значение.

Официальное описание краткое и лаконичное. На самом деле, вы можете понять его, если вдумаетесь: «Редис». да "REmote DIctionary Server" Аббревиатура, переводится как «удаленная словарная служба», первоначальная цель разработки изда заключалась в кэшировании, быстром и эффективном обеспечении. и понял ACIDделаиз Друзья должны быть в состоянии понятьделаоткатизсложность,поэтому,Кажется разумным, что Redis не поддерживает откат дел.

В этом плане мы тоже правы Redisдела сделать резюме: Redisиздела от MULTI/EXEC Две команды выполнены: WATCH/DISCARD. Два благословения Заказиз, Дават Redisдела обеспечивает CAS Оптимистичный запорный механизм. Редис дела не поддерживает откат, это и реляционная база данных (например, MySQL) издела (ACID) да это не то же самое из.

3. Редис Как выполнить Lua?

Завершен анализ атомарности После этих теоретических знаний о делах Redis нам нужно попрактиковаться и увидеть Redisда Как выполнить Luaиз。

Обычно Redis выполняет LuaОбычно используетсяизметодиметь 2 типа:

  1. Родной заказ, такой как ЭВАЛ/ЭВАЛШАЗаказ и др.;
  2. инструменты программирования,Например, на языках программирования предоставляются сторонние наборы инструментов или библиотеки классов;

Письмо При написании Lua-скриптов необходимо обращать внимание на различие redis.call() и redis.pcall() два Заказизиспользовать。

EVAL

грамматика:

Язык кода:javascript
копировать
EVAL script numkeys [key [key ...]] [arg [arg ...]]

Синтаксис EVAL очень прост, EVAL script numkeys да Обязательное поле, [ключ [key ...]] [arg [arg ...]]да необязательно.

На следующих снимках экрана показано, что ключ не передан, а ключ передан. 1 ключ и 2 key 3 сценария:

картина
картина

Пример ниже показывает [key [key ...]] [arg [arg ...]] и ошибку сообщения об ошибке numkeys из сценария:

картина
картина

redis.call()

redis.call() используется для выполнения Redisиз Заказ。когда Заказосуществлять Когда возникает ошибка,Заблокирую весь скрипт изучаю,И верните сообщение об ошибке клиенту Дават.

Следующий пример: если выполнение `INCRBY key2 1/0` завершается неудачей, будет выдано исключение и последующий процесс будет заблокирован, то есть `SET key3 value3` не будет выполнен.

Примеры выполнения собственных команд Redis:

Язык кода:javascript
копировать
# Redis Lua callEVAL "redis.call('SET', 'key1', 'value1'); redis.call('INCRBY', 'key2', 1/0); redis.call('SET', 'key3', 'value3')" 0
картина
картина

Пример использования платформы Jedis для выполнения Lua выглядит следующим образом:

картина
картина

Проверять Каждое значение ключа после Luaосуществлять, скриншот следующий:

картина
картина

redis.pcall()

redis.pcall() такжеиспользуется для выполнения Redisиз Заказ。когда Заказосуществлять Когда возникает ошибка,Не блокирует скрипты изосуществовать,И да внутренне ловит ошибку,И продолжаем изучать последующие из Заказ.

Следующий пример: если выполнение INCRBY key2 1/0 завершается неудачей, исключение не создается, и последующий процесс продолжает выполняться, то есть также выполняется `SET key3 value3`.

Пример выполнения собственной команды Redis:

Язык кода:javascript
копировать
# Redis Lua pcallEVAL "redis.pcall('SET', 'key1', 'value1'); redis.pcall('INCRBY', 'key2', 1/0); redis.pcall('SET', 'key3', 'value3')" 0
картина
картина

Выполните пример Lua с использованием платформы Jedis:

картина
картина

для Луа redis.call() и redis.pcall() О том, как выбирать, нужно судить, исходя из реального бизнеса. Стандарт да: когда. Когда в сценарии Lua возникает определенная ошибка, нужно ли блокировать последующую ошибку?

4. Как обеспечить атомарность?

Redisдатипичныйиз C/S(Client/Server) Модель, как показано ниже:

картина
картина

здесь с Автономное развертывание Redis — это пример, объясняющий, как обеспечить атомарность. Когда клиент отправляет сообщение серверу с Lua Когда скрипт будет запрошен, Redis Сценарий Lua рассматривается как единое целое. Скрипты Lua загружаются в кэш скриптов, потому что Чтение и запись Redis Заказ однопоточной операции, поэтому сценарий Lua существует для чтения и записи. Сервер Redis можно просто представить в виде следующего рисунка. Скрипты Lua будут помещены в очередь в том порядке, в котором они были введены, а затем последовательно прочитаны и записаны, что обеспечивает атомарность:

картина
картина

Нужно объяснить: Redis иметь 3 разных метода развертывания, разные методы развертывания, гарантии атомарности тоже разные.

картина
картина
  • Автономное развертывание несмотря на Операция в скрипте Lua Если ключ да не тот, это может гарантировать атомарность;
  • Развертывание «главный-подчиненный» Redis Копирование «главный-подчиненный» используется для синхронизации данных от главного узла к подчиненному узлу для поддержания согласованности данных. Все операции записи в Redis выполняются на главном узле, поэтому, несмотря на на Операция в скрипте Lua Если ключ да не тот, это может гарантировать атомарность; Примечание. Когда главный узел записывает заказ, подчиненный узел будет выполнять эти операции записи асинхронно. Во время этого процесса копирования подчиненный узел данных может иметь определенную задержку с существованием главного узла. Поэтому, еслисуществовать Lua-скрипт содержит операции чтения,И скрипт существует на мастер узле, посмотрим,Можно прочитать последние данные,ноеслисуществоватьиз узлаосуществлять,Данные могут считываться с небольшой задержкой.
  • Развертывание кластера если Работа скрипта Luaиз Тот же кейда может гарантировать атомарность; еслидействоватьиз Ключи не одинаковы и могут быть hash к разным слот, возможно hash к тому же из слот, поэтому атомарность не обязательно гарантируется; Поэтому в Развертывание кластерного кластера из среды использования Обязательно обратите внимание на Lua-скрипты: Операция в скрипте Луада то же самое Key;

5. Как ответить на собеседовании?

В интервью: может ли Redis гарантировать атомарность при выполнении сценариев Lua? Как ответить на этот вопрос?

  1. Первый шаг — объяснить, в чем здесь изамарность? Это и реляционные данные Какова последовательность и разница в ACID? Устранить концептуальные различия на конкретных носителях (RDBMS/NoSQL, ссылка №1);
  2. Второй шаг требует пояснения Редисиздела, описание RDBMS/NoSQL существоватьделаначальствоиз Разница;
  3. Третий шаг требует пояснения Можно ли гарантировать существование Redis при различных методах развертывания? Методы развертывания Redis имеют 3 типа: Автономный. развертывание,Развертывание «главный-подчиненный», Развертывание кластера кластера, необходимо объяснить, какие методы развертывания существования могут гарантировать атомарность, а какие не могут гарантировать атомарность; #2
  4. Шаг 4, объясните Redis осуществлять LuaСкриптда Как гарантироватьатомарность;
  5. Пятый шаг – проанализировать Redisиз однопоточной модели и Модель мультиплексирования ввода-вывода (дополнительные точки), этот шаг не является обязательным;

6. Зачем это нужно Lua?

теперь это Redisдела может гарантировать атомарность, зачем она еще нужна? А как насчет Lua-скриптов?

  1. Сценарии Lua обычно быстрее и проще, чем MULTI/EXEC;
  2. Redis деласередина,делаочередьсерединаиз Местоиметь Заказ Все должнысуществовать EXEC Заказосуществлять будет изучено, поскольку между несколькими Заказами существуют существующие отношения зависимости, например, последующий из Заказ должен полагаться на результат предыдущего Заказа из сцены, Redis дела не может его удовлетворить, поэтому Lua Скрипты больше подходят для сложных сцен;
  3. Redis деламогу сделатьиз Lua может это сделать, Redis не может этого сделать. Lua тоже может это сделать;

7. Что следует знать о Lua

При написании скрипта Redis Lua при написании Luaиз необходимо обратить внимание на следующие моменты:

  1. Не будь здесь использовать блокировку Заказа в сценариях Lua (таких как BLPOP, BRPOP и т. д.). Поэтому этот заказ может привести к Сервер Redis существованиеосуществлять блокируется во время выполнения сценария и не может обрабатывать другие запросы;
  2. Не пишите слишком долго Lua-скрипт. потому что Redis читает и записывает заказ в одном потоке,Слишком длинный сценарий,нагрузка,анализировать,Бег будет отнимать больше времени,увеличение задержек в других Заказах;
  3. Не будь здесь Выполнять сложную и трудоемкую логику в скрипте Lua, потому что; Redis читает и записывает заказы в одном потоке, выполнение скриптов в течение длительного времени может привести к увеличению других задержек заказов;
  4. В Lua-скриптах необходимо обратить внимание на различие redis.call() и redis.pcall() Заказ;
  5. Lua индексная таблица из индекса 1 начни без да 0;

8. Резюме

  • Атомарность требует различения конкретного вектора использования, существования реляционной базы данных (например, MySQL))и No В SQL (например, Redis) понятие атомарностьиз отличается от понятия из;
  • Redis и здела (MULTI/ESXEC) и реляционная база данных (например, MySQL) и здела (ACID) Слишком это не одно и то же;
  • ACIDизатомарностьобратитесь к:Заказ Либо всеотделениеосуществлять,Либо все Нет частиосуществлять;
  • Выполнение Redis Lua-скрипт и затомарность означают: Lua-скрипт будет рассматриваться как единое целое и не будет прерываться другими делами, но да. Lua В сценарии нет гарантии, что «либо все изучают, либо все не изучают»;
  • Использование скрипта Lua redis.pcall() осуществлять Заказ Когда возникает ошибкабудетcatch,Следовать за Заказбудет нормальноосуществлять;
  • Использование скрипта Lua redis.call() Интерес Заказ вызовет Дават клиент при возникновении ошибки, и последующий Заказ будет заблокирован;
  • Сценарии Lua обычно быстрее и проще, чем MULTI/EXEC;
  • Метод Redisizdeployment определяет Выполнение Redis Может ли Lua-скрипт гарантировать атомарность, напишите При написании скриптов Lua особое внимание необходимо уделять тому, требует ли да в одном существовании одной и той же операции. key;

9. Справочные материалы

Scripting with Lua:https://redis.io/docs/interact/programmability/eval-intro/

Atomicity with Lua:https://developer.redis.com/develop/java/spring/rate-limiting/fixed-window/reactive-lua/

Redis Transactions:https://redis.io/docs/interact/transactions/

The Programming Language Lua:https://www.lua.org/

10. Теплое напоминание

  • Эта статья основана на сервере Redis версии 7.0.4.,Различные версии,Могут быть небольшие различия;
  • Все примеры в этой статье выполняются в автономной среде;
  • Redis не чувствителен к регистру, но ключ и значение учитываются с учетом регистра;

наконец,Я даю вам девиз брата Юя: «Только инвестируя в себя, вы можете получить величайшее богатство».из-за уровняиметьпредел,если при хранении статьи имеются недостатки и ошибки,Критика и поправки приветствуются. если вы считаете, что статья вам полезна иметь,добро пожаловатьсосредоточиться на,Нравиться,Вперед Давать больше из друзей.

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.