Я работал над программой, которая нуждается в системе кеширования.
поэтому описание — я получил базу данных 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 минут;
Предполагая, что вы находитесь на сервере 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();