场景:下单后如果20分钟没有支付,则系统自动取消订单。
如果使用定时去轮询数据库,那么如果1秒轮询1次,对数据库负载不小,如果5分钟轮询1次,则取消可能会延迟,极端情况可能25分钟才取消订单。能不能使用redis的机制来处理,就是在下单的时候,顺便往redis写一条数据,过期时间是20分钟,过期的时候可以监控到,顺便处理,这种方式应该是可以实现,与redis要保持一个连接,但如果失败的时候,不好监控,下面我们说说另外一种方法:
1)下单的时候,往数据库写入一条数据,使用zadd,score为到期时间的时间戳,使用StackExchange.Redis,代码:
var startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); var exeTime = (int)(DateTime.Now - startTime).TotalSeconds; _database.SortedSetAdd(key, value, exeTime);
2)根据score找小于或等于当前时间的score数据,now为当前时间戳,使用StackExchange.Redis代码:
var redisList= _database.SortedSetRangeByScore(key, 0,now ); var list = redis.Select(p => (string)p).ToList();
当然别忘记了删除:
_database.SortedSetRemoveRangeByValue