2017-01-08 7 views
1

У меня есть некоторые переводы приложений для кэширования, например:PHP memcache - хранить целые объекты?

$translations = [ 
    'en' => [ 
     'key_1' => 'translation 1', 
     'key_2' => 'translation 2', 
     ... 
     'key_10000' => 'translation 10000', 
    ], 
    'de' => [ 
     'key_1' => 'translation 1', 
     'key_2' => 'translation 2', 
     ... 
     'key_10000' => 'translation 10000', 
    ], 
]; 
$memcache->set('translations', $translations); 

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

Как здесь:

$memcache->set('translations_en_key_1', 'translation 1'); 
$memcache->set('translations_en_key_2', 'translation 2'); 
... 
$memcache->set('translations_en_key_10000', 'translation 10000'); 

$memcache->set('translations_de_key_1', 'translation 1'); 
$memcache->set('translations_de_key_2', 'translation 2'); 
... 
$memcache->set('translations_de_key_10000', 'translation 10000'); 

Спасибо!

ответ

1

Ну, это будет зависеть от того, сколько индивидуальных ключей вы используете. Так, например, если вы используете 100 ключей каждый раз, когда вы обращаетесь к странице, тогда было бы более целесообразно делать многомиллионный запрос, а не получать такой огромный объект.

Также вы должны знать, что существует ограничение на 1 МБ для размера объекта, который вы храните. Поэтому, если каждый перевод принимает 25 байтов, вы не сможете хранить более 40000 переводов.

Также, если ваши объекты перевода имеют размер 25B, вы можете сделать некоторые оптимизации для хранения большего количества объектов в memcache. Вы можете посмотреть на этой link

И вы можете прочитать this, чтобы лучше понять внутренности кэша памяти

Смежные вопросы