LOCK should be something like this: <?php // type=0 -> unlock // type=1 -> lock // client_name must change (use sessionID + username) function memcache_flock($memcache_obj,$key,$type=0,$client_name='1',$timeout=0){ $ret=memcache_add($memcache_obj,$key,$client_name,false,$timeout); if($ret==true){ if($type==0) // delete memcache_del($memcache_obj,$key); return(true); } $cur_cli=memcache_get($memcache_obj,$key); if(is_string($cur_cli) && $cur_cli!=''){ // if ='' no user! if($cur_cli !== $client_name){ // it's not our lock if(check_user_online_function()) // http session function (if want http session integration), for memcached it´s like (true) return($cur_cli); // return current lock client_name } // our lock! }else{ // replace, autocorrect a wrong usage memcache_replace($memcache_obj, $key, $client_name, false, $timeout); } if($type==0) // delete? memcache_del($memcache_obj,$key); return(true); } ?>
2011/2/1 Adam Lee <a...@fotolog.biz>: > there are some excellent solutions out there already. check out, for > example, zookeeper. > > awl > > On Jan 29, 2011 3:32 PM, "rspadim" <rspa...@gmail.com> wrote: >> hi guys, there's a async replication project (repcached) that is very >> interesting, could we implement it in main source code? at compile >> time we could select from repcached or memcached >> could we make it sync and/or async? >> http://repcached.sourceforge.net/ >> >> ================================================================================= >> there's some non volatile solutions too that's very interesting >> (memcachedb), for low memory computers we can use disk >> could we implement it in main source code too? >> http://memcachedb.org/ >> >> >> ================================================================================= >> another, now !NEW! feature... >> >> i was looking for a *DISTRIBUTED LOCK MANAGER*, but i only found >> kernel linux lock manager, that's based on file system (flock) >> could we implement a lock manager at memcached? >> >> what lock manager do? >> client send: KEY NAME, lock type+client name (KEY VALUE), key timeout, >> wait lock timeout (infinity/seconds) >> (this can be implement in memcached protocol without many >> modifications!!!) >> server side function: >> 1)seek if client can have this lock >> 2)wait lock timeout... (this is a problem since we can have a very big >> wait time...) >> 3) if client disconect exit do while >> 4) yes we have the lock => change key value (give this lock to >> client), exit do >> 5) no we don't have the lock, exit do >> 6) end of do while... return key value: lock type + client name (like >> a get command) >> >> ideas: >> 1)maybe a separated memory size? we can run two separated servers, one >> for keys another for lock function (make command line options: just >> lock system, objects only system or both) >> >> 2)this type of key is diferent from memcached key cache objects, >> that's obvious >> >> but........ is managed with same functions... (get, list, etc) >> but........ >> all write/delete functions can't be done, they MUST be done by LOCK >> (the new) function, >> DELETE/UNLOCK function is a LOCK function with lock type=0 (unlock) >> read can be done by get and will return current client lock name and >> lock type (get command) >> >> >> >> *WHY THIS FEATURE?* >> i didn't found a distributed lock manager for user space (not kernel >> space) with easy to implement protocol, and many program languages, >> and a very mature server and protocol. >> =( >> >> but with this feature... >> I DON'T NEED A SAMBA/NFS SERVER FOR NON FILESYSTEM LOCKING!!!!! \o/ >> I WILL NEVER USE FLOCK() AGAIN!!! \o/ !!! >> >> I JUST NEED: >> MYSQL+MEMCACHED+ (APACHE+CGI/PHP/JAVA/PERL/PYTHON) >> for any cluster solution, no more filesystem!!! >> >> NO MORE FILESYSTEM REPLICATIONS (DRBD, NBD+RAID) FOR MY HIGH >> AVAIBILITY / CLUSTER SOLUTION!!!!! >> WE CAN USE REPCACHED (WE NEED A SYNC MODE).... >> >> THINK ABOUT IT!!! >> REPLICATION + FLOCK!!!!! IT'S A VERY VERY VERY NICE FEATURE!!!!! >> >> ==================== >> type of object (1bit) default / lock manager can be putted on key >> options/flags!!! >> inside key value, we can put: >> lock type(3 bits) >> client name (a variable length, many bytes) >> >> http://en.wikipedia.org/wiki/Distributed_lock_manager >> from wikipedia, TYPE OF LOCKS: >> * Null Lock (NL). Indicates interest in the resource, but does not >> prevent other processes from locking it. It has the advantage that the >> resource and its lock value block are preserved, even when no >> processes are locking it. >> * Concurrent Read (CR). Indicates a desire to read (but not >> update) the resource. It allows other processes to read or update the >> resource, but prevents others from having exclusive access to it. This >> is usually employed on high-level resources, in order that more >> restrictive locks can be obtained on subordinate resources. >> * Concurrent Write (CW). Indicates a desire to read and update the >> resource. It also allows other processes to read or update the >> resource, but prevents others from having exclusive access to it. This >> is also usually employed on high-level resources, in order that more >> restrictive locks can be obtained on subordinate resources. >> * Protected Read (PR). This is the traditional share lock, which >> indicates a desire to read the resource but prevents other from >> updating it. Others can however also read the resource. >> * Protected Write (PW). This is the traditional update lock, which >> indicates a desire to read and update the resource and prevents others >> from updating it. Others with Concurrent Read access can however read >> the resource. >> * Exclusive (EX). This is the traditional exclusive lock which >> allows read and update access to the resource, and prevents others >> from having any access to it. >> >> NEW LOCK FUNCTION: >> >> LOCK <key><lock_type><client name><timeout><wait lock timeout> >> >> key: key name >> <lock_type+client_name>=key value >> >> lock_type: >> NL = 0 >> CR = 1 >> CW = 2 >> PR = 3 >> PW = 4 >> EX = 5 >> >> client name: any value >> timeout: any number, 0=infinity >> wait lock timeout: wait lock time, 0=infinity >> >> how lock works: (see that lock type is only 0 or !=0 in this logic...) >> i will use <sent xxxx> for user new value, and <current xxx> for the >> current server value >> >> if key don't exists, create >> do{ >> if ((sent_lock_type = 0 and sent_client_name = current_client_name) >> or key_timed_out==1) >> remove key (delete) >> send null lock and sent_client_name information >> exit function >> }else if (sent lock type = (1 or 2 or 3 or 4 or 5), and current user >> = sent user) >> set >> current_client_name,current_lock_type=sent_client_name,sent_lock_type >> exit do >> }else{ >> if wait lock time < time waiting lock to occur >> exit do >> } >> }while(1) >> send current_lock_type and sent_client_name >> exit function >> >> >> thanks guys!!! > -- Roberto Spadim Spadim Technology / SPAEmpresarial