C#使用Redis实现网站统计访问数或点赞数功能!

 1.安装.net操作Redis需要的NuGet包:

    这里推荐使用:StackExchange.Redis,在程序包管理器控制台输入命令install-package stackexchange.redis

      

   2.在Action下编写实现代码:

  

public class HomeController : Controller
    {
        private readonly static string keyPerfix = "Test_ClickTotal_";
        // GET: Home
        public async Task<ActionResult> Index(int Id=0)
        {
            using (ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379"))
            {
                IDatabase db = redis.GetDatabase(4);  //Redis默认有15个数据库,GetDatabase()中参数代表将数据存入那个数据中
                await db.StringIncrementAsync(keyPerfix+Id,1); //使用StringIncrementAsync来进行计数,效率很高

                string total = await db.StringGetAsync(keyPerfix + Id); //增加之后在读取出来
                ClickTotalModel totalModel = new ClickTotalModel { Total=Convert.ToInt32(total)};
                return View(totalModel);
            }
              
        }
    }

 

 

 

  3.调试结果:

  

  每次刷新进入界面时,点击数都会增加一次.

 

  4.当然有个问题,实际应用中一个用户或一个IP在一段时间内或永久时间只能算访问一次,后面的访问将不计入总数中:

  

public class HomeController : Controller
    {
        private readonly static string keyPerfix = "Test_ClickTotal_";
        // GET: Home
        public async Task<ActionResult> Index(int Id = 0)
        {
            using (ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379"))
            {
                IDatabase db = redis.GetDatabase(4);  //Redis默认有15个数据库,GetDatabase()中参数代表将数据存入那个数据中

                if (await db.KeyExistsAsync(keyPerfix + Request.UserHostAddress + Id) == false) //keyPerfix+访问者的IP地址+Id为 key,记录这个IP是否点击过
                {
                    //说明没有找到
                    await db.StringIncrementAsync(keyPerfix + Id, 1); //使用StringIncrementAsync来进行计数,效率很高

                    //这里就增加一条已经访问过的记录,key值要上面判断格式一致,value值随意,第三个参数表示一天后这条记录就失效
                    await db.StringSetAsync(keyPerfix + Request.UserHostAddress + Id, "true", TimeSpan.FromDays(1));


                    string total = await db.StringGetAsync(keyPerfix + Id); //增加之后在读取出来
                    ClickTotalModel totalModel = new ClickTotalModel { Total = Convert.ToInt32(total) };
                    return View(totalModel);
                }
                else
                {
                    //直接读出来
                    string total = await db.StringGetAsync(keyPerfix + Id);
                    ClickTotalModel totalModel = new ClickTotalModel { Total = Convert.ToInt32(total) };
                    return View(totalModel);
                }


            }

        }
    }

 

    我这个实现的方法是:通过IP为键值插入一条数据,有效时间为一天,计数前先判断是否该IP记录是否存在,存在的话就不计入总数。

 

  

 

  

posted @ 2018-06-22 14:59  an_blog  阅读(1668)  评论(1编辑  收藏