Việc triển khai tương tự với Stackoverflow thực sự đơn giản hơn nhiều so với bạn đã mô tả, dựa trên các bit thông tin bị nhóm giảm mỗi lần trong một thời gian.
Trong cơ sở dữ liệu, bạn chỉ cần lưu trữ bộ sưu tập của BadgeID
- UserID
cặp để theo dõi ai có cái gì (và đếm hoặc rowID để cho phép nhiều giải thưởng cho một số huy hiệu).
Trong ứng dụng, có đối tượng công nhân cho từng loại huy hiệu. Các đối tượng là trong bộ nhớ cache, và khi bộ nhớ cache hết hạn, người lao động chạy logic riêng của nó để xác định ai sẽ nhận được huy hiệu và làm cho các bản cập nhật, và sau đó nó lại chen thân 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 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); }
}
}
Nguồn
2010-07-01 23:52:35
Bạn muốn cache một số giá trị danh tiếng sử dụng trên máy chủ web mà không phải liên tục gọi đến dịch vụ windows. – Russell