Рубрики
Uncategorized

Запишите проблему параллельной обработки redis

Автор оригинала: David Wong.

Анализ Сцены

Компания является компанией Интернета вещей, которая предполагает отправку инструкций на устройства. Теперь проблема в том, что в линейке продуктов, которая подключается к голосу SkyCat, есть ошибка.

Включите комбинированный командный режим, например режим сценария, 1, включите свет в спальне, 2 света в коридоре, 3 света в гостиной.

  • Три фонаря выше-это всего лишь один для наших продуктов. Коммутатор В верхней части панели находится Трехходовой переключатель То есть каждая лампа соответствует переключателю, как показано ниже:

В тот день эльф-кошка отправил контрольную команду. Я посылал команду на устройство. Блок – схема выглядит следующим образом.

II. Анализ процесса

Весь процесс можно увидеть выше, включая процесс запуска облака приложений для выдачи инструкций по управлению голосом Skycat. Это может почти полностью сфокусировать внимание на следующем параметре.

1. Отправьте двоичные инструкции

  • Теперь есть три тротуарные плиты, соответствующие 1 1 1 Двоичные биты, компания имеет до восьми коммутаторов
  • Как показано в приведенном выше процессе, при управлении гостиной отправляйте параметры 0 0 0 0 0 1 0 0

2. Механизм кэширования

Как вы можете видеть выше, состояние других битов коммутатора также будет выведено при выполнении команды управления.

  • Поэтому, когда он действительно находится под контролем, Проверит состояние других битов коммутатора
  • Затем состояние кэша обновляется устройством.

Глядя на это здесь, вряд ли возникнут какие-либо проблемы, и тогда мы столкнемся с реальными проблемами.

III. Анализ параллельных проблем

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

Но теперь мы представили сценарий, в котором у эльфов-скайкотов есть режимы сценариев, такие как настройка сценариев. Я дома Тогда все огни на трехпозиционном выключателе должны включить все огни. И мастер Skycat работает одновременно, то есть он отправляет три запроса в облако приложений одновременно, а затем облако приложений отправляет инструкции по управлению.

анализ проблем

Таким образом, проблема в том, что все три запроса зависят друг от друга.

  • Если вы включите лампу в гостиной, вы запросите состояние лампы в коридоре и лампы в спальне, вы запросите кэш, и все три инструкции по управлению поступят одновременно, поэтому устройство не обновило кэш.
  • Например, лампа в спальне (000000100), лампа в коридоре (000000101) уже открыта, но лампа в гостиной, наконец, входит и обнаруживает, что буфер других источников света выключен. Затем он уменьшит значение 0 ((00000010)) и заставит первые два индикатора включаться и выключаться.

IV. ОПТИМИЗАЦИЯ СХЕМЫ ОБРАБОТКИ

1. Использование временного кэша вместо того, чтобы полагаться на устройство для обновления кэша

То есть вместо запроса кэша устройства временный кэш используется непосредственно в течение 1-2 секунд. Когда три одновременных запроса поступают одновременно, временное значение сохраняется напрямую, сообщая другим запросам, что другие переключатели находятся под контролем для управления панелью.

Sowole process model adopted by server
// Using hash structure, each case corresponds to a key value.
// Update hashkey for 1 s when each key request arrives
$redis->hset("concurrent_control_hash_off".$devSn,$keynum,1);
$redis->expire("concurrent_control_hash_off".$devSn,1);
// Get directly from the temporary cache, if not from the device cache
$res = $redis->hGetAll("concurrent_control_hash_off".$devSn);
  • Метод апелляции по-прежнему проблематичен при высоком параллелизме .

2. Гарантируйте атомарность работы redis для одного запроса

То есть, когда выполняются одновременные запросы, каждая инструкция redis не имеет порядка

$redis->multi();
$redis->hset("concurrent_control_hash_on".$devSn,$keynum,1);
$redis->expire("concurrent_control_hash_on".$devSn,1);
$redis->hGetAll("concurrent_control_hash_on".$devSn);
$res = $redis->exec();
$concurrentArr = $res[2];
  • @мульти()
  • @exec()

До сих пор поддержание атома в рабочем состоянии работало лучше.

резюме

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