Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
# Использование
v = DataCache.get_or_evaluate("key", 10.seconds) do
5 + 5 # evaluation block
end
# берет значение из кэша.
# возвращает его, если оно актуально, или если новое значение кем-то вычисляется.
# иначе устанавливает признак вычисления, вычисляет, пишет в кэш и возвращает.
def get_or_evaluate(key, expiry = 0)
return yield if @impl.nil?
key_in_eval = "#{key}:in_eval"
key_expiry_at = "#{key}:expiry_at"
@impl.add(key_in_eval, 0, 0, true) rescue nil
loop do
val = get(key)
in_eval = ((@impl.get(key_in_eval, true) || 0) rescue 0).to_i
expiry_at = ((@impl.get(key_expiry_at, true) || 0) rescue 0).to_i
logger.debug("In eval: #{in_eval}, Expiry at: #{expiry_at}, Now: #{Time.now.to_i}")
return val if val && (in_eval > 0 || expiry_at >= Time.now.to_i)
begin
break if @impl.incr(key_in_eval, 1) == 1
return val if @impl.decr(key_in_eval, 1) == 1
rescue
return val
end
sleep 0.1
end
delete(key_expiry_at)
begin
val = yield
set(key, val)
@impl.set(key_expiry_at, Time.now.to_i + expiry, 0, true)
ensure
@impl.decr(key_in_eval, 1)
end
val
end
$data = MC::get('some_key');
if ($data === FALSE)
{
sleep(60);
$data = "test string";
MC::set('some_key', $data, FALSE, 3600);
}
while(1) {
$res = $mc->add($key . '_in_progress', getmypid());
if ($res !== FALSE) {
$value = someHardFunction(); // TODO: DI
$mc->set($key, $value);
$mc->delete($key . '_in_progress');
return $value;
}
while($mc->get($key . '_in_progress') !== FALSE) {
usleep(100);
}
$value = $mc->get($key);
if ($value !== FALSE) {
return $value;
}
}
return (is_array($value) &&
isset($value['_dc_life_end']) && isset($value['_dc_cache_time']) &&
!empty($value['_dc_life_end']) && !empty($value['_dc_cache_time'])
) ? TRUE : FALSE;
return !empty($value['_dc_life_end']) && !empty($value['_dc_cache_time'];
return (is_array($value) &&
isset($value['_dc_life_end']) && isset($value['_dc_cache_time']) &&
!empty($value['_dc_life_end']) && !empty($value['_dc_cache_time'])
);
error_reporting(2147483647);
$a = 'qwerty';
var_dump(isset($a[2]), $a[2], isset($a[9]), $a[9], isset($a['some_key']), $a['some_key']);
error_reporting(2147483647);
$a = 5.7;
var_dump(isset($a[2]), $a[2], isset($a[9]), $a[9], isset($a['some_key']), $a['some_key']);
$a = new stdClass;
$a = array('a' => 111);
$a = (object)$a;
var_dump(isset($a[0]), $a[0], isset($a[9]), $a[9], isset($a['some_key']), $a['some_key']);
Lock-free memcache API