Основываясь на редактировании, которое показывает использование StringAppend
, кажется, что вы просто видите промежуточные значения такими, какие они есть в момент запроса, особенно при работе с несколькими потоками или несколькими узлами. В конечном итоге, если один кодовый путь создает значение с помощью APPEND
, а другой кодовый путь запрашивает значение между двумя добавлениями , то значение равно , каким бы оно ни было в то время, Если бы вы запустили MONITOR
, вы, вероятно, увидели бы что-то вроде:
DEL 192.168.1.1
APPEND 192.168.1.1 A$
APPEND 192.168.1.1 B$
GET 192.168.1.1
APPEND 192.168.1.1 C$
APPEND 192.168.1.1 D$
, в этом случае да, значение из GET
будет A$B$
, потому что это то, что значение в это время .
Если вы хотите атомарность, то это то, что ваш код должен предоставить; Есть несколько способов сделать это, в том числе:
- объединить значения в вашем коде , а затем выполнить одиночный вызов
StringSet
(это идеально для небольших значений, подобных этому ) - используйте
MULTI
/ EXEC
(т. Е. CreateTransaction()
в StackExchange.Redis), чтобы создать блок операций atomi c (не уверен, что это имеет смысл в этом контексте, но может быть полезно в другом сценарии ios) - записать значения в другой временный ключ во время его построения, а затем использовать
RENAME
(KeyRename()
в StackExchange.Redis) для поменять местами ключи атомно - выполнить блок операций на стороне сервера в Lua через
EVAL
(ScriptEvaluate()
в StackExchange.Redis) - опять же, вероятно, не относится к этому параметру c сценарий
Я бы go с вариантом 1 сам.