1. 首页>
  2. 技术文章>
  3. 使用redis的zadd+socre做过期取消订单

使用redis的zadd+socre做过期取消订单

9/17/22 10:55:26 AM 浏览 1026 评论 0

redis

场景:下单后如果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


网友讨论