线程安全 increment/decrement 与 StackExchange.Redis
Thread-safe increment/decrement with StackExchange.Redis
我正在使用 StackExchange.Redis 程序包作为多线程应用程序的共享存储,而多线程应用程序又会同时在多个服务器上 运行...所以是多线程的; )
我有一个最简单的用例是我想对一系列键(即 KEY1=4 KEY2=7、KEY3=13 等)进行基本计数。我将制定业务规则来强制执行给定密钥所允许的最大允许值。因此,例如,假设 KEY1 只能达到 5...如果两个线程同时触发并试图增加它,我只想让其中一个成功。
我相信我可以通过首先获取当前值然后使其成为值未更改的条件来通过事务来完成此操作。这会像我期望的那样工作吗?有没有更优雅的方法来做到这一点?
public void Increment(string key) {
IDatabase db = redisConn.GetDatabase();
var val = db.StringGet(key);
int maxVal = 5;
if (Convert.ToInt32(val) < maxVal) {
var trans = db.CreateTransaction();
trans.AddCondition(Condition.StringEqual(key, val));
trans.StringIncrementAsync(key);
trans.Execute();
}
}
PS:喜欢这个包,很高兴与
合作
是的,应该没问题。但是通过 ScriptEvaluate
.
使用 Lua 脚本可能更容易也更有效
注意:使用您当前的代码,如果 false
,您可能需要检查 Execute
和 "redo from start" 的响应。如果在从 2 移动到 3 时发生线程争用,则使用您当前的代码:更新将被丢弃。这不会是 Lua 脚本的问题。
我正在使用 StackExchange.Redis 程序包作为多线程应用程序的共享存储,而多线程应用程序又会同时在多个服务器上 运行...所以是多线程的; )
我有一个最简单的用例是我想对一系列键(即 KEY1=4 KEY2=7、KEY3=13 等)进行基本计数。我将制定业务规则来强制执行给定密钥所允许的最大允许值。因此,例如,假设 KEY1 只能达到 5...如果两个线程同时触发并试图增加它,我只想让其中一个成功。
我相信我可以通过首先获取当前值然后使其成为值未更改的条件来通过事务来完成此操作。这会像我期望的那样工作吗?有没有更优雅的方法来做到这一点?
public void Increment(string key) {
IDatabase db = redisConn.GetDatabase();
var val = db.StringGet(key);
int maxVal = 5;
if (Convert.ToInt32(val) < maxVal) {
var trans = db.CreateTransaction();
trans.AddCondition(Condition.StringEqual(key, val));
trans.StringIncrementAsync(key);
trans.Execute();
}
}
PS:喜欢这个包,很高兴与
合作是的,应该没问题。但是通过 ScriptEvaluate
.
注意:使用您当前的代码,如果 false
,您可能需要检查 Execute
和 "redo from start" 的响应。如果在从 2 移动到 3 时发生线程争用,则使用您当前的代码:更新将被丢弃。这不会是 Lua 脚本的问题。