zoukankan      html  css  js  c++  java
  • 指定次数或者缓存过期时更新数据库

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Web.Caching;
    using System.Web;
    using System.Data;
    using System.Data.SqlClient;

    namespace TGBUS.Count
    {
        public class TGBUS_Handler : IHttpHandler
        {

            public void ProcessRequest(HttpContext context)
            {
                int _pid = 0;
                try
                {
                    if (context.Request.QueryString["pid"] != null && context.Request.QueryString["pid"].ToString() != "")
                    {
                        _pid = Convert.ToInt32(context.Request.QueryString["pid"].ToString());
                    }
                    CounterHelper objCounterHelper = new CounterHelper(_pid.ToString());
                    objCounterHelper.AddHits();
                    //context.Response.Write(string.Format("document.write('nums:{0}  id:{1}')", objCounterHelper.AllHits,context.Request.Url.AbsoluteUri));

                }
                catch(Exception ex)
                { }
            }

            public bool IsReusable
            {
                get
                {
                    return true;
                }
            }

        }

        #region 统计类
        public class CounterHelper
        {
            public int _Hits = 0; //累计的点击数
            private static int _HitsAll = 0;
            private int ProductId = 0;
            private string CacheName = "TGBUS_Hits";//缓存名称
            private object LockForAddHits = new object();//LockForAddHits锁
            private object LockForItemRemovedFromCacheHits = new object();//ItemRemovedFromCacheHits锁
            CacheItemRemovedCallback onRemove = null;//CacheItemRemovedCallback对象

            /**/
            /// <summary>
            /// 构造函数
            /// </summary>
            public CounterHelper(string _ProductId)
            {
                CacheName = CacheName + _ProductId;
                ProductId = Convert.ToInt32(_ProductId);
                HttpContext ctx = HttpContext.Current;
                LoadHits();
            }
            /// <summary>
            /// 加载点击数
            /// </summary>
            private void LoadHits()
            {
                if (HttpRuntime.Cache[CacheName] == null)
                {
                    _Hits = 0;
                }
                else
                {
                    _Hits = Convert.ToInt32(HttpRuntime.Cache["_temp" + CacheName].ToString());
                }
            }
            /// <summary>
            /// 将累计点击数保存到全局变量,当它达到一定量时保存到文本文件,并清空
            /// </summary>
            public void AddHits()
            {
                lock (LockForAddHits)
                {
                    if (HttpRuntime.Cache[CacheName] != null)
                    {
                        Add();
                        _HitsAll = Hits;
                        if (Hits > 500)
                        {
                            //--移除        
                                          
                            HttpRuntime.Cache.Remove(CacheName);
                        }
                    }
                    else
                    {
                        onRemove = new CacheItemRemovedCallback(ItemRemovedFromCache);
                        HttpRuntime.Cache.Insert(
                            CacheName,
                            "This Object For Expired",
                            null,
                            DateTime.Now.AddSeconds(20),
                            TimeSpan.Zero,
                            System.Web.Caching.CacheItemPriority.Normal,
                            onRemove
                            );
                        Add();
                        _HitsAll = Hits;
                    }
                }
            }

            /**/
            /// <summary>
            /// 当缓存被移除或过期是触发的回调事件
            /// </summary>
            /// <param name="key"></param>
            /// <param name="value"></param>
            /// <param name="reason"></param>
            private void ItemRemovedFromCache(string key, object value, CacheItemRemovedReason reason)
            {
                try
                {
                    #region 清空并写到数据库
                    int hits = 0;
                    lock (LockForItemRemovedFromCacheHits)
                    {
                        hits = _HitsAll;
                    }
                    if (hits == 0)
                    {
                        return;
                    }
                    else
                    {
                        SaveHits(hits);
                    }
                    #endregion
                }
                catch (Exception ex)
                {

                }
            }

            /// <summary>
            /// 保存点击数
            /// </summary>
            /// <param name="hits"></param>
            private void SaveHits(int hits)
            {
                string _Sql = "Update dbo].[Product] set [ViewsCount] = [ViewsCount]+" + hits + " where [ProductId]='" + ProductId + "'";
                TGBUS.DBUtility.SqlHelper.ExecuteNonQuery(TGBUS.DBUtility.SqlHelper.connectionString, CommandType.Text, _Sql);
            }

            /// <summary>
            /// 累加点击数
            /// </summary>
            private void Add()
            {
                _Hits = _Hits + 1;
                HttpRuntime.Cache["_temp" + CacheName] = _Hits;
            }
            //// <summary>
            /// 获取所有的点击数
            /// </summary>
            public int AllHits
            {
                get
                {
                    return Hits;
                }
            }

            /**/
            /// <summary>
            /// 获取累计的点击数
            /// </summary>
            private int Hits
            {
                get { return _Hits; }
                set { _Hits = value; }
            }
        }
        #endregion
    }

  • 相关阅读:
    Python3 collections模块的使用
    基于python的分治法和例题
    docker容器间通信 (共用宿主机)
    HTML之form表单ENCTYPE属性解析
    搭建基于码云gitee平台代码自动部署
    centos7下docker搭建nginx+phpfpm环境
    mysql主从配置
    centos7升级自带mariadb
    linux下安装docker
    centos7安装postgreSql11
  • 原文地址:https://www.cnblogs.com/goooto/p/1134032.html
Copyright © 2011-2022 走看看