前言
一般用來寫東西的網站都會有一個編輯實時儲存的功能。對於使用者來說是一個非常實用的功能。作為一個個人部落格來說,雖然用處沒那麼明顯,但是還是想實現一下這個功能,就當是練練手吧。
實現思路
- 使用
WebSocket
來進行瀏覽器與伺服器的實時通訊; - 服務端使用
Redis
來快取實時編輯的文章(編輯時文章改動頻繁,頻繁讀寫資料庫操作不是個好的方案); - 服務端使用定時任務(如每天凌晨3點),將
Redis
快取的資料儲存到MySQL
資料庫中; - 瀏覽器端初次進入新增文章頁面時,使用
WebSocket
從服務端獲取資料(先從Redis
中查詢,如果沒有則再從MySQL
資料庫中查詢); - 瀏覽器端初次進入編輯文章頁面時,不需要從服務端獲取資料;
- 使用
Vue.js
的watch來監聽文章的變化,變化時使用WebSocket
向服務端傳送資料。 - 文章儲存時清空
Redis
和MySQL
中實時儲存的資料。
原始碼
Talk is cheap. Show me the code.
說明
本功能只是個人部落格後臺使用,沒有多賬戶體系,所以
Redis
和MySQL
中都是儲存一條記錄。如果需要按不同使用者來儲存的話,需要自行開發。程式碼比較多,具體的程式碼就不貼了,有興趣的可以去
我的GitHub
上檢視原始碼。這裡只說明一下各個檔案中程式碼的用處。
1. /server/util/draft-socketio.js
服務端WebSocket
服務,使用了socket.io
庫。
2./server/util/draft-redis.js
Redis
的set
和get
的公共方法。
3./server/util/redis-mysql.js
redisToMysqlTask
:定時同步Redis
資料到MySQL
資料的方法,使用了node-schedule
庫。getDraftPostFromMysql
:Redis
中不存在資料時,在MySQL
中查詢資料。clearDraftPostOfMysql
:從MySQL
中刪除資料(文章儲存後操作)。
4. /src/main.js
瀏覽器端先引入socket.io
,使用了vue-socket.io
和socket.io-client
庫。
import VueSocketio from `vue-socket.io`;
import socketio from `socket.io-client`;
Vue.use(VueSocketio, socketio(`http://localhost:9000`, {
path: `/testsocketiopath`
}));
複製程式碼
5./src/pages/Edit.vue
使用WebSocket
從服務端獲取資料,並實時將資料傳輸到服務端進行儲存。