前几天投产碰到一个问题:多个Redis键值在一个事务内一并提交发生异常的问题。
1.问题描述
为实现令牌桶(Token Bucket)流控算法,引入了两个Redis键值,由于这两个键值需要同时完成修改,因此引入Redis事务提交方式。
两个Redis key定义如下:
remainTokenKey:剩余令牌个数key,命名方式为:
string remainTokenKey = “AppIdTokenBucketAvailable”
oldTsKey:上次访问时间戳key,命名方式为:
string oldTsKey = “AppIdTokenBucketTs”
代码如下:
private ErrorCode ExecuteTokenBucketProc(string appId)
{
if (string.IsNullOrEmpty(appId))
{
return ErrorCode.WebAppIdIsEmpty;
}
bool bPass = true;
string remainTokenKey = RedisKeyConstValues.REDIS_KEY_TOKEN_BUCKET_AVAILABLE_PREFIX + appId;
string oldTsKey = RedisKeyConstValues.REDIS_KEY_TOKEN_BUCKET_TS_PREFIX + appId;
var db = RedisConnector