2013-11-15 3 views
1

В настоящее время я использую кеш Apc в приложении CakePHP. У меня есть тысячи списков, которые я хочу кэшировать как отдельные объекты, которые можно читать, обновлять и перезаписывать независимо. Затем я кэширую группы listing_id отдельно. Существуют некоторые дорогостоящие расчеты на основе местоположения, которые включают в себя вычисление группировки листинговых_файлов, которые должны быть загружены (это приложение карт), поэтому этот список листинговых_положений необходимо кэшировать.CakePHP Кэш Apc слишком часто недействителен

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

Некоторые более специфические о реализации:

  • Моя конфигурация кэша я использую как для списка listing_ids и индивидуальных данных списков:

Cache :: конфигурации ('Config1', массив (

  'engine' => 'Apc', 
      'duration'=> 10000000, 
      'probability'=> 100, 
      'path' => CACHE, 
      'prefix' => 'cake_', 
      'lock' => false, 
      'serialize' => true, 
      'mask' => 0666, 
    )); 
  • Для инициализации отдельных записей гр ache при загрузке карты, я просто перебираю списки, возвращенные из базы данных, кэшируя каждый из них с их добавлением listing_id до конца, например:

    Cache :: write ('Listing -'. $ id, $ listing , 'Config1');

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

Моя цель - обновить одно конкретное объявление в кеше, не касаясь остальных кэшированных списков. Кажется простой задачей, но я потратил несколько часов на расследование и не смог найти решение.

ответ

1

Просто переписать конкретную запись, как вы уже делаете

Cache::write('Listing-'.$id, $listing, 'Config1');