#redis #redis-cluster
#redis #redis-кластер
Вопрос:
Я использую redis incr
в качестве нашего счетчика запросов, поскольку, как я исследовал incr
, он атомарный и потокобезопасный, теперь я хочу добавить expire
время для каждого ключа, но, похоже, этот процесс не потокобезопасен, например, сбой redis только после incr
завершения и перед Expire
запуском команды, базовый псевдокод, как показано ниже:
value := redisClient.getValue(key)
if value > common.ChatConfig.SendMsgRetryCfg.RetryCount {
return error
}
value, err := redisClient.Incr(key).Result()
if err == nil {
redisClient.Expire(key, 24*time.Hour)
}
Я хочу знать, как изменить мои коды и сделать процесс атомарным и потокобезопасным? спасибо
Комментарии:
1. Что вы подразумеваете под «сбоем redis»?
2. @GuyKorland Я имею в виду, что между
Incr
command иexpire
command redis не работает, возможно, из-за проблем с кластером redis, проблем с сетью и так далее, что время истечения срока действия ключа будет навсегда
Ответ №1:
Чтобы сделать две команды «атомарными», используйте транзакцию Redis или сценарий Lua. Это будет потокобезопасным и отказоустойчивым, поскольку любые изменения будут сохранены только после завершения всех команд (в tx / script).
Комментарии:
1. о, позвольте мне попробовать