Механизм кэширования PHP
Я работал над программой, которая нуждается в системе кеширования. поэтому описание - я получил базу данных mysql, которая имеет 4 столбца: "mac", "src", "username", "main". Какие mac, src, username являются ключом / значениями и внешним ключом в основной таблице. он сначала вставит эти 3 и поместит их ID в main. Данные, которые я получил, составляют около 18 м для основной таблицы, а для этих 3 - около 2 м каждая. Я не хочу использовать select каждый раз, когда его нужно вставить в main, поэтому я использовал массив для их кеширования. $hash= ['mac'=>[],'src'=>[],'username'=>[]]; и сохраняйте данные для n, например: $hash['mac']['54:52:00:27:e4:91'];
Этот подход получил плохую производительность, когда хеш-данные превышают 500 Кб; Так есть ли лучший способ сделать это?
PS: я получил то же самое с nodeJS, который использовал модуль npm с именем hashtable, а производительность составляла около 10 тыс. Вставок каждые 4 метра. Я читал о php-массивах и обнаружил, что они являются Hashtables, но теперь он выполняет ту же работу с гораздо меньшим путём, всего за 1 КБ это занимает как минимум 5 минут;
2 ответа
Предполагая, что вы находитесь на сервере Linux. См.: Создание RAM-диска. Когда у вас есть RAM-диск, кешируйте каждый ID
как файл, используя sha1()
хеш MAC-адреса. Файл RAM-диска - это, ну, RAM; постоянный кеш в памяти.
<?php
$mac = '54:52:00:27:e4:91';
$cache = '/path/to/ramdisk/'.sha1($mac);
if (is_file($cache)) { // Cached already?
$ID = file_get_contents($cache); // From the cache.
} else {
// Run SQL query here and get the $ID.
// Now cache the $ID.
file_put_contents($cache, $ID); // Cache it.
}
// Now do your insert here.
Для пояснения: диск RAM позволяет вам использовать обертки файловой системы в PHP, такие как file_get_contents()
а также file_put_contents()
для чтения / записи в ОЗУ.
Другие более надежные альтернативы для рассмотрения:
Вы можете использовать PHP Super Cache, который очень прост и работает быстрее, чем Reddis, Memcache и т. Д.
require __DIR__.'/vendor/autoload.php';
use SuperCache\SuperCache as sCache;
//Saving cache value with a key
// sCache::cache('<key>')->set('<value>');
sCache::cache('myKey')->set('Key_value');
//Retrieving cache value with a key
echo sCache::cache('myKey')->get();