January 2026

S M T W T F S
     123
4 5678 910
11 12 1314151617
18 192021222324
25262728293031

Style Credit

Expand Cut Tags

No cut tags
Monday, June 4th, 2007 05:38 pm

Вопрос для программистов:

Предположим, у нас имеется некий кеш, который должен содержать произвольные данные. Данные имеют срок годности, для каждой единицы данных разный, который определяется клиентом. Есть два способа общаться с таким кешем:

1. Когда что-то кладется в кеш, клиент говорит срок годности (возьми А и держи 5 минут)
2. Когда что-то берется из кеша, клиент говорит срок годности (дай мне А не старше 5 минут)

Есть ли какие-то причины предпочитать один из этих способов другому, и если да, то какие?
(deleted comment)
Tuesday, June 5th, 2007 01:47 am (UTC)
Во втором случае из кеша ничего убирать нельзя? Всегда модет прийти клиент и попросить A за последнии 100 лет? А в первом через 5 минут А можно убирать, да?
Tuesday, June 5th, 2007 02:52 am (UTC)
А почему нельзя 1 и 2? :) В смысле раскидывать их по мелким суб-кешам с датой тухлости, при приходе запроса А не старше 5 минут заглядывается в суб-кеш который 0-5 минут. Размер субкеша будет не больше чем всё одним куском, поиск будет не медленнее чем одним куском.
Очистка может состоять в выкидывании суб-кеша -5-0 в урну :)
Разумеется, надо думать как именно разбить на суб-кеши -- даже наверное построить график распределения объектов по времени протухания.
Tuesday, June 5th, 2007 07:10 am (UTC)
Ну зачем ими сильно управлять :) Скажем, если всё честным образом укладывается в 5-минутные слоты, то выбор одного из кешей превращается в простую операцию вычисления индекса.
В случае, если скорость реакции кеша действительно супер-важна, отсечение ненужных кеш-деревьев из леса ускоряет поиск.

Другими словами нужно больше данных о том, как это должно работать :) Но лично мне кажется что от некоей уборщицы в кеше не убежать, значит будет логичнее хранить дату прокисания документа, чтобы минимализировать "а мы его пять минут назад убили" (скорость же важна) и как-то организовать очистку с пристрелом на нужды клиента (например очистка будет бить объекты когда время поиска в кеше подбирается к критическому).


Если лень писать самому то есть штуки типа EHCache, в которых и политики выселения запомненных элементов есть, и прочие мелкие нужности.
Tuesday, June 5th, 2007 05:45 am (UTC)
Если протухание определяется природой данных, то 1.
Если природой запросов, то 2.
Из эстетических хотя бы соображений. Не говоря о том, что во втором случае первое решение может не работать (не всегда срок годности данных известен при их кешировании).
Tuesday, June 5th, 2007 06:19 am (UTC)
а как во втором случае данные в кеше буду устаревать для самого кеша (не для клиента) ?
Tuesday, June 5th, 2007 06:38 am (UTC)
т.е. получатся при первом случае кешь будет точно знать когда данные устарели, во втором же ему придется выбирать какие данные освободить причем по не
вполне конкретным критериям.

предположим у нас в кеше есть данные которые запрашиваются часто, живут недолго, получить свежие мы может достаточно быстро и дешево. и другие которые должны жить долго,
запрашиваются несколько меньше но их свежая копия нам стоит дорого. при втором способе кешь не знает какие данные уже не актуальны, он всегда будет вынужден выбирать из "свежих"
поэтому может получится что будут удалены "дорогие" данные.

вообще второй способ вполне можно скомбинировать с первым, т.е данные в кеш имеют с ttl который указывается при store, но клиент может при запросе указать "свежесть" данных.
таким образом для разных данных можно получить разные политики комбинируя разные параметры.

P.S тут http://www.hpl.hp.com/techreports/1999/HPL-1999-69.html про cache policy для squid, может что для себя найдете полезного.
Tuesday, June 5th, 2007 07:52 pm (UTC)
При варианте номер раз кеш не будет перегружен старыми данными, что уменьшит время поиска в нем. Однако надо будет заводить и привязывать функцию очитски от времени, а это означает, что функция должна постоянно работать и вычищать устаревшие данные, что тоже съест чуток системных ресурсов.

Если использовать второй вариант, то на поиск данных клиентом уйдет времени больше чем при первом варианте, так как при поиске будет потрачено время на перелопачивание устаревшего материала.

Можно сделать промежуточный вариант где функция очистки не нужна для экономии ресурсов. Когда новые данные поступают в кеш, то он пролистывается с самого начала, находятся первые устаревшие данные и новые данные записываются поверх них. Таким образом каждое новое вхождение данных в кеш освобождает одну устаревшую ячейку. А дальше пользователь просит данные не старше времени икс. Тем самым немного, по сравнению со вторым вариантом, уменьшается время поиска, по сравнению с первым вариантом, немного уменьшается затраты на обслуживание временной-очищающей функции, однако немного повышаются системные затраты на запись данных в кеш. Что лучше - хрен его знает. ;)