Ich habe eine Anforderung zum Generieren eines Zählers, die an einige API-Aufrufe gesendet werden. Meine Anwendung läuft auf mehreren Knoten, also einige, wie ich Unique Counter generieren wollte. Ich habe versucht, Code folgendeRedis verteiltes Inkrement mit Sperren
public static long GetTransactionCountForUser(int telcoId)
{
long valreturn = 0;
string key = "TelcoId:" + telcoId + ":Sequence";
if (Muxer != null && Muxer.IsConnected && (Muxer.GetDatabase()) != null)
{
IDatabase db = Muxer.GetDatabase();
var val = db.StringGet(key);
int maxVal = 999;
if (Convert.ToInt32(val) < maxVal)
{
valreturn = db.StringIncrement(key);
}
else
{
bool isdone = db.StringSet(key, valreturn);
//db.SetAdd(key,new RedisValue) .StringIncrement(key, Convert.ToDouble(val))
}
}
return valreturn;
}
Und es via Task Parallel libray Funktionsprüfung unterzogen. Wenn ich Grenzwerte haben, was ich sehe, ist, dass mehrere Zeit 0 Eintrag
gesetzt Bitte lassen Sie mich wissen, welche Korrektur i
-Update tun musste: Meine letzte Logik als
public static long GetSequenceNumberForTelcoApiCallViaLuaScript(int telcoId)
{
long valreturn = 0;
int maxIncrement = 9999;//todo via configuration
if (true)//todo via configuration
{
IDatabase db;
string key = "TelcoId:" + telcoId + ":SequenceNumber";
if (Muxer != null && Muxer.IsConnected && (db = Muxer.GetDatabase()) != null)
{
valreturn = (int)db.ScriptEvaluate(@"
local result = redis.call('incr', KEYS[1])
if result > tonumber(ARGV[1]) then
result = 1
redis.call('set', KEYS[1], result)
end
return result", new RedisKey[] { key }, flags: CommandFlags.HighPriority, values: new RedisValue[] { maxIncrement });
}
}
return valreturn;
}
finden
benachrichtigt, warum Sie eine einfache Tabelle nicht mit nur einer Identitätsspalte verwenden, einen Einsatz tun und benutzen Sie wieder SCOPE_IDENTITY() - Das sollte immer wieder einzigartig sein. –
Ich wollte db Einfügung/db Rundreise vermeiden. Ich habe eine Unterstützung für Cache Via Redis, die ich bis –
@KamranShahid vollständig machen wollte bitte verwenden Sie 'string.Format' nicht, um das zu parametrisieren; Ich werde mein Beispiel bearbeiten, um den bevorzugten Weg zu zeigen –