2010-07-01 39 views
42

Tôi đã đưa ra một số suy nghĩ để thực hiện phù hiệu (giống như các huy hiệu ở đây trên Stack Overflow) và nghĩ rằng nó sẽ khó khăn mà không có dịch vụ Windows, nhưng tôi muốn tránh điều đó nếu có thể.Cách triển khai huy hiệu?

tôi đã đưa ra một kế hoạch để thực hiện một số ví dụ:

  • Audobiographer: Kiểm tra xem tất cả các lĩnh vực trong hồ sơ cá nhân sẽ được điền.
  • Commentor: Khi đưa ra nhận xét, hãy kiểm tra xem số bình luận có bằng 10 hay không, nếu có giải thưởng huy hiệu.
  • Câu trả lời hay: Khi kiểm tra phiếu bầu để xem điểm số phiếu bầu là 25 hay cao hơn.

Làm cách nào điều này có thể được triển khai trong cơ sở dữ liệu? Hay một cách khác sẽ tốt hơn?

+0

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

Trả lời

41

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); } 
    } 
} 
+0

wow. Đây là một ý tưởng tốt. Làm thế nào để bạn biết khi nào bộ nhớ cache hết hạn. Có giống như chức năng gọi lại mà bạn có thể gọi khi bộ nhớ cache hết hạn không? – Luke101

+0

@ Luke101 xem mã mẫu –

+1

@ Luke101: đó là tính năng của cơ sở hạ tầng bộ nhớ đệm .NET: khi hết thời gian chờ (và đối tượng sắp bị xóa khỏi bộ nhớ cache) thời gian chạy sẽ gọi lại cuộc gọi lại của bạn tự động. –

4

Công việc. Đó là chìa khóa. Các công việc ngoài quy trình chạy trong khoảng thời gian đã định để kiểm tra các tiêu chí mà bạn đề cập. Tôi không nghĩ rằng bạn thậm chí cần phải có một dịch vụ cửa sổ, trừ khi nó đòi hỏi một số nguồn lực bên ngoài để thiết lập các cấp. Tôi thực sự nghĩ rằng StackOverflow sử dụng công việc cũng như tính toán của họ.

+2

Tôi cũng nên thêm điều đó để tránh kiểm tra thủ công mọi người dùng mỗi lần bạn có thể muốn giữ một bảng hoạt động để bạn có thể có danh sách những người mà bạn muốn kiểm tra.Bạn rõ ràng không muốn lãng phí tài nguyên xử lý người dùng chưa có bất kỳ hoạt động nào gần đây. – spinon

+0

Việc làm có chạy tự động không? Tôi có thể tìm thêm thông tin về công việc ở đâu? – Luke101

+0

Công việc có thể được lên lịch để chạy trên cơ sở dữ liệu. Bạn xây dựng chúng và sau đó đặt khoảng thời gian mà chúng sẽ thực thi. Bạn sẽ nhận thấy trên SO rằng một khi bạn hoàn thành một hành động nó không nhất thiết phải thưởng cho bạn ngay lập tức. Vì vậy, tôi sẽ tưởng tượng họ có những thứ thiết lập để chạy mỗi vài phút hoặc lâu hơn. Nhưng tôi thực sự không có ý tưởng. Nhưng một chút chậm trễ không phải là một vấn đề lớn nhưng tôi sẽ đợi đến cuối ngày để xử lý. – spinon

0

Bạn có thể sử dụng trình kích hoạt và kiểm tra khi cập nhật hoặc chèn, sau đó nếu điều kiện của bạn được đáp ứng, hãy thêm huy hiệu. Điều đó sẽ xử lý nó có vẻ ít hơn. Bắt đầu kích hoạt bashing trong 3, 2, 1 ...

+6

Đây chính là loại trình kích hoạt lý do (hợp lệ) được băm. –

+0

Tôi đồng ý có nhiều nhược điểm của trình kích hoạt, nhưng IMHO chủ yếu xoay quanh việc không bao gồm logic nghiệp vụ trong lớp dữ liệu/cơ sở dữ liệu. Có bất kỳ vấn đề về hiệu suất hoặc hiệu lực nào phát sinh từ trình kích hoạt, nếu chúng được viết và triển khai đúng không? –

+0

các vấn đề về hiệu suất và hiệu lực có xu hướng phát sinh từ các tác nhân gây ra bởi vì chúng tương đối khó, rất khó quản lý. Chúng có tác dụng phụ, trong khi nói chung nó thường được chấp nhận rằng mã với các tác dụng phụ là một công thức cho thảm họa. Thật khó để tạo ra một trường hợp mạnh mẽ cho một hoạt động đơn lẻ (ví dụ như chèn) để âm thầm có - từ góc nhìn của người gọi - một số lượng không rõ các tác dụng phụ bổ sung cho hệ thống. –

0

nhận xét phải được lưu trữ bên trong cơ sở dữ liệu phải không? sau đó tôi nghĩ rằng có hai cách chính để làm điều này.

1) khi người dùng đăng nhập, bạn nhận được số lượng nhận xét. điều này không phải là cách tiếp cận mong muốn vì số lượng có thể mất rất nhiều thời gian

2) khi người dùng đăng nhận xét bạn có thể đếm và lưu trữ số lượng với chi tiết sử dụng hoặc bạn có thể kích hoạt thực hiện khi một bình luận được thêm vào. kích hoạt sau đó sẽ nhận được các chi tiết của bình luận vừa được tạo ra, lấy id người dùng, nhận được một số và lưu trữ mà chống lại người dùng trong một bảng của một số loại.

tôi thích ý tưởng về trình kích hoạt khi chương trình của bạn có thể trở lại w/out đang chờ máy chủ sql thực hiện công cụ của nó.

Các vấn đề liên quan