.net redis ServiceStack Hash 緩存頁面點擊量實現

  因爲目前站點統計某頁面點擊量(刷新也算入點擊量),且每點擊進入一次頁面或刷新一次也沒都會向點擊量log表插入一條數據,因此該表日積月累的數據量必然很大,若是想根據該log查詢最熱門(及點擊量最多的頁面信息,則查詢比較耗時)。也考慮過新建一張點擊統計表,統計每一個頁面的點擊次數,點擊或刷新一次就在原來的基礎上+1,可是又考慮到用redis緩存,也能夠實現,且效率應該還不錯。開始考慮使用redis 的SortedSet(有序集合)來實現(爲了方便取 top 20),發現不可行。因而,redis Hash緩存頁面相關信息走起~~~~~redis

代碼以下:緩存

#region 車輛點擊量緩存
        //獲取全部競拍的點擊量
        public static Dictionary<string, string> GetAllAuctionClicks()
        {
            var result = new Dictionary<string, string>();
            if (!RedisSwitch)
                return result;

            try
            {
                var key = RedisKeyHelper.AllAuctionClicks();
                using (var client = RedisManger.GetReadwriteClient())
                {
                    if (client.ContainsKey(key))
                    {
                        result = client.GetAllEntriesFromHash(RedisKeyHelper.AllAuctionClicks());
                    }
                    return result;
                }
            }
            catch (Exception ex)
            {
                return result;
            }
        }

        //設置全部競拍的點擊量
        public static void SetAllAuctionClicks(Dictionary<string, string> clicksList)
        {
            if (!RedisSwitch)
                return;

            try
            {
                var key = RedisKeyHelper.AllAuctionClicks();
                using (var client = RedisManger.GetReadwriteClient())
                {
                    if (client.ContainsKey(key))
                    {
                        client.Remove(key);
                    }
                    client.SetRangeInHash(key, clicksList);
                }
            }
            catch (Exception ex)
            {
                return;
            }

        }

        //增長該AucId的點擊次數
        public static void IncrementAuctionClicks(int aucId)
        {
            if (!RedisSwitch)//開關關閉,則返回
                return;

            try
            {
                var key = RedisKeyHelper.AllAuctionClicks();
                using (var client = RedisManger.GetReadwriteClient())
                {
                    if (client.ContainsKey(key))
                    {
                        if (client.HashContainsEntry(key, aucId.ToString()))
                        //若是 該AucId在hash中,則對該AucId的次數加1,不然,加入一個新的Aucid,1 的key-value
                        {
                            client.IncrementValueInHash(key, aucId.ToString(), 1);
                        }
                        else
                        {
                            client.SetEntryInHash(key, aucId.ToString(), "1");
                        }
                    }
                }
            }
            catch
            {
            }
        }

        //獲取某一個aucid的點擊次數
        public static int GetAuctionClick(int aucId)
        {
            var result = 0;
            if (!RedisSwitch)//開關關閉,則返回
                return result;

            try
            {
                var key = RedisKeyHelper.AllAuctionClicks();
                using (var client = RedisManger.GetReadwriteClient())
                {
                    if (client.ContainsKey(key))
                    {
                        if (client.HashContainsEntry(key, aucId.ToString()))
                        //若是 該AucId在hash中,則取該AucId的點擊次數,不然點擊次數爲0
                        {
                            int.TryParse(client.GetValueFromHash(key, aucId.ToString()), out result);
                        }
                    }
                }
            }
            catch
            {
                return result;
            }
            return result;
        }
        #endregion
View Code
相關文章
相關標籤/搜索