不少軟件組件,你們都能想到了,你們也能作出來,可是成熟穩定、可靠、易用、功能全面,可信任,可相信,可開源就不是很容易,須要樹立良好的口碑才能夠。redis
1:每每會有黑客,進行撞庫挖掘漏洞,不少系統的帳戶有可能被猜想出密碼來,會存在嚴重的安全問題。數據庫
2:所有加上圖片驗證碼等,用戶體驗比較差,每天用的用戶會很難受。安全
3:惡意刷屏、大數據查詢有惡意查詢時,服務器進入惡性循環,數據庫壓力會過大,爲了防止進入惡性循環,能控制調用頻率比較好。服務器
4:對外,對內提供接口調用時,合做夥伴,內部接口調用頻率太高時,服務器的壓力會多大,網絡流量也會過大,系統進入惡性循環。網絡
5:爲了有良性的信息系統,有強大的組件支撐,能夠保證整個生態系統的平穩運行。函數
調用方法以下:大數據
bool result = false; result = DotNet.Business.PooledRedisHelper.CallLimit("ip, 手機,url", 50, 5);url
System.Console.WriteLine("result:" + result.ToString());spa
限制調用次數的功能,作了一個通用的函數,如有須要歡迎你們使用。code
什麼資源,多少分鐘內,限制調用多少次。 全自動的,返回 true, 表示,已經到達了限制次數了, false 能夠繼續調用的意思。
//----------------------------------------------------------------- // All Rights Reserved , Copyright (C) 2015 , Hairihan TECH, Ltd. //----------------------------------------------------------------- using System; using System.Configuration; using ServiceStack.Redis; namespace DotNet.Business { /// <summary> /// 調用頻率限制獨立的庫。 /// /// 修改紀錄 /// /// 2015-09-25 版本:1.0 JiRiGaLa 建立主鍵。 /// /// <author> /// <name>JiRiGaLa</name> /// <date>2015-09-25</date> /// </author> /// </summary> public sealed partial class PooledRedisHelper { // 數據庫 public static int InitialDbCallLimit = 78; private static PooledRedisClientManager instanceCallLimit = null; public static PooledRedisClientManager InstanceCallLimit { get { if (instanceCallLimit == null) { if (ConfigurationManager.AppSettings["RedisHosts"] != null) { Url = ConfigurationManager.AppSettings["RedisHosts"]; } if (string.IsNullOrEmpty(Url)) { Url = "redis.ztosys.com:6379"; } instanceCallLimit = new PooledRedisClientManager(InitialDbCallLimit, new string[] { Url }); } return instanceCallLimit; } } public static IRedisClient GetCallLimitClient() { return InstanceCallLimit.GetClient(); } /// <summary> /// 是否在指定的時間內,已經到了呼叫限制次數 /// 什麼鍵名,什麼鍵值,在多少時間內,限制調用幾回 /// 2015-09-25 吉日嘎拉 /// </summary> /// <param name="keyName">鍵名</param> /// <param name="minutes">過時時間,多少時間裏</param> /// <param name="limit">限制次數</param> /// <returns>是否超過限制</returns> public static bool CallLimit(string keyName, int minutes, int limit) { return CallLimit(keyName, DateTime.Now.AddMinutes(minutes), limit); } public static bool CallLimit(string keyName, DateTime expireAt, int limit) { bool result = false; using (var redisClient = PooledRedisHelper.GetUserClient()) { if (redisClient.ContainsKey(keyName)) { result = redisClient.IncrementValue(keyName) > limit; } else { redisClient.IncrementValue(keyName); // 設置過時時間 redisClient.ExpireEntryAt(keyName, expireAt); } } return result; } } }