Хранение массивов в Redis

468
03 июня 2017, 17:33

Доброго времени! Хочу спросить совета по поводу хранения данных в redis как это сделать быстрее и оптимальней в плане кода и быстродействия php и самого Редиса. Дано - база с пользователями в таблице пользователей пордка 3х тысяч строк и количество может быть расширенно до 10. у каждого пользователя есть 7-10 параметров которые надо записать в редис и работать с ними, обращения к хранимым данным будут происходить довольно часто. изменение, перезапись запись.

первый способ который мне видится это хранить массив преобразованный в формат json по принципу 1 пользователь = 1 ключ примерно так:

допустим массив данных

$superparms['1'] = "13";
$superparms['2'] = "22";
$superparms['3'] = "55";
$superparms['4'] = "66";

ключ для хранения составляем строка+id пользователя

$key = 'user'.$id; //допустим user922

и запись

$superparms = json_encode($superparms);
$redis->set($key, $superparms);
$redis->expire($key, '600');

в таком случае в редис под каждым ключом хранится примерно такая строка {"1":"13","2":"22","3":"55","4":"66"}

и естественно при работе с ним придется каждый раз выгружать все данные, даже если надо изменить какой либо один параметр (чаще всего параметры меняются именно по отдельности за раз) делаю примерно так:

$curent = $redis->get($key);
$curent = json_decode ($curent);
foreach ($curent as $key => $value) {
//обрабатываем все и перезаписываем та же все
 }

смущает в этом способе то что хоть и используется минимум ключей и все хранится компактно - все равно каждый раз приходится вереберать весь массив данных - можно ли как то без обратного преобразования json decode менять на прямую данные в строке json?

и втрой вариант это для каждого параметра создавать свой ключ по конструкции: строка+id+_+номер параметра примерно будет так

$redis->set('user921_1', $superparms[0]);
$redis->expire('user921_1', '600');
$redis->set('user921_2', $superparms[1]);
$redis->expire('user921_2', '600');
$redis->set('user921_3', $superparms[2]);
$redis->expire('user921_3', '600');

и т.д таким образом количество ключей возрастает раз в 10 но работать с ними становится проще т.к. избавляемся от json encod\decode и циклов foreach для перебора, но мне кажется из-за большого количества ключей в системе может создаваться загруженность? так ли это? какой способ наиболее быстрый в плане обработки php и хранения в redis? есть ли еще варианты решения такой задачи?

Answer 1

Redis это не только ключ-значение, но и пачка других типов данных и соответствующих методов обработки набора значений, отсортированного списка значений, географических данных, хэш-таблиц

Под вашу задачу вполне подойдёт хэш-таблица. Посмотрите на используемую у вас библиотеку доступа к редису, для php redis ваша задача сводится к методам hMSet, куда сразу PHP-массив передать, hGetAll для получения массива обратно и hSet для редактирования полей по отдельности. И ещё кучка методов для возможной работы с этими данными непосредственно в redis.

READ ALSO
Выборка из базы и сравнение

Выборка из базы и сравнение

Данный код рисует сетку календаря, календарь рисуется на месяцВыбираются все данные за этот месяц (если есть такие) и при наличии данных в базе...

305
feof() и пустой файл

feof() и пустой файл

Имеется пустой файл (0 байт)Почему feof() не возвращает true?

281
CURL получение содержимого m3u8

CURL получение содержимого m3u8

В общем пишу api для граббинга m3u8, есть функция которая отдает ссылку на файл, ссылка в таком виде

241
Указатели на функии С++

Указатели на функии С++

Разбираю указатели на функции,и решил реализоватьФункция, сама по себе простенькая, подсчет количества слов в строке

344