Путаница в просмотре и развертывании драгоценных камней Redis

#ruby-on-rails #ruby #redis

#ruby-on-rails #ruby #redis

Вопрос:

Согласно документам redis-rb ruby gem;

 redis.watch("key") do
 if redis.get("key") == "some value"
  redis.multi do |multi|
   multi.set("key", "other value")
   multi.incr("counter")
  end
 else
  redis.unwatch
 end
end
  

У меня есть два вопроса по этому поводу;

  1. Почему требуется строка unwatch? Я думаю, что если key == «некоторое значение», установите «key» на другое значение и увеличьте счетчик, если «key» не изменился к моменту вызова EXEC. На мой взгляд, оператор else никогда не выполняется в этом сценарии. Если вы запустите этот код без else / unwatch, возвращается nil.
  2. Если redis.»ключ» часов вводится без блока (redis.смотрите «ключ»); Почему я не могу отключить определенный ключ? Я получаю (неправильное количество аргументов (задано 1, ожидается 0))??

Вот ссылка на ruby gem https://github.com/redis/redis-rb

Ответ №1:

Я не эксперт ни по Ruby, ни по Redis.

Хотя, прочитав документацию Redis о транзакции здесь https://redis.io/topics/transactions мы узнаем, что отслеживаемый ключ не отслеживается двумя способами: либо после использования EXEC. (затем транзакции завершаются) или либо с помощью UNWATCH.

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

Также я думаю redis.unwatch , что действительно может быть вызван условный бит, содержащий. As redis.get("key") == "some value" кажется чисто произвольным и в основном дизайном кода. Это вполне может быть redis.get("key") > "some value" , например.

(Также кажется, что блок, переданный наблюдаемому, не автоматически РАЗВОРАЧИВАЕТ ключ в соответствии с документацией, поскольку блок является необязательным)

Что касается вашего второго вопроса, вы правы, похоже, вы не можете отключить определенный ключ. Хотя redis.unwatch , похоже, работает нормально.

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

Я не вижу ни одного примера использования UNWATCH в документации Redis https://redis.io/topics/transactions но кажется естественным сбросить каждый ключ после блокировки транзакции.

Комментарии:

1. Я не уверен, ясно ли я выразился в своем первом вопросе; Я запустил код с «key» = «некоторое значение», и когда присутствует «else unwatch», код возвращает «key» = «другое значение», а когда «else unwatch» отсутствует (несмотря на то, что он не выполняется) код возвращает nil. github.com/redis/redis-rb

2.Это странно, поскольку я возвращаюсь redis.get 'key' "other value" в обоих случаях. Либо с else redis.unwatch , либо нет.

3. Действительно, странно. Я только что протестировал его, и, похоже, он работает нормально. Возможно, прошлой ночью была опечатка или что-то странное в окружающей среде. Я рассмотрю это подробнее, но, скорее всего, предложу вам решение. Большое спасибо за ваш вклад!