redis聊天室防刷屏

本項目將會限制同一個暱稱發送徹底相同信息的頻率。兩次徹底相同的信息的發送時間間隔很多於120 秒。ide


1. 理解限制刷屏的原理
Redis 自然就具備實現這一功能的能力。在Redis 中, Key 能夠設置過時時間。時間到了後
Red is 會自動刪除這個Key 。
那麼若是設置一個字符串呢?Key爲:「暱稱-發言內容",例如「 青南-我在灌水",而後把這個Key的過時時間設置爲120秒。這個字符串的值無所謂,隨便設置爲何均可以。那麼:若是要這個Key在Redis中,則說明這個用戶暱稱在120秒內己經發送過這條信息了: 若是這個Key不在Redis中,則說明這個用戶歷來沒有發送過這條信息,或者發送己經超過了兩分鐘,Key被Redis自動刪除了。
並且,Redis可使用「 時」命令查詢一個Key的過時時間還剩多少秒,這樣還能夠實現提醒功能。網站

2. 實現限制刷屏的方法
設置Key 的過時時間的方法爲set_nick_msg_expire_time(),修改代碼以下:spa

圖片.png

圖片.png

其中,主要代碼說明以下:圖片

• 第13行代碼:先把信息轉換爲MD5 。這樣作的好處是:縮短信息的長度,避免太長以至於導出超出Redis Key的限制。
• 第14行代碼:把用戶暱稱與消息的MD5值拼成一個長字符串,做爲Key 。
• 第15行代碼:在Redis中設定一個字符串, Key爲「暱稱+消息的MD5 值」,值爲1;經過ex 參數設定過時時間爲120 ,過時時間一到Redis就會刪除這個Key
修改後的代碼如圖6-20 所示。字符串

圖片.png


讀取刷屏限制的剩餘時間get

當用戶要發送新內容時,網站先檢查Red is 是否有「暱稱+新信息MD 5 值」這個Key 。
• 若是有,則說明用戶在120 秒內發送了相同的內容。此時返回解除刷屏限制的剩餘時間。it

• 若是沒有,則返回None 。class

1. 設置查詢限制刷屏時間的方法
對應的方法爲get_ nick_ msg_ expire_ time() 。完善之後的代碼以下:原理

圖片.png

其中,主要代碼說明以下。
• 第1 6 行代碼: 得到消息的MD5 值。
• 第17 行代碼:把暱稱與消息的M D5 值拼成一個Key 。
• 第18 行代碼:使用Redis的「 時」命令檢查Key的剩餘時間。若是Key不存在,則返回None ;若是Key 沒有過時時間,返回-1 ; 若是Key有過時時間,返回剩餘時間(正整數)。
修改後的代碼如圖6 - 21 所示。方法

圖片.png

相關文章
相關標籤/搜索