标签:syn readonly c# ota 键值 src 输入 控制台 home
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记录是否存在,存在的话就不计入总数。
标签:syn readonly c# ota 键值 src 输入 控制台 home
原文地址:https://www.cnblogs.com/ROOKIEDEBUG/p/9213480.html