如何使用 redis incr 命令确保计数器原子性
how to make sure counter atomic by using redis incr command
我正在使用 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)
}
我想知道如何更改我的代码并使进程是原子的和线程安全的?谢谢你
要使这两个命令“原子化”,请使用 Redis transaction or a Lua script。这将是线程安全和容错的,因为只有在所有命令(在 tx/script 中)完成后才会保留任何更改。
我正在使用 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)
}
我想知道如何更改我的代码并使进程是原子的和线程安全的?谢谢你
要使这两个命令“原子化”,请使用 Redis transaction or a Lua script。这将是线程安全和容错的,因为只有在所有命令(在 tx/script 中)完成后才会保留任何更改。