Страницы

Поиск по вопросам

понедельник, 8 июля 2019 г.

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

Доброго времени! Хочу спросить совета по поводу хранения данных в 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? есть ли еще варианты решения такой задачи?


Ответ

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

Комментариев нет:

Отправить комментарий