這道面試題是這樣子的:
請用Redis和任意語言實現一段惡意登錄保護的代碼,限制1小時內每用戶Id最多只能登錄5次。具體登錄函數或功能用空函數即可,不用詳細寫出。
我乍看下覺得像是面試開發的題~
花了一下午了解了下redis,發現這貨似乎蠻簡單的,而且有哈希和列表數據結構.我一開始想用哈希,每個用戶為key,登陸時間為value,統計下now和now-1h之間的key數目是否大于5,類似這樣的sql
select count(user) from user_log where access between date_sub(now, interval 1 hour) and now().
但感覺這種范圍查找會比較慢.后來覺得用列表是個好方法:列表中每個元素代表登陸時間,只要最后的第5次登陸時間和現在時間差不超過1小時就禁止登陸.用Python寫的代碼如下,感覺蠻簡練的,如果網友有更巧妙的方法,歡迎指教.
#!/usr/bin/env python3
import redis
import sys
import time
r = redis.StrictRedis(host='127.0.0.1', port=6379, db=0)
try:
id = sys.argv[1]
except:
print('input argument error')
sys.exit(0)
if r.llen(id) >= 5 and time.time() - float(r.lindex(id, 4)) <= 3600:
print("you are forbidden logining")
else:
print('you are allowed to login')
r.lpush(id, time.time())
# login_func()