天天看點

redis聊天室防刷屏

本項目将會限制同一個昵稱發送完全相同資訊的頻率。兩次完全相同的資訊的發送時間間隔不少于120 秒。

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(),修改代碼如下:

redis聊天室防刷屏

其中,主要代碼說明如下:

• 第13行代碼:先把資訊轉換為MD5 。這樣做的好處是:縮短資訊的長度,避免太長以緻于導出超出Redis Key的限制。

• 第14行代碼:把使用者昵稱與消息的MD5值拼成一個長字元串,作為Key 。

• 第15行代碼:在Redis中設定一個字元串, Key為“昵稱+消息的MD5 值”,值為1;通過ex 參數設定過期時間為120 ,過期時間一到Redis就會删除這個Key

修改後的代碼如圖6-20 所示。

讀取刷屏限制的剩餘時間

當使用者要發送新内容時,網站先檢查Red is 是否有“昵稱+新資訊MD 5 值”這個Key 。

• 如果有,則說明使用者在120 秒内發送了相同的内容。此時傳回解除刷屏限制的剩餘時間。

• 如果沒有,則傳回None 。

1. 設定查詢限制刷屏時間的方法

對應的方法為get_ nick_ msg_ expire_ time() 。完善以後的代碼如下:

redis聊天室防刷屏

其中,主要代碼說明如下。

• 第1 6 行代碼: 獲得消息的MD5 值。

• 第17 行代碼:把昵稱與消息的M D5 值拼成一個Key 。

• 第18 行代碼:使用Redis的“ 時”指令檢查Key的剩餘時間。如果Key不存在,則傳回None ;如果Key 沒有過期時間,傳回-1 ; 如果Key有過期時間,傳回剩餘時間(正整數)。

修改後的代碼如圖6 - 21 所示。

redis聊天室防刷屏