Memcached (класс)
[3.4.2]
Класс предназначен для работы с серверами
memcached
и использует библиотеку
libmemcached
.
Пример
Небольшой класс, реализующий функционал, аналогичный функционалу оператора
cache
, но хранящий скешированные резальтаты на сервере memcached:
@main[]
$m[^mcache::open[localhost]]
^m.cache[key2;10]{dt: $d[^date::now[]] ^d.sql-string[] ^sleep(3)}
@CLASS
mcache
@auto[]
$timeout(4) ^rem{
timeout, seconds
}
$retry_on_timeout(false) ^rem{
retry cache lock attempts
}
@open[connect-options]
$m[^memcached::open[$connect-options]]
@cache[key;expires;code][lock;i]
$result[$m.$key]
^if(!def $result){
^rem{
not cached yet
}
$lock[${key}-lock]
^while(!^m.add[$lock; $.value[$timeout] $.expires($timeout)]){
^rem{
another process got the lock, waiting ...
}
^for[i](1;$timeout*5){
^sleep(0.2)
$result[$m.$key]
^if(def $result){^break[]}
}
^if(def $result){
^break[]
}{
^if(!$retry_on_timeout){
^throw[$self.CLASS_NAME;Timeout while getting lock for key '$key']
}
}
}
^if(!def $result){
^rem{
we got the lock, processing the code
}
^try{
$result[$code]
$m.[$key][ $.value[$result] $.expires($expires) ]
}{}{
^m.delete[$lock]
}
}
}
In order to add comments you must
register
.
Copyright © 19972021 Art. Lebedev Studio |
http://www.artlebedev.ru
Дата обновления: 18.06.2012