第一、基于内存轮询:
即:查(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