Шаблон разработки для memcached кэширования данных

Это то, что вы ищете.

arr1=[{prodId:2},{prodId:4}]

arr2=[{id:1, name:"Test1"},
      {id:2, name:"Test2"},
      {id:3, name:"Test3"},
      {id:4, name:"Test4"},
      {id:5, name:"Test5"}]


      

    let k=arr2.reduce((o,a)=>{
      if(arr1.map(a=>a.prodId).indexOf(a.id)!=-1)
      {
         o.push(a)
      }
        return o;
      },[])
console.log(k)

10
задан 10 November 2008 в 00:12
поделиться

4 ответа

Читайте о шаблоне Карты Идентификационных данных. Это - способ удостовериться, что Вы только сохраняете одну копию данной строки в Вашем пространстве приложения. Храните ли Вы его в memcached, или просто возражает, это - способ обработать то, что Вы хотите. Я предположил бы, что Карта Идентификационных данных лучше всего используется при типичной выборке одной строки за один раз.

При выборке целых подмножеств таблицы затем необходимо обработать каждую строку индивидуально. У Вас могла бы часто быть дилемма того, вытаскиваете ли Вы лучшее использование из своего кэша, потому что, если 99% Ваших строк находятся в кэше, но каждый требует выборки от базы данных, необходимо выполнить SQL-запрос так или иначе (по крайней мере, однажды).

Вы могли преобразовать SQL-запрос для выборки только строк, которые не находятся в кэше, но это нетривиально для выполнения этого преобразования автоматически, не делая SQL-запрос более дорогостоящим.

3
ответ дан 4 December 2019 в 01:58
поделиться

При использовании кэша затем, чтобы получить все возможное от него, необходимо признать, что данные всегда будут устаревшими до степени, и что некоторые части данных будут вне синхронизации друг с другом. Попытка усовершенствовать все записи путем поддержания единственной копии является чем-то лучше всего оставленным реляционным базам данных, поэтому если это - поведение, Вам нужно затем, Вы, вероятно, более обеспечены с мощным 64-разрядным сервером БД с большим количеством RAM, таким образом, это может выполнить свое собственное внутреннее кэширование.

Если можно принять устаревшие данные (в котором Вы будете нуждаться к тому, если реальная масштабируемость будет важна), затем, один подход должен просто бросить целый набор результатов в кэш; не волнуйтесь о дублировании. RAM является дешевой. Если Вы находите, что Ваш кэш становится полным, затем просто покупают больше RAM и/или серверов кэширования. Например, если у Вас есть запрос, который представляет объекты 1-24 в наборе, фильтрованном X и Y условий, затем используют ключ кэша, который содержит всю эту информацию, и затем при просьбе относительно того же самого поиска снова просто возвращают весь набор результатов из кэша. Вы или получаете полный набор результатов от кэша в одном хите, или Вы переходите к базе данных.

Самая твердая вещь удается, сколько данных может быть устаревшим, и насколько устаревший это могут быть без любого (a) людей, замечающих слишком много, или без (b) повреждения бизнес-требования, такие как минимальные интервалы обновления.

Этот подход работает хорошо на чтение главным образом приложения, особенно, которые разбили на страницы запросов и/или конечного множества критериев фильтра данных. Это также означает, что Ваше приложение работает точно то же с кэшем на или прочь, только с 0%-й частотой успешных обращений, когда кэш выключен. Это - подход, который мы проявляем в blinkBox почти во всех случаях.

4
ответ дан 4 December 2019 в 01:58
поделиться

Ну, я предполагаю, что это - что-то, с чем необходимо будет жить. Memcahced будет работать лучшее, если Вы действительно не сделаете материала в пакетах. Например, замечательно для материала как, "где вещи для этого пользователя? Вот набор вещей для этого пользователя". Это действительно не означает, что этот запрос не делает пакетов. Конечно, это будет - если часть пользовательского материала будет материалом как его сообщения.

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

Всегда существует оборот к ситуации. Если Вы действительно хотите стать волосатыми со своей реализацией, можно изменить пакетные запросы для не включения объектов, уже существующих в memcached. Очень очень ужасный...

По-моему, это всегда сводится, "какие запросы я действительно хочу кэшировать?"

Править:

Путем я пошел бы об этом:

  • Запрос единственного объекта - если в memcached, используйте тот, иначе выберите от DB и обновите memcached.
  • Пакетный запрос - не волнуется, о котором объекты находятся в memcached, просто получают все и обновляют memcached.

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

Однако в конечном счете Ваш кэш будет содержать много объектов при использовании пакетных запросов много. Поэтому необходимо будет подвести баланс для определения, при которой точке Вы все еще хотите выполнить поиски базы данных. Хорошая вещь состоит в том, если пакетный запрос будет ранее в жизненном цикле Ваших приложений, то все будет кэшироваться ранее. После первого пакетного запроса можно сказать себе, что Вы не должны больше выбирать от DB, если данные в кэше не делаются недействительным обновлениями или удаляют.

1
ответ дан 4 December 2019 в 01:58
поделиться

Вот как я понимаю, как это делает NHibernate (и, следовательно, вероятно, Hibernate). Он имеет 4 кэша:

  • кэш строк: кэширует строки БД. Ключ кеша — TableName#id, остальные записи — значения строки.
  • кэш запросов: кэширует результаты, возвращенные для определенного запроса. Ключ кеша — это запрос с параметрами, данные — это список ключей строк TableName#id, которые были возвращены в качестве результатов запроса.
  • Кэш коллекций: кэширует дочерние объекты любого заданного родителя (который NHibernate позволяет загружать отложенно). Таким образом, если вы получите доступ к myCompany.Employees, коллекция сотрудников будет кэширована в кеше коллекций. Ключ кэша — CollectionName#entityId, данные — это список ключей строк TableName#id для дочерних строк.
  • Кэш обновления таблицы: список каждой таблицы и время последнего обновления. Если таблица была обновлена ​​после кэширования данных, данные считаются устаревшими.

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

1
ответ дан 4 December 2019 в 01:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: