检测用户的快速活动

时间:2013-12-11 18:34:17

标签: asp.net asp.net-mvc asp.net-mvc-5

我正在创建一个ASP.Net MVC 5网站。在我的网站中,有一个投票系统与StackOverflow使用的投票系统非常相似。我已经成功创建了用户提交投票的系统。然而,SO的一个简洁特征是它阻止用户快速点击投票按钮(即投票太快)。目前我的投票类是这样的:

public class RestaurantReviewVote
{
    [Key]
    public int ID { get; set; }

    public virtual NormalUser User { get; set; }

    public virtual ItemReview Reivew { get; set; }

    [Range(-1, 1)]
    public int Value { get; set; }

    public DateTime Created { get; set; }
}

我的想法是做这样的事情:

rapidActivity = db.Votes.Where(v => v.User.Id == userId && (DateTime.UtcNow - v.Created < THRESHOLD)).Any();

但是,我认为每次用户提交投票时运行此操作都会对数据库造成太大压力。 (也许我错了)我怎样才能考虑到性能呢?

PS: 如果您认为有更好的方式来进行投票系统,请告诉我。我感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:2)

我认为你的解决方案对于限制选票是合理的。如果您不想每次都查询数据库,则始终可以缓存用户的上次投票时间。

这也可能是表现的边缘情况。如果检查仅在某人投票时发生,那么您不必在每次加载页面时受到这种惩罚。您可能无论如何都要进行其他查询以进行投票,因此您可以将其包装在您的Vote()方法中:

(请注意,您可以结合Where()和Any()方法)

public bool Vote(int restaurantId)
{
    if (db.Votes.Any(v => v.User.Id == userId && (DateTime.UtcNow - v.Created < THRESHOLD)) 
    {
        throw new VoteException("You are voting too quickly");
    }

    ...
}