|
|
|
| Здравствуйте, я в данный момент разрабатываю для себя класс для работы с кешированиям и появилась потребность в возможности удалить кеш указывая лишь элемент древовидной структуры.
Пример ключей:
System/Config/DB
System/Config/Session
System/Config/UAC
Users/u192391/stats
Users/u28182/configs
|
Соответственно если я хочу удалить все настройки я указываю действие очистки "System/Config/"
<?php
$cache = new Cache();
$cache->flush_tree('System/Config');
?>
|
после чего все ключи, которые начинаются на "System/Config/" будут удалены.
Конечно я понимаю, что для подобных целей можно написать систему тегирования для memcached (примерно такую обсуждали на highload++ в этом году), но если нужно привязать к каждому ключу более, чем один тег она натыкается на аналогичные проблемы:
- при каждом сбросе по тегу\древу нужно полностью проходиться по всем элементам кеша, а их могут быть миллионы. Это будет создавать большую нагрузку на сервер кеша и эппликейшн сервер.
- по непонятным причинам не получается получить список всех ключей в кеше, memcached показывает что в кеше, например, 1310000 элементов, но достаёт лишь ~1/21 часть. Есть предположения, что это связано с какими-то ограничениями протокола или клиента.
Какие выходы для повышения производительности вы видите? Не хотелось бы проходиться по всем элементам, нужно придумать что-то более оригинальное.
Если нужно могу выложить свою библиотеку, но особого смысла не вижу - там стандартные методы.
Получение спика ключей происходит так:
<?php
// ...
if(! $items = $this->obj->getStats('items')) {
return false;
}
foreach($items['items'] as $slab_allocator => $data) {
$dump = array_values(array_keys($this->obj->getStats('cachedump', $slab_allocator, $data['number'] * 2))); // <- эту часть можно оптимизировать, но суть одна и та-же
foreach($dump as $key) {
// выполняем определённое действие с ключём...
}
}
return true;
// ...
?>
|
| |
|
|
|
|
|
|
|
для: @ndry
(12.08.2009 в 17:35)
| | хочу просто спросить , если можно,
memcached is a simple, yet highly scalable key-based cache that stores data and objects wherever dedicated or spare RAM is available for very quick access by applications. You use memcached in combination with your application and MySQL to reduce the number of reads from the database.
насколько понял кэшируется просто в неиспользуемую оперативную память
>показывает что в кеше, например, 1310000 элементов, но достаёт лишь ~1/21 часть
это не может быть связано с тем что при выделениях оперативной памяти под разные процессы часть элементов memcached просто затирается ? | |
|
|
|
|
|
|
|
для: heed
(12.08.2009 в 22:24)
| | - насколько понял кэшируется просто в неиспользуемую оперативную память
вы сами выделяете оперативную память для кеша, на практике же в высоконагруженых проектах выделяется множество серверов под эту цель. Memcached очень быстро работает из-за его архитектуры, фактически все методы в нём имеют сложность О(1), те время ответа не зависит от кол-ва элементов в кеше, а все задержки происходят лишь из-за передачи данных по TCP (или UDP) протоколу.
- это не может быть связано с тем что при выделениях оперативной памяти под разные процессы часть элементов memcached просто затирается ?
Элементы затираются только если вы их сами удалите, элемент "протухнет" (выйдет срок его годности) или если кол-во элементов в кеше занимает больше памяти, чем вы указали в настройках. | |
|
|
|
|
|
|
|
для: @ndry
(12.08.2009 в 17:35)
| | Странно, что на таком "не маленьком" форуме нету ни единого профессионала, который смог бы хотя-бы попытаться обсудить данную проблемму... | |
|
|
|