Redis
 sql >> база данни >  >> NoSQL >> Redis

Redis C# - Използване на стойност Incr в транзакция

Има основна характеристика на redis MULTI/EXEC единици, което означава, че не можете да получите резултати по време на операцията. Като такива има два често срещани начина да направите това, което поискате:

  1. Използвайте Lua (ScriptEvaluate[Async] ); Lua скрипт се изпълнява на сървъра от начало до край, е ефективен и избягва всички проблеми, свързани с времето за двупосочно пътуване (латентност или честотна лента) или конкуренция от други връзки
  2. Използвайте оптимистичен цикъл, който чете текущата стойност, след което създава транзакция в SE-Redis, която добавя ограничение че стойността, която току-що прочете, е същата и изпълнява страничните ефекти в транзакцията; библиотеката ще координира необходимата машина WATCH etc, за да направи това стабилно, но ако условието за ограничение се окаже невалидно (т.е. библиотеката връща false ), трябва да повторите всичко отначало

Честно казано, тези дни винаги бих насочвал хората към вариант 1; Вариант 2 е само "привлекателен" (и използвам този термин съвсем неправилно), ако Lua скриптовете от страна на сървъра не са налични.

Не съм на компютър, но предполагам, че скриптът ще изглежда така:

local id = redis.call("incr", KEYS[1])
redis.call("hset", KEYS[2], tostring(id), ARGV[1])
return id



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Определяне защо Redis получава SIGTERM на всяка минута или две

  2. ScaleGrid хостинг за Redis™ на вашия собствен акаунт в AWS

  3. Грешка jemalloc/jemalloc.h:Няма такъв файл или директория при създаване на Redis

  4. Каква е стратегията за кеширане по подразбиране, когато използвате Redis с пружинно или пружинно зареждане?

  5. Как да внедря тригер за Redis datastore?