最近又需要做乙個簡單的ip訪問限制。這一次經別人提醒,學到了另外一種方法去實現。這次是用memcache實現的。
需求
實現方法1:python + memcache
原理: 分析條件就是要知道這個ip在哪段時間內?當前的訪問次數是多少?
準備工作是安裝memcache和python的客戶端
思路:把ip作為key,把乙個unix時間戳和這個ip的訪問次數用'-'分隔符一起作為value, set到memcache中。 當乙個新的ip位址來的時候先set,然後如果這個ip位址不是第一次來的話,就要判斷做3個邏輯。
以下是實現**:
import memcache
def ip_limit(ip):
'''
return true if need to limit ip, otherwise return false
'''sep = '-'
mc = memcache.client(['127.0.0.1:11211'], debug=0)
now = int(time.time())
value = mc.get(ip)
if not value:
#set this ip the first time to access
#format is time-count
v = '%s%s%s' % (str(now), sep, '1')
mc.set(ip, v)
return false
else:
#last_access_time and access_times is string
value_list = value.split(sep)
#now last_access_time and access_times is int
last_access_time, access_times = int(value_list[0]), int(value_list[1])
if (now - last_access_time) <= config.ip_cold_time and access_times >= config.ip_max_access_times:
return true
elif (now - last_access_time) <= config.ip_cold_time:
access_times += 1
mc.set(ip, '%s%s%s' % (str(last_access_time), sep, str(access_times)))
return false
else:
mc.set(ip, '%s%s%s' % (str(now), sep, '1'))
return false
**裡面的config是乙個config.py檔案,用配置的方式配置多長時間(單位:秒)ip_cold_time 和 要限制的訪問次數
ip_max_access_times, 方便隨時可以修改。
實現方法2: 用python+資料庫mysql
具體: 建立一張ip表,表結構很簡單:ip_table(ip, varchar 20, access_time int)
查詢有沒有在單位時間內超過限制次數的邏輯大概如下:
def limit_ip(ip, now):
"""
return true if need to limit ip,otherwise return false
@ip: ip address that is '***.***.***.***'
@now: unix time, int
"""sql = """select count(*) as times from ip_table where ip = %s and access_time > %s and access_time < %s"""
access_times = conn.query(sql, (ip, now - config.ip_cold_time, now))[0]["times"]
if access_times < config.ip_max_access_times and access_times >= 0:
return false
return true
插入ip就很簡單了,直接insert就可以 了。
歡迎有其他ip限制方法的分享和有經驗的童鞋拍磚!
如何做研究
來自 在研究生期間,一開始大家都很迷惑,都不知道自己要幹什麼 該幹什麼?即便知道自己要幹什麼,也不知道從哪幹起?上次兩位老師跟我們交流了一下,下面是他們的心得 給乙個專案 解決方案 問題分塊 任務明細 一開始並不是所有的問題都會想到,但是起碼要有乙個大體的框架在心中,然後細化模組,對每乙個功能進行細...
如何做專案
1,以業務規則為綱,而不是業務實體 2,在思考和設計業務規則的時候,以業務核心為綱,什麼是業務核心,定義為,當前你最關注的,當前最不確定的那一部分。所以我現在不喜歡領域驅動,我喜歡業務驅動 其實可能二者是一碼事 那麼我這裡所說的業務驅動要怎麼驅動法呢?就先以上面兩條為起頭,然後再來說,業務規則,以找...
nginx如何做訪問限制和訪問控制詳解!
啟動請求頻率限制 limit req zone binary remote addr zone req zone 10m rate 1r s 限制請求 二進位制位址 限制策略的名稱占用10m空間 允許每秒1次請求 重啟服務並測試,這時候你會發現,如果你在一秒內做多次操作那就會彈出錯誤。1.基於主機 ...