Я использую пул соединений для Redis, чтобы максимизировать задержки в сети
Edit2: я бы не стал использовать поиск Redis, потому что он предполагает использование индекса, и часть моих тестов состоит в том, чтобы увидеть время без индексирования.
Мои данные содержат 6 миллионов строк с такими столбцами:'primary_key', 'timestamp', 'temperature_value', 'sensor_id', 'sensor_status'
например,
1, 2023-01 -01 00:00:00.0, 20.28, 1, ХОРОШО
Данные были записаны в Redis в виде хеш-значений.
Я экспериментирую с Redis, MySQL, PostgreSQL и InfluxDB с использование их библиотек Python.
Для используемых баз данных нам нужны отфильтрованные данные - из всех строк только те, где Sensor_id в (1,2,8) (в CSV-файле Sensor_id принимает значения от 1 до 10.).
Для этих идентификаторов датчиков мы запрашиваем выбранные суммы: 10 000, 20 000, 40 000, 80 000, 160 000, 320 000 в целом.
Для каждой суммы мы запрашиваем ее 10 раз, чтобы получить среднее время для используемой базы данных и сумму запроса, что дает результат. в 6 средних раз по 4 базы данных каждая. Каждый запрос имеет свой набор смещений, поэтому он не превышает размер данных. (это сделано для того, чтобы по каждому запросу были разные результаты)
Мои скрипты (написанные на Python) выполняют запросы с такими фрагментами для измерения времени для каждой базы данных:Redis:
Код: Выделить всё
start_time = time.time()
pipeline = connection.pipeline()
for key in filtered_keys:
pipeline.hgetall(key)
values = pipeline.execute()
end_time = time.time()
Код: Выделить всё
start_time = time.time()
# SELECT query
query = f"SELECT * FROM {table_name} WHERE sensor_id IN ({sensor_ids_str}) LIMIT {Offset}, {Amount};"
cursor.execute(query)
# Execute the query and fetch the results
results = cursor.fetchall()
# Record the end time
end_time = time.time()
Код: Выделить всё
start_time = time.time()
select_query = f"SELECT * FROM {table_name} WHERE sensor_id IN ({sensor_ids_str}) OFFSET {random_offset} LIMIT {rows_amount};"
cursor.execute(select_query)
result = cursor.fetchall()
end_time = time.time()
sensor_ids = [1, 2, 8]
sensor_ids_str = ' OR '.join([f"sensor_id='{sensor_id}'" for Sensor_id в Sensor_ids])
Код: Выделить всё
time1 = time.time()
# Perform the SELECT query
result = client.query(f'SELECT * FROM {measurement_name} WHERE ({sensor_ids_str}) LIMIT {num_points} OFFSET {random_offset};')
time2 = time.time()
Результаты, которые я получил:
график результатов
На графике у нас 4 базы данных с размерами запросов и разделенными на времена запроса с нарушением базы данных и без нарушения (нарушение означает одновременные операции записи). Это еще одна вещь, которую я тестировал , но главным моментом будет ответ на вопрос, почему Redis имеет самое большое время извлечения. Спасибо.
Redis для извлечения 320 тысяч строк занимало менее 12 секунд, а Postgres требовалось менее 4 секунд.
Прежде чем я включил фильтрацию по Sensor_id Redis показал почти лучшие результаты по производительности. С того момента, как я включил фильтрацию и поменял из-за этого скрипт, Redis стал самым медленным. Я думаю, что он может плохо справляться с фильтрацией, но это не должно быть проблемой, поскольку я измеряю только конвейер, который получает список отфильтрованных ключей.
результаты без перерывов перед включением фильтрации
Сейчас у меня нет старого кода, но в нем не использовалась конвейерная обработка для Redis, но результаты были намного лучше.
Подробнее здесь: https://stackoverflow.com/questions/787 ... -in-python