You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1.8 KiB

Redis vs PostgreSQL Benchmark

Load 125 million phone number records and benchmark read performance between Redis and PostgreSQL

Prerequisites

pip install psycopg2-binary redis locust

PostgreSQL Setup

sudo -u postgres psql

CREATE DATABASE numbers_db; CREATE USER myuser WITH PASSWORD 'mypassword'; GRANT ALL PRIVILEGES ON DATABASE numbers_db TO myuser; \q

Redis Setup

sudo systemctl restart redis-server

Load Data into PostgreSQL

python load_postgres.py

Load Data into Redis

python load_redis.py

Run Benchmark

locust -f main.py

Then open in browser: http://localhost:8089

Default Settings

Total records: 125,000,000 Phone number range: 100,000,000 to 224,999,999 PostgreSQL workers: 12 Redis workers: 8

Expected Results

Redis:

  • Average latency: 0.5 to 2 ms
  • P99 latency: 3 to 8 ms
  • Throughput: 40,000 to 60,000 req/s
  • Load time: 15 to 20 minutes

PostgreSQL:

  • Average latency: 2 to 10 ms
  • P99 latency: 15 to 40 ms
  • Throughput: 10,000 to 20,000 req/s
  • Load time: 20 to 30 minutes

File Structure

load_postgres.py - PostgreSQL data loader load_redis.py - Redis data loader main.py - Locust benchmark script

Advanced Settings

In load_postgres.py: NUM_WORKERS = 12 BATCH_SIZE = 2_000_000

In load_redis.py: NUM_WORKERS = 8 BATCH_SIZE = 100_000

Troubleshooting

PostgreSQL connection issue: sudo systemctl status postgresql sudo ufw allow 5432

Redis connection issue: sudo systemctl status redis-server redis-cli ping

Out of memory: Reduce NUM_WORKERS to 4 in loader files

Important Notes

PostgreSQL table is created as UNLOGGED (faster speed) Each Locust user has a dedicated database connection Response time is pure query time (excluding connection) Phone numbers are sequential starting from 100 million

Cleanup

Remove PostgreSQL database: DROP DATABASE numbers_db; DROP USER myuser;

Clear Redis: redis-cli FLUSHALL