Я добавляю свой ответ после получения предложений от @ TheDude
Вариант 3: Использование хешей (Победитель)
Для сохранения данных я бы использовал одинhMSet, то есть:
$redis->hMSet('MyKey-UserID', array('clicks' => 123, 'downloads' => 123, 'views' => 123));
Затем для обновления всех полей я бы использовал несколько hIncrBy, то есть:
$redis->hIncrBy('MyKey-UserID', 'clicks', 2);
$redis->hIncrBy('MyKey-UserID', 'downloads', 2);
$redis->hIncrBy('MyKey-UserID', 'views', 2);
С помощью этого метода я могу иметь один хеш (MyKey-UserID) изатем я добавляю настраиваемые поля.
Таким образом, размер БД все равно будет небольшим (по сравнению с вариантом 2), и одновременные записи будут в порядке (по сравнению с вариантом 1). Я также мог бы использовать multi () для запуска нескольких команд в одной операции:
Блок команд Redis :: MULTI выполняется как одна транзакция
https://github.com/phpredis/phpredis#multi-exec-discard
Таким образом, я могу обновить более одного поля или все поля, как это, выполнив только одну операцию:
$ret = $redis->multi()
->hIncrBy('MyKey-UserID', 'clicks', 2)
->hIncrBy('MyKey-UserID', 'downloads', 2)
->hIncrBy('MyKey-UserID', 'views', 2)
->exec();
Хэши против типа данных SET / GET (ключ = значение)
Согласно этому ответу: https://stackoverflow.com/a/24505485/2972081
При возможности используйте хэши
Смальl хэши закодированы в очень маленьком пространстве, поэтому вы должны стараться представлять ваши данные с помощью хешей каждый раз, когда это возможно.Например, если у вас есть объекты, представляющие пользователей в веб-приложении, вместо использования разных ключей для имени, фамилии, адреса электронной почты, пароля, используйте один хеш со всеми обязательными полями.
Я сделал несколько тестови вот результаты:
hset myhash rand_string rand_int: 31377.47 requests per second
hget myhash rand_string: 30750.31 requests per second
hincrby myhash rand_string: 30312.21 requests per second
set rand_string: 30703.10 requests per second
get rand_string: 30969.34 requests per second
incrby rand_string: 30581.04 requests per second
Команда, которую я использовал для бенчмарка, выглядит так:
redis-benchmark -n 100000 -q hset myhash rand_string rand_int
Таким образом, хэши работают так же быстро, как Get / Set (строки).