Ниже я написал сценарий bash для обработки ключа и значения Redis. У меня в Redis около 45-50 миллионов ключей. Я хочу получить все значения и выполнить некоторую обработку. Для этого мой приведенный ниже скрипт обрабатывает 1 миллион ключей за 1 час. Чтобы обработать 50 миллионов ключей, потребуется 50 часов, чего я не хочу делать. Я новичок в Redis cli - может ли кто-нибудь помочь мне оптимизировать приведенный ниже скрипт, или было бы очень здорово, если бы кто-нибудь мог дать какое-то предложение.
Моя схема "ключ-значение" Redis:
Keys - 123.item.media
Values - 93839,abc,98,829 | 38282,yiw,282,282 | 8922,dux,382,993 |
Keys - 234.item.media
Values - 2122,eww,92,211 | 8332,uei,902,872 | 9039,uns,892,782 |
Keys - 839.item.media
Values - 7822,nkp,77,002 | 7821,mko,999,822 |
В приведенном ниже сценарии я передаю все свои ключи и вычисляю, сколько записей у меня есть для каждого ключа. Например - этот ключ (123.item.media) имеет 3 записи, а этот (839.item.media) имеет две записи.
Таким образом, для вышеуказанных ключей и значений вывод должен быть: Total Count: 8
То же самое я делаю для всех 50 миллионов ключей, что занимает слишком много времени.
Мой код:
#!/bin/sh
cursor=-1
keys=""
recordCount=0
while [ $cursor -ne 0 ];
do
if [ $cursor -eq -1 ]
then
cursor=0
fi
reply=`redis-cli SCAN $cursor MATCH "*" COUNT 100`
#echo $reply
cursor=`expr "$reply" : '\([0-9]*[0-9 ]\)'`
keys=${reply#[0-9]*[[:space:]]}
for i in $keys
do
#echo $i
#echo $keys
value=$(redis-cli GET $i)
temCount=`echo $value | awk -F\| '{print NF}'`
#echo $temCount
recordCount=`expr ${temCount} + ${recordCount}`
done
done
echo "Total Count: " $recordCount
Заранее оцените вашу помощь!