Redis обновить с запросом - PullRequest
0 голосов
/ 03 июня 2018

Я новичок в redis, но, читая документы, я не смог найти, можно ли обновить значение с помощью запроса (например, mongo или postgres).

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

update({id:1, status:home}, {status: lobby})

Таким образом, я получу результат (успех или неудача), если обновление прошло успешно, и оно атомарное.

Как я могу сделать это вredis

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Вы можете сделать это в процедуре LUA:

eval "local ks=redis.call('keys','user:*') for k=1,#ks do print(k) if (redis.call('hget',ks[k],'status') == KEYS[1]) then redis.call('hset',ks[k],'status',KEYS[2]) end end" 2 home lobby

127.0.0.1: 6370> пользователь hset: 1 id 1 (целое число) 1
127.0.0.1:6370> hsetпользователь: 1 статус снаружи (целое число) 1
127.0.0.1:6370> hset пользователь: 2 id 2 (целое число) 1
127.0.0.1:6370> пользователь hset: 2 статус home (целое число) 1
127.0.0.1:6370> eval "local ks = redis.call ('keys', 'user: *') для k = 1, # ks do print (k) if (redis.call ('hget', ks [k)], 'status') == KEYS [1]) затем redis.call ('hset', ks [k], 'status', KEYS [2]) end end "2 homeobby
(nil)
127.0.0.1:6370> hgetall user: 2 1) "id" 2) "2" 3) "status" 4) "obby "
127.0.0.1:6370> hgetall user: 1 1)" id "2) "1" 3) "статус" 4) "снаружи"

0 голосов
/ 03 июня 2018

В Redis нет запроса на обновление по запросу, как в других хранилищах документов / РСУБД

Вы можете использовать транзакции MULTI-EXEC или EVAL / EVAL SHA для выполнения атомарных обновлений и составления пакета команд вместе

Redis использует один поток для обработки команды (на данный момент), поэтому оценка сценария будет выполняться атомарно и, вероятно, будет более простойподход, чем multi-exec.

...