Việc triển khai tương tự như Stackoverflow thực sự đơn giản hơn nhiều so với những gì bạn đã mô tả, dựa trên các bit thông tin được nhóm đưa ra sau một thời gian.
Trong cơ sở dữ liệu, bạn chỉ cần lưu trữ một bộ sưu tập BadgeID
- UserID
các cặp để theo dõi ai có cái gì (và số lượng hoặc một ID hàng để cho phép nhiều giải thưởng cho một số huy hiệu).
Trong ứng dụng, có một đối tượng công nhân cho mỗi loại huy hiệu. Đối tượng đang ở trong bộ nhớ cache và khi bộ nhớ cache hết hạn, worker sẽ chạy logic của riêng nó để xác định ai sẽ nhận được huy hiệu và thực hiện cập nhật, sau đó nó tự chèn lại vào bộ nhớ cache:
public abstract class BadgeJob
{
protected BadgeJob()
{
//start cycling on initialization
Insert();
}
//override to provide specific badge logic
protected abstract void AwardBadges();
//how long to wait between iterations
protected abstract TimeSpan Interval { get; }
private void Callback(string key, object value, CacheItemRemovedReason reason)
{
if (reason == CacheItemRemovedReason.Expired)
{
this.AwardBadges();
this.Insert();
}
}
private void Insert()
{
HttpRuntime.Cache.Add(this.GetType().ToString(),
this,
null,
Cache.NoAbsoluteExpiration,
this.Interval,
CacheItemPriority.Normal,
this.Callback);
}
}
Và một cách triển khai cụ thể:
public class CommenterBadge : BadgeJob
{
public CommenterBadge() : base() { }
protected override void AwardBadges()
{
//select all users who have more than x comments
//and dont have the commenter badge
//add badges
}
//run every 10 minutes
protected override TimeSpan Interval
{
get { return new TimeSpan(0,10,0); }
}
}