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记录是否存在,存在的话就不计入总数。

      

      

  • 相关阅读:
    ① ts基础
    ⑦ 原型和原型链 作用域链
    ④ 小程序使用分包
    功能⑦ 小程序整合高德地图定位
    effective OC2.0 52阅读笔记(三 接口与API设计)
    effective OC2.0 52阅读笔记(二 对象、消息、运行期)
    effective OC2.0 52阅读笔记(一 熟悉Objective-C)
    perl的Getopt::Long和pod::usage ?
    安装你自己的perl modules
    Perl 之 use(), require(), do(), %INC and @INC
  • 原文地址:https://www.cnblogs.com/ROOKIEDEBUG/p/9213480.html
Copyright © 2011-2022 走看看