群發「站內信」的實現

2022-02-27 16:36:41 字數 4187 閱讀 5537

在很多**系統(如cms系統,sns系統等),都有「站內信」的功能。

「站內信」不同於電子郵件,電子郵件通過專門的郵件伺服器傳送、儲存。而「站內信」是系統內的訊息,說白了,「站內信」的實現,就是通過資料庫插入記錄來實現的。

「站內信」有兩個基本功能。一:點到點的訊息傳送。使用者給使用者傳送站內信;管理員給使用者傳送站內信。二:點到面的訊息傳送。管理員給使用者(指定滿足某一條件的使用者群)**訊息。點到點的訊息傳送很容易實現,本文不再詳述。下面將根據不同的情況,來說說「站內信」的**是如何實現的。

第一種情況,站內的使用者是少量級別的。(幾十到上百)

這種情況,由於使用者的數量非常少,因此,沒有必要過多的考慮資料庫的優化,採用簡單的**,對系統的設計也來的簡單,後期也比較容易維護,是典型的用空間換時間的做法。

資料庫的設計如下:表名:message

id:編號;sendid:傳送者編號;recid:接受者編號(如為0,則接受者為所有人);message:站內信內容;statue:站內信的檢視狀態;pdate:站內信傳送時間;

如果,某乙個管理員要給所有人發站內信,則先遍歷使用者表,再按照使用者表中的所有使用者依次將站內信插入到message表中。這樣,如果有56個使用者,則**一條站內信要執行56個插入操作。這個理解上比較簡單,比較耗損空間。

某乙個使用者登陸後,檢視站內信的語句則為:

select * from message where recid=『id』 or recid=0

第二種情況,站內的使用者中量級別的(上千到上萬)。

如果還是按照第一種情況的思路。那發一條站內信的後果基本上就是後台崩潰了。因為,發一條站內信,得重複上千個插入記錄,這還不是最主要的,關鍵是上千乃至上萬條記錄,message欄位的內容是一樣的,而message有大量的占用儲存空間。比方說,message欄位有100個漢字,占用200個位元組,那麼5萬條,就占用200×50000=10000000個位元組=10m。簡單的乙份站內信,就占用10m,這還讓不讓人活了。

因此,將原先的**拆分為兩個表,將message的主體放在乙個表內,節省空間的占用

資料庫的設計如下:

表名:message

id:編號;sendid:傳送者編號;recid:接受者編號(如為0,則接受者為所有人);messageid:站內信編號;statue:站內信的檢視狀態;

表名:messagetext 

id:編號;message:站內信的內容;pdate:站內信傳送時間;

在管理員發一封站內信的時候,執行兩步操作。先在messagetext表中,插入站內信的內容。然後在message表中給所有的使用者插入一條記錄,標識有一封站內信。

這樣的設計,將重複的站內信的主體資訊(站內信的內容,傳送時間)放在乙個表內,大量的節省儲存空間。不過,在查詢的時候,要比第一種情況來的複雜。

第三種情況,站內的使用者是大量級的(上百萬),並且活躍的使用者只佔其中的一部分。

大家都有這樣的經歷,某日看乙個**比較好,一時心情澎湃,就註冊了乙個使用者。過了一段時間,由於種種原因,就忘記了註冊時的使用者名稱和密碼,也就不再登陸了。那麼這個使用者就稱為不活躍的。從實際來看,不活躍的使用者佔著不小的比例。

我們以註冊使用者2百萬,其中活躍使用者只佔其中的10%。

就算是按照第二種的情況,發一封「站內信」,那得執行2百萬個插入操作。但是其中的有效操作只有10%,因為另外的90%的使用者可能永遠都不會再登陸了。

在這種情況下,我們還得把思路換換。

資料庫的設計和第二種情況一樣:

表名:message

id:編號;sendid:傳送者編號;recid:接受者編號(如為0,則接受者為所有人);messageid:站內信編號;statue:站內信的檢視狀態;

表名:messagetext 

id:編號;message:站內信的內容;pdate:站內信傳送時間;

管理員發站內信的時候,只在messagetext插入站內信的主體內容。message裡不插入記錄。

那麼,使用者在登入以後,首先查詢messagetext中的那些沒有在message中有記錄的記錄,表示是未讀的站內信。在查閱站內信的內容時,再將相關的記錄插入到message中。

這個方法和第二種的比較起來。如果,活躍使用者是100%。兩者效率是一樣的。而活躍使用者的比例越低,越能體現第三種的優越來。只插入有效的記錄,那些不活躍的,就不再占用空間了。

在很多**系統(如cms系統,sns系統等),都有「站內信」的功能。

「站內信」不同於電子郵件,電子郵件通過專門的郵件伺服器傳送、儲存。而「站內信」是系統內的訊息,說白了,「站內信」的實現,就是通過資料庫插入記錄來實現的。

「站內信」有兩個基本功能。一:點到點的訊息傳送。使用者給使用者傳送站內信;管理員給使用者傳送站內信。二:點到面的訊息傳送。管理員給使用者(指定滿足某一條件的使用者群)**訊息。點到點的訊息傳送很容易實現,本文不再詳述。下面將根據不同的情況,來說說「站內信」的**是如何實現的。

第一種情況,站內的使用者是少量級別的。(幾十到上百)

這種情況,由於使用者的數量非常少,因此,沒有必要過多的考慮資料庫的優化,採用簡單的**,對系統的設計也來的簡單,後期也比較容易維護,是典型的用空間換時間的做法。

資料庫的設計如下:表名:message

id:編號;sendid:傳送者編號;recid:接受者編號(如為0,則接受者為所有人);message:站內信內容;statue:站內信的檢視狀態;pdate:站內信傳送時間;

如果,某乙個管理員要給所有人發站內信,則先遍歷使用者表,再按照使用者表中的所有使用者依次將站內信插入到message表中。這樣,如果有56個使用者,則**一條站內信要執行56個插入操作。這個理解上比較簡單,比較耗損空間。

某乙個使用者登陸後,檢視站內信的語句則為:

select * from message where recid=『id』 or recid=0

第二種情況,站內的使用者中量級別的(上千到上萬)。

如果還是按照第一種情況的思路。那發一條站內信的後果基本上就是後台崩潰了。因為,發一條站內信,得重複上千個插入記錄,這還不是最主要的,關鍵是上千乃至上萬條記錄,message欄位的內容是一樣的,而message有大量的占用儲存空間。比方說,message欄位有100個漢字,占用200個位元組,那麼5萬條,就占用200×50000=10000000個位元組=10m。簡單的乙份站內信,就占用10m,這還讓不讓人活了。

因此,將原先的**拆分為兩個表,將message的主體放在乙個表內,節省空間的占用

資料庫的設計如下:

表名:message

id:編號;sendid:傳送者編號;recid:接受者編號(如為0,則接受者為所有人);messageid:站內信編號;statue:站內信的檢視狀態;

表名:messagetext 

id:編號;message:站內信的內容;pdate:站內信傳送時間;

在管理員發一封站內信的時候,執行兩步操作。先在messagetext表中,插入站內信的內容。然後在message表中給所有的使用者插入一條記錄,標識有一封站內信。

這樣的設計,將重複的站內信的主體資訊(站內信的內容,傳送時間)放在乙個表內,大量的節省儲存空間。不過,在查詢的時候,要比第一種情況來的複雜。

第三種情況,站內的使用者是大量級的(上百萬),並且活躍的使用者只佔其中的一部分。

大家都有這樣的經歷,某日看乙個**比較好,一時心情澎湃,就註冊了乙個使用者。過了一段時間,由於種種原因,就忘記了註冊時的使用者名稱和密碼,也就不再登陸了。那麼這個使用者就稱為不活躍的。從實際來看,不活躍的使用者佔著不小的比例。

我們以註冊使用者2百萬,其中活躍使用者只佔其中的10%。

就算是按照第二種的情況,發一封「站內信」,那得執行2百萬個插入操作。但是其中的有效操作只有10%,因為另外的90%的使用者可能永遠都不會再登陸了。

在這種情況下,我們還得把思路換換。

資料庫的設計和第二種情況一樣:

表名:message

id:編號;sendid:傳送者編號;recid:接受者編號(如為0,則接受者為所有人);messageid:站內信編號;statue:站內信的檢視狀態;

表名:messagetext 

id:編號;message:站內信的內容;pdate:站內信傳送時間;

管理員發站內信的時候,只在messagetext插入站內信的主體內容。message裡不插入記錄。

那麼,使用者在登入以後,首先查詢messagetext中的那些沒有在message中有記錄的記錄,表示是未讀的站內信。在查閱站內信的內容時,再將相關的記錄插入到message中。

這個方法和第二種的比較起來。如果,活躍使用者是100%。兩者效率是一樣的。而活躍使用者的比例越低,越能體現第三種的優越來。只插入有效的記錄,那些不活躍的,就不再占用空間了。

群發「站內信」的實現

在很多 系統 如cms系統,sns系統等 都有 站內信 的功能。站內信 不同於電子郵件,電子郵件通過專門的郵件伺服器傳送 儲存。而 站內信 是系統內的訊息,說白了,站內信 的實現,就是通過資料庫插入記錄來實現的。站內信 有兩個基本功能。一 點到點的訊息傳送。使用者給使用者傳送站內信 管理員給使用者傳...

群發「站內信」的實現

在很多 系統 如cms系統,sns系統等 都有 站內信 的功能。站內信 不同於電子郵件,電子郵件通過專門的郵件伺服器傳送 儲存。而 站內信 是系統內的訊息,說白了,站內信 的實現,就是通過資料庫插入記錄來實現的。站內信 有兩個基本功能。一 點到點的訊息傳送。使用者給使用者傳送站內信 管理員給使用者傳...

群發「站內信」的實現

在很多 系統 如cms系統,sns系統等 都有 站內信 的功能。站內信 不同於電子郵件,電子郵件通過專門的郵件伺服器傳送 儲存。而 站內信 是系統內的訊息,說白了,站內信 的實現,就是通過資料庫插入記錄來實現的。站內信 有兩個基本功能。一 點到點的訊息傳送。使用者給使用者傳送站內信 管理員給使用者傳...