Выполнить модификацию атомарного массива в memcache - PullRequest
1 голос
/ 21 июля 2010

Предположим, что вы хотите сохранить список последних 10 посетителей вашего сайта в memcache.

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

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

Возможный сценарий несогласованности с двумя почти одновременными обращениями пользователей:

  1. Пользователь A получает массив из memcache
  2. Пользователь B получает массив из memcache
  3. Пользователь A изменяет массив (изменения будут потеряны)
  4. Пользователь B изменяет массив
  5. Пользователь A хранитмассив в memcache
  6. Пользователь B хранит массив в memcache (перезапишет изменение A на шаге 3)

Как правильно выполнить что-то подобное, используя memcache?

Ответы [ 2 ]

1 голос
/ 21 июля 2010

Использование токенов CAS.См .: http://github.com/memcached/memcached/blob/master/doc/protocol.txt См., Например, в реализации PHP .Это может быть задача «проигравшего процесса», чтобы получить новые данные и определить, что делать с модификацией процесса выигрыша.

0 голосов
/ 22 июля 2010

Для этого мы создали CAS.

  1. Пользователь A получает массив
  2. Пользователь B получает массив
  3. Пользователь A меняет массив
  4. Пользователь Bизменяет массив
  5. Пользователь CAS в массиве - выигрывает
  6. Пользователь B CAS в массиве - проигрывает
  7. Пользователь B повторяет с 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...