36Close38
robinHoodOn the 2011-01-18 at 03:42pm
bon, j'ai un peu test redis smile

j'ai fait un truc bourrin qui gère un menu ac sous niveau infini, récursif

c'était un peu la merde de trouver un client potable sous php, j'ai finalement trouvé le fork d'un module écrit en C
<?php set_time_limit(0); global $redis; $redis = new Redis(); if( !$redis->connect('127.0.0.1') ) die('cannot fuck the database ...'); //$redis->flushAll(); $deltime = 0; $addtime = 0; $echotime = 0; $savetime = 0; $fastechotime = 0; function add2List($key,$data) { global $redis; $keylist = $key.':list'; $keynbentry = $key.':nbentry'; $idnewentry = $redis->incr($keynbentry); $keynewentry = $key.':'.$idnewentry; // get current list "number of elements" //$nb = $redis->zCard($keylist); //if(($nb+1) != $idnewentry) die('fuck : nb='.$nb.' id:'.$idnewentry); // append list, score will be "listsize + 1" $redis->zAdd($keylist, $idnewentry, $idnewentry); // fill new entry with data given $redis->set($keynewentry.':data',$data); return $keynewentry; } function delList_r($key) { global $redis; $keylist = $key.':list'; $list = $redis->zRange($keylist, 0, -1, true); $redis->delete($key.':nbentry', $key.':data', $key.':html'); foreach($list as $name => $value) delList_r($key.':'.$value); $redis->delete($keylist); } function getList_r($key,$first=1) { global $redis; $html = $redis->get($key.':html'); if($html !== false) return $html; $out = ''; if(!$first) $out .= '<li>'; $out .= $redis->get($key.':data'); $out . $ret[1]; $list = $redis->zRange($key.':list', 0, -1, true); if(!empty($list)) { $out .= '<ul>'; foreach($list as $name => $value) $out .= getList_r($key.':'.$value,0); $out .= '</ul>'; } if(!$first) $out .= '</li>'; return $out; } function saveListHtml($key) { global $redis; $redis->set($key.':html', getList_r($key)); } $menu = 'alpha:list:menu:menu_haut'; $nbiteration = 1000; $iteration = $nbiteration; $totalstart = microtime(true); while($iteration--) { $tstart = microtime(true); // suppression du menu précédent, par recursion delList_r($menu); $deltime += microtime(true) - $tstart; $tstart = microtime(true); // ajout d'entrées au menu $entry = add2List($menu,'bonjour'); $entry2 = add2List($menu,'hello'); $entrylvl2 = add2List($entry,'subbonjour'); add2List($entry,'subbonjour2'); add2List($entry,'subbonjour3'); add2List($entry,'subbonjour4'); $subentry5 = add2List($entry,'subbonjour5'); add2List($subentry5,'hello world !'); add2List($entrylvl2,'subsubbonjour'); add2List($entrylvl2,'subsubbonjour1'); add2List($entry2,'subhello'); add2List($entry2,'subhello2'); $addtime += microtime(true) - $tstart; $tstart = microtime(true); getList_r($menu); // affichage du menu, par recursion $echotime += microtime(true) - $tstart; $tstart = microtime(true); saveListHtml($menu); // sauve la sortie html du menu pour eviter la recursion $savetime += microtime(true) - $tstart; $tstart = microtime(true); getList_r($menu); // affichage du menu, doit utiliser la sauvegarde $fastechotime += microtime(true) - $tstart; } $totaltime = microtime(true) - $totalstart; print getList_r($menu); print '<b>completed '.$nbiteration.' in '.$totaltime.' seconds</b><br><br>average times :'; print '<br>delete old menu in '.(($deltime/$nbiteration)*1000).'ms'; print '<br>add to menu in '.(($addtime/$nbiteration)*1000).'ms'; print '<br>get menu in '.(($echotime/$nbiteration)*1000).'ms'; print '<br>save menu html in '.(($savetime/$nbiteration)*1000).'ms'; print '<br>fast get menu in '.(($fastechotime/$nbiteration)*1000).'ms'; ?>
voila le résultât du bench, je précise que j'ai un celeron 1.2GHz double cœur avec compiz qui tourne et plein d'autre conneries, de plus la base fait automatiquement un dump sur le disque des que 10000 clef ons été mise à jours/crées en moins de 60 secondes (donc ca dumpe pendant le bench)
Mdur

bon, je débute juste avec, la doc étais en rade quant j'ai écrit ce code (une nouvelle release du serveur étais en cour qui ma d'ailleurs fait gagner une seconde sur les 1000 itération love) donc c'est à l'arash, pas optimisé, mais c'est cool :- )