第一、基于內存輪詢:
即:查(Memecached-Redis 簡稱 MR )狀態,決定……
例如:
零(0):--(初始化過程):
通過讀取mysql(等持久化數據庫)初始化 MR 的狀態:
Persistent database: 持久化磁盤數據(庫)
PD01= 一級持久化數據庫;
用PD和MR(不帶任何編號的時候,是個相對概念!)
1、flag_P1D_ishaveNewmember(標志位_注冊用戶被增、刪、改過了)
【1:數據鮮活!用戶沒有被增、刪過,所以不需要刷新MR數據;
【2:用戶被增、刪過了、或改過了,需要,刷新MR中數據;
【3:強制刷新MR中數據,一般用作,第一次初始化!!
*:而寫insert + update,此數據庫表的時候,就必須注意:
(1)數據庫的標志位: flag_P1D_ishaveNewmember 設置為: 1(簡稱PD標志1)
(2)緊接著,把MR的標志位: flag_MR_ishavaNewmembers馬上設置為:1
所以: 寫數據庫表+PD標志1+和MR標志1 此 三個步驟 具有 “原子性質”!
比如:2、flag_MR_ishavaNewmembers(標志位:有新注冊用戶了?)
關鍵狀態:0、1 (鮮活)狀態雷同了,和 2:不鮮活
*[-1:強制從(持久化)數據庫mysql,初始化會員信息;
[0:用戶信息在MR中是完整的,不需要初始化,直接用MR中的就好,(避免磁盤讀寫成功)干workerman干的活兒就好……;
[1:數據保持鮮活!不管用戶信息在MR中是不是完整的,不需要初始化,暫時直接用MR中的就好;
[2:有新用戶信息(用戶注冊了,或用戶信息增、刪了,所以也需要重新更新MR中的用戶信息;
[3:MR中的信息只是,不影響workerRun的修改,不需要從mysql等 中初始化
MR_tables
]
注意有關:
**使用MR時**, 的一套(新)邏輯:
原則上:
一、總是先查MR中的標志位: redis01_flag_mr_ishavaNewmembers;
1、沒查到?去mysql中查,轉步驟3(或執行程序塊33);
2、在MR中查到了,
判斷(1)不需要更新(如:標志位0==redis01_flag_ms_ishaveNewmembers)(數據鮮活!)太好了! …那么直接用MR中的數據就好;
判斷(2)需要更新(或陳舊了?! 即: 2==redis01_flag_ms_ishaveNewmembers)麻煩了...(程序塊33)老實去PD(mysql)中讀取吧……;
3、您費勁從Mysql中讀取數據,包括:
程序塊33:(Label33):
(1)標志位數據:Fflag_mr_ishavaNewmembers=1;
(2)標志位數據:去PD中,讀取用戶數據
第二部分、
持久化的新(一套)邏輯:
持久化的機制首要由:
MR中的:flag_M1R_isneedPersistence2pd01標志:
0:不需要持久化(或者說數據鮮活,沒有做過任何的增刪改)
1:
一般地:MR中的數據(相較PD而言)只做改就夠了,
真需要增、刪操作時候,應該原子化的:
A:(1)增刪PD (2)修改pd中標志位 (3)修改mr中標志位…… 然后由worker 自己更新mr中相應數據……以后,再繼續工作……;
B:MR中只做“改”的工作,
(1)改MR數據 (2)改MR(redis)的flag_M1R_isneedPersistence2pd01為2(需校正貨品了--注意和退貨有所區別,我們稱為“校貨”!)(3)就不做啥了,(而是等待Worker在適當的時機自動去持久化到PD
注意運行Worker(RunWorker)一般不做:大增(真增)、大刪(真刪)、大改(真改)這樣的持久化該做的工作……持久化由持久化專用模塊(比如PersistenceWorker專門(根據規則)去做!
2:需要持久化,但抽空持久化就OK;
3:需要馬上持久化,不惜阻塞別的進程(不惜阻塞別的Worker工作)
而:flag_P1D_isneedPersistence2pd01是:flag_M1R_isneedPersistence2pd01的初始值(而已)
========================================================================
一、用戶注冊:
1、寫用戶信息,失敗另說(返回唄);如果 成功,那么:
(1)寫Mysql中的標志位:flag_MR_ishavaNewmembers(標志位:有新注冊用戶了)!
(2)更新MR中的標志位:redis01_flag_MR_ishavaNewmembers;
一:flag_MR_ishaveNewmembers?(標志位:有新注冊用戶了?)
1、(讀數據庫mysql)
同理:
**有關增改刪(查)TimeTable的一套(新)邏輯:**
零(0):
初始化時:
第一次運行初始化:
(可檢查)mysql中的,flag_chushihuaAllTimetableData應該等于==1,否則啥也不做(返回)!!
當:1==flag_chushihuaAllTimetableData(即系統可以正常初始化)
則查:flag_HaveAllNewTimetableDatas(有新timetable_datas)==0,沒新timetable_datas信息,還是啥也不做!
當:1==flag_HaveAllNewTimetableDatas:
則進入foreach(遍歷 每個 用戶)
1、單個用戶的( Id== $idnum:
查他(它)的flag_haveNewTimetableData[$idnum]
(1)當flag_HaveAllNewTimetableDatas[$idnum] ==1(即此用戶的timetabledata完備,省事了……等著workerman 處理……!
(2)而當2==flag_HaveAllNewTimetableDatas[$idnum](即此用戶的timetabledata不完備,麻煩了……老實去Mysql中讀取更新吧; 更新完 (別忘記) 把{flag_HaveAllNewTimetableDatas[$idnum]=1;}
第三部分:
workerman們的干活兒(一套)邏輯:
一、
有數據更新嗎?
whither_haveWorkerdata
1、0==whither_haveWorkerdata (即啥活兒沒有),休息,啥也不用干(但是好像不能sleep);
2、0!=whither_haveWorkerdata:
(1)有用戶更新嗎?
(A)0==flag_MR_ishavaNewmembers,沒用戶更新,不太麻煩,去代碼塊 444:查單個用戶的timetableData就可以……
(B)0 !=flag_MR_ishavaNewmembers, 麻煩點, 去 代碼塊: 5555,更新 所有用戶列表;
……
(2)有(用戶的)Timetabledatas更新嗎?
(A)0==flag_MR_ishaveTimetableDatas,沒 timetableDatas更新,那干脆退出吧……
(B)0!=flag_MR_ishaveTimetableDatas[$idnum](某用戶的)timetable更新了,
[代碼塊444:] 更新此用戶的 TimetableData[$idnum], 更新完(別忘記:flag_MR_ishaveTimetableDatas=0