zoukankan      html  css  js  c++  java
  • 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记录是否存在,存在的话就不计入总数。

      

      

  • 相关阅读:
    异步编程:利用委托实现的.NET历史上第一个异步编程模型
    C#:委托
    C#:方法参数之--扩展方法
    py实现ftp
    sftp接口机上传脚本
    通过telnet自动下载cfg配置文件
    下载bat脚本
    solairs11与solairs10 ftp服务的区别
    windows中ftp下载脚本(bat+vb)
    windows2008r2防火墙设置一例
  • 原文地址:https://www.cnblogs.com/ROOKIEDEBUG/p/9213480.html
Copyright © 2011-2022 走看看