|
|
|
Задача, минимизация ошибок кэша на основе частоты доступа
|
|||
|---|---|---|---|
|
#18+
Есть кэш, элементы в нем запрашиваются с разной частотой, и элементы устаревают. Например по ключу "А" идет 100 запросов в минуту, а по ключу "Б" всего 2. Каждый раз когда кэш возвращает устаревшее (неверное) значение - мы засчитываем ему ошибку. Поэтому если оба ключа устареют - по "А" будет засчитано 100 ошибок в минуту, а по ключу "Б" всего 2 ошибки. Как придумать алгоритм обновления значений в кэше который будет учитывать частоту обращения и минимизирует ошибки? Нужно также учитывать что ресурсы ограничены и мы можем обновлять всего 10 значений кэша в минуту. Как нам распределить ресурсы оптимально - нужно ли обновлять "А" 9 раз а "Б" 1 раз? Или 7 и 3 раза соответсвенно? Как расчитать это? Нам нужна функция которая примет на вход статистику обращений кэша и выдаст индивидуальный TTL для каждого значения в кэше. П.С. Интересно как практическое / эмпирическое решение так и теоретическое. К какому классу алгоритмов относится эта задача? Например поиск зависимости относится к классу алгоритмов работы с графами. А эта задача какого типа? Спрашиваю в Java потому-что в Java много задач на алгоритмы :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 15:13 |
|
||
|
Задача, минимизация ошибок кэша на основе частоты доступа
|
|||
|---|---|---|---|
|
#18+
Может быть я становлюсь тупой, но я задачи не понимаю: авторЕсть кэш, элементы в нем запрашиваются с разной частотой, и элементы устаревают. Например по ключу "А" идет 100 запросов в минуту, а по ключу "Б" всего 2. понятно авторКаждый раз когда кэш возвращает устаревшее (неверное) значение - мы засчитываем ему ошибку. Понятно наполовину, "кэш возвращает устаревшее (неверное) значение" - предполагаю, что понимаю "неверное значение - мы засчитываем ему ошибку" - не понимаю. Откуда мы знаем, что значение не верное? Для этого мы должны знать оба значения и то, которое вернул кэш и правильное, что бы их сравнить. Он если мы знаем правильное, то почему-бы его и не возврашать? авторПоэтому если оба ключа устареют - по "А" будет засчитано 100 ошибок в минуту, а по ключу "Б" всего 2 ошибки. Вот это уже вне моего понимания, обычно кэш обновляет се6я (на то он и кэш). Если кэш понимает, что данные "устарели" или "неверные", то кол-во "ошибок" / "промахов" ни как не связано с частотой запроса данных Запросили элемент A, вернули старый, обновили элемент A - одна ошибка Запросили элемент B, Вернули старый, обновли элемент B - одна ошибка Еще 99 раз запросили элемент A, вернули обновленную версию - ошибки нет IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 15:56 |
|
||
|
Задача, минимизация ошибок кэша на основе частоты доступа
|
|||
|---|---|---|---|
|
#18+
private, Ну, а ключ от квартиры где деньги лежат Вам не нужно? У Вас что-то несуразное наворочено. 1. Есть Кеш. 2. Каждый раз когда мы его читаем мы проверяем истинность его значения. Интересно как, ну просто прочитав оригинал и сравнив что-ли? Кеш-то тогда зачем или мы не ждем результата, а проверяем его в отдельной задаче? 3. Что-то мешает нам создать еще один поток, который будет выбирать один самую ошибающуюся запись в кеше и обновлять ее (хотя чует мое сердце это приведет к прямо противоположному эффекту ) (не чаще 10 раз в минуту) а потом еще раз и еще раз... P.S. Общая функция выбора кандидата должна быть тем выше, чем выше вероятность, что его прочтут (большая ошибка как-бы намекает на это) и тем меньше чем меньше время жизни этого объекта (большая ошибка тоже как-бы намекает на это). Поэтому при больших ошибках все показания выкинуть объект из кеша и больше никогда не загружать. По хорошему - Вам надо знать частоту обращений к элементу кеша и среднее время "правильной" жизни каждого элемента. Тогда будете представлять какие элементы оставлять. А инвалидировать по первой же ошибке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 16:02 |
|
||
|
Задача, минимизация ошибок кэша на основе частоты доступа
|
|||
|---|---|---|---|
|
#18+
P.S. вроде исходный вопрос при первом прочтении и понятен, но при втором - становится не понятно совершенно. Попытаюсь погадать на хрустальном шаре. 1) Т.к. если кеш и получатель результата имеет доступ к внешним данным (можем их сравнить и понять факт ошибки) - то по самой природе кеша, что обычно под этим понимается, проблемы нет. 2) Частота ошибок никак не связана с кол-вом запросов, максимум с частотой обновления информации в БД. 3) Если у нас не стандартный кеш, а некоторый Read Ahead Buffer ))) и у нас отсутвует или усложнен доступ к внешним данным (например внешний поставшик, у которого данные купили/воруем через I-net), то совершенно не понятно, как мы определяем факт "ошибки" 3.1. факт ошибки мы определить НЕ можем. Только "эмперически" отдельными эксперементами не связанными с эксплуатацией, но это вроде противоречит описанию проблемы в исходном посте 3.2. понятно, что должны найти некоторый баланс между двумя взаимо исключающими ситуациями: a) уменьшить объем данных получаемых с внешнего источника. Можно уменьшить частоту опроса. Но здесь мы должны базироваться не на "частоте запросов/статистику кеша", а на "кол-во обновлений данных в БД/статистику источника данных" b) уменьшить объем ситуаций (увеличить актуальность), когда мы выдаем получателю некорректные данные. Те данные, которые запрашивают чаще, так же чаще обновлять. Но здесь принципиально, что мы НЕ можем в момент отдачи понять, актуальные у нас данные или ошибка. Т.к. если бы могли, то и проблемы бы не было ))) c) Объединяя a+b вмести, уменьшить "убытки" от выдачи неактуальной информации. Чисто арифметически, если у нас есть 101 пользователь, 100 пользователей запрашивающие информацию A и 1 запрашивающий информацию B ==> то выгоднее вообще B послать лесом ))) т.к. уменьшив кол-во пользователей на < 1%, мы сэкономим затраты на 50%. Если все "платят" одинаково, то чистая прибыл вырастит так же практически в 2 раза ))) Но это чисто арифметически ))) Практически, возможно, что именно информация B и является "бизнес критикал", "ценной" и "know how". Т.ч. исключив ее, мы потеряем ни одного пользователя, а всех ))). В общем, в универсальный алгортм не верю. А проблема баланса, выглядит бизнес моделью, чем каким либо програмным алгоритмом. Общую формулу вывести легко. На уровне арифметики 3-4 класса средней школы: прибыл = доходы /удовлетворенные клиенты/ - расходы /запросы данных/ - убытки, штрафы за неправильный ответ от не удовлетворенных клиентов собрав статистику ошибок и обращений - можно понять процент ошибок по разным ГРУППАМ товаров / данным. См. ABC анализ в складской деятельностью. рентабельность = оборот / прибыл ну и некоторая показатель качества бизнеса. Качество = все возможные доходы (удовлетворенные клиенты + возможная прибыль от если бы неудовлетворенных клиентов считать удовлетворенными) / реальные доходы (удовлетворенные клиента - убытки от неудовлетворенных клиентов). Задача максимизировать рентабельность и качество услуг ))) IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 16:33 |
|
||
|
Задача, минимизация ошибок кэша на основе частоты доступа
|
|||
|---|---|---|---|
|
#18+
авторПонятно наполовину, "кэш возвращает устаревшее (неверное) значение" - предполагаю, что понимаю "неверное значение - мы засчитываем ему ошибку" - не понимаю. Откуда мы знаем, что значение не верное? Для этого мы должны знать оба значения и то, которое вернул кэш и правильное, что бы их сравнить. Он если мы знаем правильное, то почему-бы его и не возврашать? Мы знаем верное значение только во время тестирования алгоритма, чтобы измерит насколько хорошо он работает. Во время реальной работы мы не знаем точное значение и не можем оценить точность. Хмм, никто не понял..., может я действительно неверно описал... :) Опишу по другому. Задача: Мы создали зеркало (копию) википедии. В википедии есть страница про "Бритни Спирс" с посещаемостью 100хитов/мин, и про "Садоводство" с посещаемостью 2хита/мин. Каждый раз когда человек заходит на наше зеркало, и видит старую страницу - это считается ошибкой. Поэтому если обе страницы устареют - мы получим 100 ошибок с "Бритни Спирс" и 2 ошибки с "Садоводство", т.е. 102 ошибки в минуту. Наши ресурсы ограничены и мы можем делать всего-лишь 10 запросов в день в оригинальную википедию. Как распределить эти обновления чтобы свести ошибки к минимуму? Нужно-ли обновлять "Бритни Спирс" 9 раз в день а "Садоводство" всего 1 раз? Как узнать это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 17:53 |
|
||
|
Задача, минимизация ошибок кэша на основе частоты доступа
|
|||
|---|---|---|---|
|
#18+
privateустаревшее (неверное) значениеExpired ? Если так, то можно запилить фоновую задачу, которая и будет обновлять кэш. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 18:08 |
|
||
|
Задача, минимизация ошибок кэша на основе частоты доступа
|
|||
|---|---|---|---|
|
#18+
privateНужно-ли обновлять "Бритни Спирс" 9 раз в день а "Садоводство" всего 1 раз? Как узнать это? Ну частоту обращений ты знаешь. Теперь осталось установить срок жизни каждого элемента до устаревания (условно говоря, страница с Бритни меняется каждый день, а Садоводства хватает на месяц) И можно будет оценить, при какой частоте обновлений ты будешь получать меньше "неправильных" ответов. Дальше задача о рюкзаке. P.S. А потом дойдешь до распределения частоты запросов по временным интервалам, типа Бритни смотрят в обед все 9 раз, а Садоводство по утрам и вечером. И надо всего 3 запроса, чтоб ответы были актуальными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 18:11 |
|
||
|
Задача, минимизация ошибок кэша на основе частоты доступа
|
|||
|---|---|---|---|
|
#18+
авторExpired ? Если так, то можно запилить фоновую задачу, которая и будет обновлять кэш. Да, вопрос только какие страницы она будет обновлять и как часто - это и нужно определить. авторТеперь осталось установить срок жизни каждого элемента до устаревания Срок жизни элементов неизвестен, известна только частота обращения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 18:23 |
|
||
|
Задача, минимизация ошибок кэша на основе частоты доступа
|
|||
|---|---|---|---|
|
#18+
privateДа, вопрос только какие страницы она будет обновлять и как часто - это и нужно определить.privateСрок жизни элементов неизвестен, известна только частота обращения.Наткнулся на это: https://ru.wikipedia.org/wiki/Википедия:История_изменений но 10 запросов в день - как-то маловато (: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 18:29 |
|
||
|
Задача, минимизация ошибок кэша на основе частоты доступа
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 18:42 |
|
||
|
Задача, минимизация ошибок кэша на основе частоты доступа
|
|||
|---|---|---|---|
|
#18+
Спасибо за ссылки, но задача с википедией это просто пример чтобы продемонстрировать что требуется сделать. Реальная задача другая. Интересно именно общее решение задачи - как выбрать стратегию обновления элементов чтобы минимизировать ошибки. С цифрами которые не просто на глаз рассчитаны, а как-то выведены, хоть пусть и примерно эмпирически. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 18:49 |
|
||
|
Задача, минимизация ошибок кэша на основе частоты доступа
|
|||
|---|---|---|---|
|
#18+
В яндексе и гугле должны знать как это делать, они-же тоже планируют обход сайтов по времени, у них тоже задача минимизировать ошибки. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 18:53 |
|
||
|
Задача, минимизация ошибок кэша на основе частоты доступа
|
|||
|---|---|---|---|
|
#18+
private, Наткнулся на термин - Прогнозная интерполяция (или интерполяция в прогноизровании ). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 18:58 |
|
||
|
Задача, минимизация ошибок кэша на основе частоты доступа
|
|||
|---|---|---|---|
|
#18+
privateВ яндексе и гугле должны знать как это делать, они-же тоже планируют обход сайтов по времени, у них тоже задача минимизировать ошибки. :)у них роботы, аналитика и пр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 19:05 |
|
||
|
Задача, минимизация ошибок кэша на основе частоты доступа
|
|||
|---|---|---|---|
|
#18+
privateХмм, никто не понял..., может я действительно неверно описал... :) Мы создали зеркало (копию) википедии. В википедии есть страница про "Бритни Спирс" с посещаемостью 100хитов/мин, и про "Садоводство" с посещаемостью 2хита/мин.... Я понял. См. мой ответ. Разделить все странички по группам в соответствие с ABC-анализом. Нужно оперировать предположениями о бизнес-ценности информации + желательно оперативно получать информацию о частоте изменении информации на википедии. Предположим, что просмотр Бритни Спирс приносит кучу дохода, а Садоводство мало. То первую отправляем в группу A, вторую в группу B. НО если страничка о садоводстве меняется раз в день, а о Бритни Спирс меняется раз в год - то несмотря на принадлежность к группе A, ее можно проверять реже. Пример про бизнес-ценность: В википедии есть страница про "Бритни Спирс" с посещаемостью 100хитов/мин детями пубертаного возраста, и про "Тайоту" с посещаемостью... да пофиг с какой, главное, что раз в полгода ее смотрит Ваш инвестор. В случае ошибки в первом случае - сотни дети, пытающиеся дрочить на бритни спирс, не смогут кончить. При ошибки во втором случае - когда это заметит инвестор, он придет и скажет "проект г..., все закрыт, все уволены". Вопрос на засыпку: какую страничку нужно чаще проверять, что бы не оказаться безработным? И какая пофиг разница, сколько людей кроме инвестора смотрят страницу про Тайоту? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 20:11 |
|
||
|
Задача, минимизация ошибок кэша на основе частоты доступа
|
|||
|---|---|---|---|
|
#18+
privateВ яндексе и гугле должны знать как это делать, они-же тоже планируют обход сайтов по времени, у них тоже задача минимизировать ошибки. :) У них задача - заработать бабла. БАБЛА КАРЛ. Уверяю Вас, на ошибки - им глубоко пофиг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 20:17 |
|
||
|
Задача, минимизация ошибок кэша на основе частоты доступа
|
|||
|---|---|---|---|
|
#18+
privateавторТеперь осталось установить срок жизни каждого элемента до устаревания Срок жизни элементов неизвестен, известна только частота обращения. Что мешает начать копить статистику? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 23:16 |
|
||
|
Задача, минимизация ошибок кэша на основе частоты доступа
|
|||
|---|---|---|---|
|
#18+
privateЕсть кэш, элементы в нем запрашиваются с разной частотой, и элементы устаревают. Например по ключу "А" идет 100 запросов в минуту, а по ключу "Б" всего 2. Каждый раз когда кэш возвращает устаревшее (неверное) значение - мы засчитываем ему ошибку. Поэтому если оба ключа устареют - по "А" будет засчитано 100 ошибок в минуту, а по ключу "Б" всего 2 ошибки. Как придумать алгоритм обновления значений в кэше который будет учитывать частоту обращения и минимизирует ошибки? Обычно кеш строится на базе LRU. Что такое LRU? Это как игра змейка в телефоне. Попадание нового элемента в кеш - рост змейки с головы (добавление нового элемента). И отсекание хвоста (eviction старого элемента). Что такое повторное чтение элемента в кеш? Здесь альтернатива змейки ломается и физически это выглядит как поднятие вверх середины сегмента змейки. Благодаря linked-list все эти операции имеют стоимость примерно o(1). Вобщем в классической реализации кеша нет никакого места подсчетам и любым другим долгоиграющим процессам. Кеш принимает решение мгновенно. Что такое с точки зрения LRU 100 запросов с ключом "A" ? Это значит что элемент A постоянно стоит в голове змейки. А все прочие элементы которые читаются реже - располагаются тем ближе к хвосту, чем реже к ним был доступ. Даже правильнее сказать не располагаются а "дрейфуют" в сторону хвоста в обратном порядке своей частоты попадания в кеш. Если нужно завязаться на TTL то алгоритм остается тот-же самый. То в каждый элемент мы добавляем поле lastUpdateTime и делаем змейку бесконечной по длине. Но в политику eviction добавляем правило что режем с хвоста только тот элемент, время которого истекло. Опять-же этот action можно привязать синхронно к другим операциям. Например к событию добавления нового элемента. Нам нужна функция которая примет на вход статистику обращений кэша и выдаст индивидуальный TTL для каждого значения в кэше. Интересно как практическое / эмпирическое решение так и теоретическое. К какому классу алгоритмов относится эта задача? Например поиск зависимости относится к классу алгоритмов работы с графами. А эта задача какого типа? Можно посмотреть на исходники EhCache https://github.com/ehcache/ehcache3 Возможно там есть такая формула. Но я сомневаюсь. Скорее всего быстрые структуры данных и простые и гениальные линейные правила, и алгоритмы типа tocken bucket algorithm, linked-list, hash-table или стохастичные структуры такие как bloom-filter позволяют решать такие задачи. Спрашиваю в Java потому-что в Java много задач на алгоритмы :) Вы сильно ошибаетесь. В Java не больше задач на алгоритмы чем в любых других ЯП. Просто сам по себе хештег #Java мы чаще гуглим и поэтому складывается такая иллюзия. Почитайте Кнута, Седжвика и Кормана. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 23:32 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39400356&tid=2123170]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
53ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 203ms |
| total: | 331ms |

| 0 / 0 |
