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記錄是否存在,存在的話就不計入總數。