2016-12-15 78 views
1

我目前正在研究一個項目,我們考慮將其切換爲Redis作爲數據庫。我們的數據的性質非常簡單,似乎適用於Redis。 沒有Redis的經驗,我做了一個非常小的基準測試,將其與PostgreSQL在插入性能(這對我們很重要)方面進行比較。Redis在插入時似乎比PostgreSQL慢

我創建了一個包含200000個INSERT語句的.sql文件,並將其寫入一個簡單模式(address [key], timestamp, value)。插入花費了大約6秒鐘。

對於Redis的,每個200000條記錄由插入:

HSET data:address timestamp <VALUE> 
HSET data:address value <VALUE> 

傾倒到一切Redis的與time redis-cli < insert_data.redis需要16秒。 我意識到這個'基準'是非常基本的,但我錯過了讓PostgreSQL出現在頂端的東西嗎?我無法真正想象Redis實際上插入速度較慢。

+0

PostgreSQL需要多長時間?你是否嘗試過流水線請求?客戶端開銷可能會降低整體時間。 –

+0

這是6s(Redis)vs 16s(PostgreSQL)。我試過'貓的數據。txt | redis-cli --pipe'首先,因爲這是在這裏描述:https://redis.io/topics/mass-insert,似乎更合理。但是,上面顯示的HSET語句不被接受,而是我接收到語法錯誤消息。 – user318592009

+0

什麼是錯誤? –

回答

2

這個結果是合乎邏輯的。要了解基準的結果,瞭解系統觸發的操作很重要。

Redis和PostgreSQL客戶端都與其各自的服務器同步工作。對於每條語句,他們都會在處理下一條語句之前發送查詢並等待答覆。

在這樣的數量上,很多事情都發生在內存中(即使使用PostgreSQL)。而且,你在這裏沒有併發性。因此,操作成本不受I/O或索引支配,而是通過客戶端和服務器之間的往返交換。

現在,每個測試會產生多少往返?

使用PostgreSQL,每條記錄有一條語句,導致200000往返。使用Redis,每條記錄有兩條語句,導致400000往返。此外,Redis往返系統地包含您的模式的關鍵字(數據,時間戳,值),並且地址每個記錄發送兩次。因此Redis測試交換了更多的數據。

您可能在客戶端軟件解析輸入文件的方式上也存在差異。

爲了提高位,且Redis的-CLI你的結果,你可以使用命令HMSET每個記錄只發送一個聲明。

HSET data:address timestamp <VALUE> 
HSET data:address value <VALUE> 

變爲:

HMSET data:address timestamp <VALUE> value <VALUE> 

但真正的收益是使用pipelining。不幸的是,除了依靠--pipe選項外,你不能在redis-cli中使用它。對於這個選項,你必須生成實際的Redis協議,而不是文本命令。這就是爲什麼你使用「cat data.txt | redis-cli --pipe」的測試無法工作的原因。從簡單的shell命令生成Redis protocol不方便。

對於這樣的標杆,我會強烈建議使用自己的客戶端程序,而不是Redis的-CLI。即使是一些寫在Python和Ruby或JavaScript將導致有趣的表現提供採用流水線方式。

+0

感謝您的詳細解釋,真的有所幫助。我偶然發現了Redis協議,但對我來說似乎非常困惑,我不知道如何翻譯HSET或HMSET命令。正如你所建議的那樣,我將切換到一個小型的Python客戶端,併爲PostgreSQL做同樣的工作來平衡遊戲領域。 – user318592009