企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
第一、基于内存轮询: 即:查(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