#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
У меня есть два вопроса по этому поводу;
- Почему требуется строка unwatch? Я думаю, что если key == «некоторое значение», установите «key» на другое значение и увеличьте счетчик, если «key» не изменился к моменту вызова EXEC. На мой взгляд, оператор else никогда не выполняется в этом сценарии. Если вы запустите этот код без else / unwatch, возвращается nil.
- Если 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. Действительно, странно. Я только что протестировал его, и, похоже, он работает нормально. Возможно, прошлой ночью была опечатка или что-то странное в окружающей среде. Я рассмотрю это подробнее, но, скорее всего, предложу вам решение. Большое спасибо за ваш вклад!