EQN

Testing procedure Redis per EQN...
connect("redis01"); $redis->set_error_function('redis_error'); #------------------------------------------------------ # VALORI DI CONFIGURAZIONE (portare su file ext!!!) #------------------------------------------------------ # ScoreList Posizioni $semaforo = "EQN:USERS:SEMAPHORE_TEST"; $tblPos = "EQN:USERS:POS"; $tblLast = "EQN:USERS:UPD"; $tblCanPos = "EQN:CANDIDATE:POS"; $tblCanLast = "EQN:CANDIDATE:UPD"; # timeout (x semaforo) IN SECONDI x gestione update POSIZIONI sul DB (cancello vecchi, inserisco nuovi): 60 sec (o meno...) $tOutSem_s = 10; # età massima dei valori a sistema (40 min x cancellare vecchi...) $maxAge_m = 40; # controllo se serve cleanUp $semOk=0; # Verifica SE ci sia semaforo rosso oppure se sia necessario a fine programma fare cleanUp function checkSemaforo($redis, $semaforo, $tOutSem_s) { // verifico semaforo... $answ=$redis->cmd('EXISTS', $semaforo )->get(); // se NON c'è lo creo if($answ==0) { $redis->cmd('SET', $semaforo, date("YmdHis")) ->cmd('EXPIRE', $semaforo, $tOutSem_s) ->set(); } return $answ; } function my_array_diff($a, $b) { $map = $out = array(); foreach($a as $val) $map[$val] = 1; foreach($b as $val) if(isset($map[$val])) $map[$val] = 0; foreach($map as $val => $ok) if($ok) $out[] = $val; return $out; } # effettua pulizia degli ORFANI tabelle REDIS UTENTI (POS che eccedono gli UPD) function cleanUpOrphan($redis, $tblPos, $tblLast) { echo "Chiamato CleanupOrphan
"; // recupero in blocco elenco user_ID da POS e da UPD... $answ=$redis->cmd('ZRANGE', $tblPos, 0, -1) ->cmd('ZRANGE', $tblLast, 0, -1) ->set(); $ar2del=my_array_diff($answ[0],$answ[1]); #$ar2del=array_diff($answ[0],$answ[1]); #print_r($ar2del); # solo se ci sono differenze... if(count($ar2del)>0) { # imposto transazione... $redis->cmd('MULTI'); $task=""; # inizio scrittura... for ($i = 0; $i < count($ar2del); ++$i) { $redis->cmd('ZREM', $tblPos, $ar2del[$i]); $task.='ZREM | '. $tblPos." | ".$ar2del[$i]."
"; } echo "Effettuata pulizia tabella:
".$task."
"; # chiamo vera esecuzione transazione $redis->cmd('EXEC')->set(); } else { ECHO "Tabelle allineate, nulla da cancellare..."; } } # conta quanti record ci siano nelle tab indicata function cntRec($redis, $tblReq) { // conteggio! $answ=$redis->cmd('ZCOUNT', $tblReq, '-inf', '+inf')->set(); // ritorno valore return $answ[0]; } # in primis check semaforo SE debba fare pulizia $semOk=checkSemaforo($redis, $semaforo, $tOutSem_s); # verifico semaforo $tOutPos2Db (se devo svuotare redis) if($semOk==0) { # effettuo scan dei CANDITATE POS, se NON li trovo in UPD li ELIMINO... cleanUpOrphan($redis, $tblCanPos, $tblCanLast); } # mostro infine count record rimasti!!! $num1=cntRec($redis, $tblLast); $num2=cntRec($redis, $tblPos); $num3=cntRec($redis, $tblCanLast); $num4=cntRec($redis, $tblCanPos); echo "
Check EQN:USERS: ".$num1." valori in ".$tblLast." | ".$num2." valori in ".$tblPos."
"; echo "
Check EQN:USERS: ".$num3." valori in ".$tblCanLast." | ".$num4." valori in ".$tblCanPos."
"; echo "Elapsed time (ms): ".StopWatch::elapsed()."
"; // esempio: // http://srv.earthquakenetwork.it/test_redis.php // https://github.com/ziogas/PHP-Redis-implementation // https://stackoverflow.com/questions/33196237/how-to-set-expire-when-using-redis-geoadd // https://redis.io/commands/zremrangebyrank ?>