Redis计数器(StringIncrement),实现记录网页新闻的点击量

控制器

public class HomeController : Controller
{
    //如果是静态页面的话,我们也可以用ajax的方式,没点击一下,就请求一次。
    public async Task<ActionResult> Index(int? id)
    {
        if (id == null) return Content("新闻id不能为空");
        using (ConnectionMultiplexer redis = await ConnectionMultiplexer.ConnectAsync("192.168.31.126:6379"))
        {
            //默认是访问db0数据库,可以通过方法参数指定数字访问不同的数据库,例如:redis.GetDatabase(2);
            IDatabase db = redis.GetDatabase();

            //计数器(它是原子操作,不存在并发的问题)【应用场景:网站点击量,网络投票等】
            var key = "CMS_MyNews" + id.ToString() + Request.UserHostAddress+DateTime.Now.ToString("yyMMdd");

            //同一篇新闻。同一个IP,当天只能点击一次。多次点击不算点击量
            if (!await db.KeyExistsAsync(key))
            {
                db.StringIncrement(key, 1);//对点击量加1
            }
            
            long clickNumber = (long)await db.StringGetAsync(key);

            ClickNumberModel model = new ClickNumberModel();
            model.ClickNumber = clickNumber;
            return View(model);
        }
    }
}

视图

@model WebApplication2.Models.ClickNumberModel
@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        <h1>中国在世贸组织起诉美国301征税措施</h1>
        <div>据商务部消息,7月6日,中国在世贸组织就美国对华301调查项下正式实施的征税措施追加起诉。</div>
        <div>点击量:@Model.ClickNumber</div>
    </div>
</body>
</html>

模型

public class ClickNumberModel
{
    public long ClickNumber { get; set; }
}

猜你喜欢

转载自blog.csdn.net/Fanbin168/article/details/80952058