Redis от входа до мастерства [Дополнительно] Сведения о транзакции Redis


вставьте сюда описание изображения

0. Предисловие

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

  1. открытая транзакция

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

  1. Выполнить бизнес

Когда клиент выполняет команду EXEC, Redis удалит состояние клиента из состояния транзакции и последовательно выполнит все команды в очереди транзакций. Во время выполнения Redis будет выполнять все команды в очереди транзакций без перерыва. Если во время выполнения возникает какая-либо ошибка, Redis вернет сообщение об ошибке клиенту и отменит транзакцию.

  1. транзакция отката

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

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

1. Базовый процесс транзакции Redis

Транзакция Redis — это набор команд, которые выполняются как единое целое. Все команды в транзакции либо выполняются, либо не выполняются вовсе, что обеспечивает атомарность транзакции. Во время выполнения транзакции команды, отправленные другими клиентами, не будут выполняться, что может обеспечить изоляцию транзакции.

1. Сведения о бизнесе

1.1. Начать транзакцию

Транзакцию можно запустить командой MULTI. Эта команда переключает состояние клиента с нетранзакционного на транзакционное.
Транзакцию можно запустить с помощью команды MULTI:

127.0.0.1:6379> MULTI
OK

1.2. Очередь команд

В состоянии транзакции все команды, отправленные клиентом, не будут выполняться немедленно, а сначала будут помещены в очередь, и все команды будут выполняться последовательно при вызове команды EXEC.

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET key1 value1
QUEUED
127.0.0.1:6379> INCR key2
QUEUED
127.0.0.1:6379> MGET key1 key2
QUEUED

изображение.png

1.3. Выполнение транзакций

изображение.png

Все команды в транзакции могут быть выполнены с помощью команды EXEC. Если какая-либо команда в транзакции завершится ошибкой, будет отменена вся транзакция.

127.0.0.1:6379> EXEC
1) OK
2) (integer) 1
3) 1) "value1"
   2) "1"

##1.4.Выполнение команд в транзакционном и нетранзакционном состояниях

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

127.0.0.1:6379> SET key1 value1
OK

##1.5 Команды DISCARD, MULTI и WATCH в состоянии транзакции

  • Команда DISCARD: используется для отмены транзакции и очистки очереди транзакций.
    Команда MULTI: используется для запуска транзакции.
    Команда WATCH: используется для мониторинга одного или нескольких ключей.Если эти ключи будут изменены другими клиентами до выполнения транзакции, транзакция будет отменена.
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET key1 value1
QUEUED
127.0.0.1:6379> DISCARD
OK
  • Команда MULTI: используется для запуска транзакции.
127.0.0.1:6379> MULTI
OK
  • Команда WATCH: используется для мониторинга одного или нескольких ключей.Если эти ключи будут изменены другими клиентами до выполнения транзакции, транзакция будет отменена.
127.0.0.1:6379> WATCH key1
OK

1.6. Операции с WATCH

Транзакция с WATCH может гарантировать, что отслеживаемый ключ не будет изменен другими клиентами во время выполнения транзакции. Если какой-либо из отслеживаемых ключей будет изменен другим клиентом, транзакция будет отменена. Между командой WATCH и командой EXEC клиент может отправить любое количество команд на отслеживаемый ключ, которые будут помещены в очередь, но не будут выполнены немедленно.
изображение.png

127.0.0.1:6379> WATCH key1
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET key1 value1
QUEUED
127.0.0.1:6379> EXEC
(nil)

1.7 Реализация команды WATCH

Команда WATCH в Redis реализована с использованием оптимистической блокировки. Перед выполнением транзакции Redis запишет значения отслеживаемых ключей, а при выполнении транзакции Redis снова проверит, не изменились ли значения этих ключей. В случае изменения транзакция будет отменена. .

1.8. Запуск функции WATCH

Когда выполняется команда EXEC, Redis проверяет все отслеживаемые ключи на наличие изменений. Если изменений нет, транзакция продолжается. Если есть изменения, транзакция будет отменена.

1.9 ACID-свойства транзакций

Транзакции Redis обладают свойствами ACID, а именно атомарностью, согласованностью, изоляцией и долговечностью.

  • Атомарность: все команды в транзакции либо выполняются, либо не выполняются вообще, так что атомарность транзакции может быть гарантирована.
  • Непротиворечивость: до и после выполнения транзакции данные в базе данных должны оставаться непротиворечивыми, то есть состояние данных до и после выполнения транзакции должно удовлетворять определенным ограничениям.
  • Изоляция: во время выполнения транзакции команды, отправленные другими клиентами, не будут выполняться, что может обеспечить изоляцию транзакции.
  • Долговечность: после завершения транзакции данные должны быть сохранены на диске, чтобы обеспечить долговечность транзакции.

Ниже приведен пример транзакции, включающей команду WATCH:

127.0.0.1:6379> SET key1 10
OK
127.0.0.1:6379> SET key2 5
OK
127.0.0.1:6379> WATCH key1 key2
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> DECR key1
QUEUED
127.0.0.1:6379> INCR key2
QUEUED
127.0.0.1:6379> EXEC
(nil)

В этом примере сначала устанавливаются значения key1 и key2. Затем отслеживайте key1 и key2 с помощью команды WATCH. Затем запустите транзакцию с помощью команды MULTI, чтобы поставить в очередь операции с ключами 1 и 2. Перед выполнением команды EXEC другой клиент изменил значение ключа 2, что привело к откату транзакции.

Следует отметить, что транзакции Redis не являются настоящими транзакциями ACID, поскольку транзакции Redis не могут гарантировать изоляцию. Во время выполнения транзакции команды, отправленные другими клиентами, не будут выполняться, но если эти команды предназначены для ключей, задействованных в командах транзакции в очереди, они все равно будут изменять значения этих ключей, и эти модификации могут повлиять на результат выполнения. сделки. Поэтому при использовании транзакций Redis вам необходимо обратить внимание на этот
# 2. Практика кода
Мы используем jedis и Spring Boot для реализации транзакций Redis соответственно.

1. джедай

(1) Файл pom.xml зависит от:

<dependencies>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.6.0</version>
    </dependency>
</dependencies>

(2) Пример кода:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

public class JedisTransactionDemo {
    
    
    public static void main(String[] args) {
    
    
        Jedis jedis = new Jedis("localhost", 6379);
        Transaction transaction = jedis.multi(); // 开启事务
        try {
    
    
            transaction.set("name", "张三");
            transaction.set("age", "18");
            transaction.exec(); // 提交事务
        } catch (Exception e) {
    
    
            transaction.discard(); // 回滚事务
        } finally {
    
    
            jedis.close(); // 关闭连接
        }
    }
}
  1. Spring Boot реализует транзакцию Redis

(1) Файл pom.xml зависит от:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
</dependencies>

(2) размещение application.properties:

# Redis 配置
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.database=0

(3) Пример кода:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SessionCallback;
import org.springframework.stereotype.Component;

@Component
public class RedisTransactionDemo {
    
    
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    public void test() {
    
    
        redisTemplate.execute(new SessionCallback<Object>() {
    
    
            @Override
            public Object execute(RedisOperations ops) throws DataAccessException {
    
    
                ops.multi(); // 开启事务
                try {
    
    
                    ops.opsForValue().set("name", "张三");
                    ops.opsForValue().set("age", "18");
                    ops.exec(); // 提交事务
                } catch (Exception e) {
    
    
                    ops.discard(); // 回滚事务
                }
                return null;
            }
        });
    }
}

Выше приведен пример проекта jedis и Spring Boot, реализующих транзакции Redis, которые можно изменять и настраивать в соответствии с реальными потребностями.

2. Резюме

2.1. В транзакционном и нетранзакционном состояниях

  1. Независимо от того, находится ли он в транзакционном или нетранзакционном состоянии, команды Redis выполняются одной и той же функцией, поэтому они используют многие общие настройки сервера, такие как конфигурация AOF, конфигурация RDB, ограничение памяти и т. д.

  2. Однако небольшая разница между выполнением команд в транзакции и обычными командами все же есть.Два наиболее важных момента:
    команды в нетранзакционном состоянии выполняются юнитами одной команды, а клиенты предыдущей команды и следующая команда не обязательно одна и та же;

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

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

  5. Команды DISCARD, MULTI и WATCH в состоянии транзакции
    В дополнение к EXEC, когда сервер находится в состоянии транзакции, другие три команды, которые сервер выполняет напрямую, без добавления в очередь транзакций, — это DISCARD, MULTI и WATCH.
    Команда DISCARD используется для отмены транзакции, очищает всю очередь транзакций клиента, затем переводит клиент из состояния транзакции в состояние отсутствия транзакции и, наконец, возвращает клиенту строку OK, указывающую, что транзакция завершена. был отменен.

  6. Транзакции Redis не могут быть вложенными.Когда клиент уже находится в состоянии транзакции и клиент отправляет MULTI на сервер, сервер просто отправляет клиенту ошибку и продолжает ждать поступления других команд в очередь. Отправка команды MULTI не приведет к сбою всей транзакции и не изменит существующие данные в очереди транзакций.

  7. НАБЛЮДЕНИЕ может быть выполнено только до того, как клиент войдет в состояние транзакции.Отправка команды НАБЛЮДЕНИЕ в состоянии транзакции вызовет ошибку, но не приведет к сбою всей транзакции и не изменит существующие данные в очереди транзакций (и предыдущая обработка MULTI такая же ситуация).

2.2. Резюме

Транзакции Redis представляют собой набор команд с ACID-свойствами атомарности, согласованности, изоляции и устойчивости. Все команды в транзакции либо выполняются все, либо не выполняются вовсе, что может гарантировать атомарность транзакции. Во время выполнения транзакции команды, отправленные другими клиентами, не будут выполняться, что может обеспечить изоляцию транзакции. Перед выполнением транзакции вы можете использовать команду WATCH для мониторинга одного или нескольких ключей.Если эти ключи будут изменены другими клиентами до выполнения транзакции, транзакция будет отменена. ACID-природа транзакций может обеспечить согласованность и надежность данных.

2.3 Почему транзакции Redis не являются по-настоящему атомарными операциями

Изучив эту главу, мы попытаемся ответить на этот вопрос.
Транзакции Redis не являются по-настоящему атомарными операциями, в основном по следующим причинам:

  1. Транзакции Redis реализованы на основе оптимистической блокировки и не будут блокировать никакие ключевые данные. Если во время выполнения транзакции другие клиенты изменят одни и те же данные ключа, транзакция может завершиться неудачно. В этом случае Redis откатит всю транзакцию и вернет сообщение об ошибке. Следовательно, транзакции Redis не могут гарантировать абсолютную атомарность, как транзакции базы данных.

  2. Транзакции Redis не блокируют команды в очереди транзакций во время выполнения, но отслеживают изменения ключевых данных во время выполнения. Если ключевые данные изменяются во время выполнения транзакции, Redis откатывает транзакцию и возвращает сообщение об ошибке. Однако, если во время выполнения транзакции возникают нештатные ситуации, такие как сбой сети или сбой клиента, Redis не может откатить транзакцию, что может привести к несогласованности данных.

Хотя транзакции Redis не являются настоящими атомарными операциями, для большинства сценариев приложений транзакций Redis достаточно для удовлетворения потребностей бизнеса. Следует отметить, что при использовании транзакций Redis следует обращать внимание на правильность и надежность транзакций, чтобы избежать несоответствия данных.

2.4 Почему Redis не может автоматически откатывать транзакции в нештатных ситуациях, таких как сбои клиента

  1. Аномальные условия, такие как сбои клиента, могут прервать выполнение транзакций Redis, что сделает невозможным автоматический откат транзакций. В частности, когда клиент выполняет команду MULTI для запуска транзакции, все команды не выполняются немедленно, а временно сохраняются в очереди транзакций. Когда клиент выполняет команду EXEC для отправки транзакции, Redis последовательно выполняет все команды в очереди транзакций.
  2. Если во время выполнения транзакции возникают ненормальные условия, такие как сбой сети или сбой клиента, Redis не может автоматически зафиксировать транзакцию, поэтому он не может автоматически откатить транзакцию. В этом случае необходимо вручную выполнить соответствующую команду для отмены команды, которая была выполнена, чтобы реализовать откат транзакции. В частности, вы можете использовать команду DISCARD для отмены всех невыполненных команд в транзакции или, наоборот, для отмены уже выполненных команд.

3. Redis от начального до профессионального цикла статей

«Redis от начального до профессионального [расширенная глава] подробное объяснение механизма объекта» «
Redis от начального до профессионального [расширенная глава] подробное объяснение модели подписки на публикацию доставки сообщений»
«Redis от начального до профессионального [расширенная глава] постоянный AOF Подробный Объяснение»
«Redis от начального до профессионального [расширенная глава]: подробное объяснение постоянной RDB» «
Redis от начального до профессионального [расширенная глава] подробное объяснение базового словаря структуры данных (Словарь)» «
Redis от начального до профессионального [расширенная глава] ] ] Подробное объяснение базовой структуры данных QuickList »
«Redis от входа к мастерству [расширенные статьи]: подробное объяснение базовой структуры данных Simple Dynamic String (SDS)» «
Redis от входа к мастерству [расширенные статьи] сжатие базовой Список структур данных (ZipList) Подробное объяснение»
«Redis от начального до профессионального уровня [Расширенная глава]: подробное объяснение и примеры использования типа данных Stream»
вставьте сюда описание изображения
Привет всем, я — Точка замерзания, сегодняшний Redis от начального до профессионального уровня [Дополнительная глава] Redis подробное объяснение сделки, вот и все. Если у вас есть вопросы или мнения, вы можете оставить сообщение в области комментариев.

Supongo que te gusta

Origin blog.csdn.net/wangshuai6707/article/details/131610401
Recomendado
Clasificación