sql >> データベース >  >> RDS >> Sqlserver

バッジを実装するには?

    Stackoverflow に似た実装は、チームが時々ドロップする情報に基づいて、実際にはあなたが説明したよりもはるかに単純です.

    データベースには、BadgeID のコレクションを格納するだけです。 -UserID 誰が何を持っているかを追跡するためのペア (および、一部のバッジに複数の賞を与えるためのカウントまたは行 ID)。

    アプリケーションには、バッジの種類ごとにワーカー オブジェクトがあります。オブジェクトはキャッシュにあり、キャッシュの有効期限が切れると、ワーカーは独自のロジックを実行して、誰がバッジを取得する必要があるかを判断し、更新を行ってから、自分自身をキャッシュに再挿入します:

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

    具体的な実装:

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


    1. MySQL-列の文字を置き換える

    2. sarの防衛(およびそれを構成する方法)

    3. PreparedStatementのパラメーターを再利用しますか?

    4. セロリワーカーデータベース接続プール