php中Redis的應用--訊息傳遞
訊息傳遞這一應用廣泛存在於各個網站中,這個功能也是一個網站必不可少的。本文主要介紹了php中Redis的應用--訊息傳遞。
閱讀目錄
1、摘要
2、實現方法
3、一對一訊息傳遞
4、多對多訊息傳遞
1、摘要
訊息傳遞這一應用廣泛存在於各個網站中,這個功能也是一個網站必不可少的。常見的訊息傳遞應用有,新浪微博中的@我呀、給你評論然後的提示呀、贊贊贊提示、私信呀、甚至是發微博分享的新鮮事;知乎中的私信呀、live傳送過來的訊息、知乎團隊訊息呀等等。
2、實現方法
訊息傳遞即兩個或者多個客戶端在相互發送和接收訊息。
通常有兩種方法實現:
第一種為訊息推送。
第二種為訊息拉取。所謂訊息拉取,就是客戶端自主去獲取儲存在伺服器中的資料。Redis內部沒有實現訊息拉取這種機制。因此我們需要自己手動編寫程式碼去實現這個功能。
在這裡我們,我們進一步將訊息傳遞再細分為一對一的訊息傳遞,多對多的訊息傳遞(群組訊息傳遞)。
【注:兩個類的程式碼相對較多,因此將其摺疊起來了】
3、一對一訊息傳遞
例子1:一對一訊息傳送與獲取
模組要求:
1、提示有多少個聯絡人發來新訊息
2、資訊包含傳送人、時間、資訊內容
3、能夠獲取之前的舊訊息
4、並且訊息能夠保持7天,過期將會被動觸發刪除
Redis實現思路:
1、新訊息與舊訊息分別採用兩個連結串列來儲存
2、原始訊息的結構採用陣列的形式存放,並且含有傳送人、時間戳、資訊內容
3、在推入redis的連結串列前,需要將資料轉換為json型別然後再進行儲存
4、在取出新資訊時應該使用rpoplpush來實現,將已讀的新訊息推入舊訊息連結串列中
5、取出舊訊息時,應該用舊訊息的時間與現在的時間進行對比,若超時,則直接刪除後面的全部資料(因為資料是按時間一個一個壓進連結串列中的,所以對於時間是有序排列的)
資料儲存結構圖:
PHP的實現程式碼:
#SinglePullMessage.class.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
|
測試:
1、傳送訊息
#建立test1.php
1 2 3 4 5 6 7 8 9 |
|
2、獲取新訊息
#建立test2.php
1 2 3 4 5 6 7 8 9 10 11 |
|
訪問結果:
3、獲取舊訊息
#建立test3.php
1 2 3 4 5 6 7 8 9 10 |
|
4、多對多訊息傳遞
例子2:多對多訊息傳送與獲取(即是群組)
模組要求:
1、使用者能夠自行建立群組,併成為群主
2、群主可以拉人進來作為群組成員、並且可以踢人
3、使用者可以直接退出群組
4、可以傳送訊息,每一位成員都可以拉取訊息
5、群組的訊息最大容納量為5000條
6、成員可以拉取新訊息,並提示有多少新訊息
7、成員可以分頁獲取之前已讀的舊訊息
。。。。。功能就寫這幾個吧,有需要或者想練習的同學們可以增加其他功能,例如禁言、匿名訊息傳送、檔案傳送等等。
Redis實現思路:
1、群組的訊息以及群組的成員組成採用有序集合進行儲存。群組訊息有序集合的member儲存使用者傳送的json資料訊息,score儲存唯一值,將採用原子操作incr獲取string中的自增長值進行儲存;群組成員有序集合的member儲存user,score儲存非零數字(在這裡這個score意義不大,我的例子程式碼中使用數字1為群主的score,其他的儲存為2。當然這使用這個資料還可以擴充套件別的功能,例如群組中成員等級)可參考下面資料儲存結構簡圖。
2、使用者所加入的群組也是採用有序集合進行儲存。其中,member儲存群組ID,score儲存使用者已經獲取該群組的最大訊息分值(對應群組訊息的score值)
3、使用者建立群組的時候,通過原子操作incr從而獲取一個唯一ID
4、使用者在群中傳送訊息時,也是通過原子操作incr獲取一個唯一自增長有序ID
5、在執行incr時,為防止併發導致競爭關係,因此需要進行加鎖操作【redis詳細鎖的講解可以參考:Redis構建分散式鎖//www.jb51.net/article/109704.htm】
6、建立群組方法簡要思路,任何一個使用者都可以建立群組聊天,在建立的同時,可以選擇時是否新增群組成員(引數通過陣列的形式)。建立過程將會為這個群組建立一個群組成員有序集合(群組資訊有序集合暫時不建立),接著將群主新增進去,再將群ID新增使用者所參加的群組有序集合中。
資料儲存結構圖:
PHP的程式碼實現:
#ManyPullMessage.class.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 |
|
測試:
1、建立createGroupChat.php(測試建立群組功能)
執行程式碼並建立568、569群組(群主為jack)
1 2 3 4 5 6 7 8 9 |
|
2、建立addMembers.php(測試新增成員功能)
執行程式碼並新增新成員
1 2 3 4 5 6 |
|
3、建立delete.php(測試群主刪除成員功能)
1 2 3 4 5 6 7 |
|
4、建立sendMessage.php(測試傳送訊息功能)
多執行幾遍,568、569都發幾條
1 2 3 4 5 6 7 8 9 10 11 |
|
5、建立getNewMessage.php(測試使用者獲取新訊息功能)
1 2 3 4 5 6 7 |
|
6、建立getPartMessage.php(測試使用者獲取某個群組部分訊息)
(多傳送幾條訊息,用於測試。568中共18條資料)
1 2 3 4 5 6 7 |
|
page=1,size=10
page=2,size=10
測試完畢,還需要別的功能可以自己進行修改新增測試。
這次整理這篇文章相對比較趕,心裡已經想著快點整理完趕緊學習其他的技術啦,哈哈。各位大神請留步,懇請各位給點學習redis的指導意見,本人職業方向是PHP
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支援指令碼之家!