PHP系統公告-發送通知給每個人

來源:互聯網
上載者:User
經常有這樣的經曆,就是登陸一個系統,會有一條系統訊息提示,而這條訊息是針對所有人的,那麼程式是如何區分哪些人已經看過這條訊息哪些人沒看過呢?(因為沒看過的人會有一個提示一直掛在頁頭,而看過的人這個提示會自動消失),請問這種效果用php是如何做到的,資料結構是如何設計?


回複討論(解決方案)

首先得有一個訊息列表,表裡面有個是否閱讀欄位就行了啊

首先得有一個訊息列表,表裡面有個是否閱讀欄位就行了啊

那要是有十萬個使用者,有的看過了有的沒看過 ,這個欄位怎麼標註啊?

這條訊息是誰發的,發給誰 表裡面也都需要記錄啊,這樣你就可以根據每個使用者的使用者id去讀取個人的訊息了


表結構
table1:message
msg_id msg_content publish_time

table2:read
msg_id user_id read_time


發布一條系統訊息 在message插入一條記錄即可
如:
123 “下午休息” 1414468731

看過的人在read表中插入一條記錄
123 5145 1414468745



判斷是否有未讀資訊

select * from message where msg_id not in (select msg_id from read where user_id = 5145)

如果你對sql效率關注 可以用下面的

select * from message where message left join (select* from read where user_id = 5145 )temp on message.msg_id = temp .msg_id where temp.user_id is null;




表結構
table1:message
msg_id msg_content publish_time

table2:read
msg_id user_id read_time


發布一條系統訊息 在message插入一條記錄即可
如:
123 “下午休息” 1414468731

看過的人在read表中插入一條記錄
123 5145 1414468745



判斷是否有未讀資訊

select * from message where msg_id not in (select msg_id from read where user_id = 5145)

如果你對sql效率關注 可以用下面的

select * from message where message left join (select* from read where user_id = 5145 )temp on message.msg_id = temp .msg_id where temp.user_id is null;

謝謝你的詳細回覆,這個方式我也考慮過,只是如果系統訊息發布多了的話,再加上使用者數量大,這樣子操作資料庫量就非常大了,假如有10W使用者,看一條系統訊息就有10W條記錄了,有沒有更簡單的方式呢?

這條訊息是誰發的,發給誰 表裡面也都需要記錄啊,這樣你就可以根據每個使用者的使用者id去讀取個人的訊息了

這是針對所有人的,所以這種推送模式不太合適



表結構
table1:message
msg_id msg_content publish_time

table2:read
msg_id user_id read_time


發布一條系統訊息 在message插入一條記錄即可
如:
123 “下午休息” 1414468731

看過的人在read表中插入一條記錄
123 5145 1414468745



判斷是否有未讀資訊

select * from message where msg_id not in (select msg_id from read where user_id = 5145)

如果你對sql效率關注 可以用下面的

select * from message where message left join (select* from read where user_id = 5145 )temp on message.msg_id = temp .msg_id where temp.user_id is null;

謝謝你的詳細回覆,這個方式我也考慮過,只是如果系統訊息發布多了的話,再加上使用者數量大,這樣子操作資料庫量就非常大了,假如有10W使用者,看一條系統訊息就有10W條記錄了,有沒有更簡單的方式呢?



哈哈 那考慮考慮 redis

10W 用使用者 需要15K記憶體標記使用者是否發送 每條訊息都是15K

1.讀取訊息 setbit msg_123 5415 1

2.判斷是否讀取 getbit msg_123 5415

訊息表有內容和userid,如果userid=0,表示該訊息為全域
使用者表中,可以增加一個欄位記錄查看過的訊息id,用逗號隔開,比如 1,20,123
看過一條就加一個訊息id
如果訊息比較頻繁,可以考慮單獨維護一個訊息查看記錄表,只有uid msgid兩個欄位,記錄已檢視

弄個表把看過的人裝起來???

沒有查詢到的就顯示給他




表結構
table1:message
msg_id msg_content publish_time

table2:read
msg_id user_id read_time


發布一條系統訊息 在message插入一條記錄即可
如:
123 “下午休息” 1414468731

看過的人在read表中插入一條記錄
123 5145 1414468745



判斷是否有未讀資訊

select * from message where msg_id not in (select msg_id from read where user_id = 5145)

如果你對sql效率關注 可以用下面的

select * from message where message left join (select* from read where user_id = 5145 )temp on message.msg_id = temp .msg_id where temp.user_id is null;

謝謝你的詳細回覆,這個方式我也考慮過,只是如果系統訊息發布多了的話,再加上使用者數量大,這樣子操作資料庫量就非常大了,假如有10W使用者,看一條系統訊息就有10W條記錄了,有沒有更簡單的方式呢?



哈哈 那考慮考慮 redis

10W 用使用者 需要15K記憶體標記使用者是否發送 每條訊息都是15K

1.讀取訊息 setbit msg_123 5415 1

2.判斷是否讀取 getbit msg_123 5415

再次謝謝你的協助!

訊息表有內容和userid,如果userid=0,表示該訊息為全域
使用者表中,可以增加一個欄位記錄查看過的訊息id,用逗號隔開,比如 1,20,123
看過一條就加一個訊息id
如果訊息比較頻繁,可以考慮單獨維護一個訊息查看記錄表,只有uid msgid兩個欄位,記錄已檢視

恩恩!這個可以考慮一下,目前也只有這個方式要方便一點啦

沒有查詢到的就顯示給他


恩!可以這樣子試試
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.