PostgreSQL、Redis與Memcached的效能比較 - CYBERTEC
測試設定的一些特徵:
- AMD Ryzen 3600 CPU 設定為效能模式。我的測試指令碼本質上是同步的,即基本上使用單個 CPU 核心,所以速度可能很重要。
- Ubuntu 20.04 桌面作為作業系統,禁用交換。
- PostgreSQL v13.3,即最新的。
- 預設 PostgreSQL 配置:“shared_buffers=512MB”、“track_io_timing=on”、“shared_preload_libraries='pg_stat_statements'”。
- 用於系統和資料庫的單個 NVMe SSD。
- 使用準備好的語句讀取/寫入 Postgres 以獲得最佳查詢效能,避免解析後續呼叫。
- 完全適合 PostgreSQL 管理快取(共享緩衝區)的資料集大小。
- 非同步模式用於寫入資料,這意味著在伺服器崩潰/重啟的情況下,最近的資料可能會略有丟失,作為更多寫入(尤其是在小事務中)效能的權衡。但這與 Redis 和 Memcached 預設處理寫入的方式一致。不過,使用 Redis,還可以啟用 AOF 永續性以獲得 PostgreSQL 預設行為。
- 兩個讀/寫測試都從 1 到$rows一一遍歷所有插入的隨機生成的浮點資料鍵。
- 鍵值表在讀取測試之前被提取到 Postgres 快取中,因此不會像 Redis/Memcached 那樣有冷快取效應。
- 我沒有測量 Postgres 的記憶體使用情況,因為在插入和快取所有資料之後,對於這個用例,這預計會非常穩定。
- 執行時間記錄在應用程式端,並呼叫系統時鐘以匹配原始測試。請注意,我決定從伺服器端測量執行時間也是為了更好地瞭解“浪費”的數量,因為畢竟 Python 並不是效能測試的最佳選擇,原因有很多,我不想在這裡深入研究. 再往前走一點——結果確實非常可怕,人們不應該使用 Python 來對資料庫進行基準測試——很多 CPU 時間就在某處消失了!
- 完整的測試指令碼可在此處獲得。執行大約需要 10-15 分鐘。基本上是這樣的:
CREATE UNLOGGED TABLE kv_test(key text, value int); CREATE INDEX ON kv_test (key); -- pseudo-code from the Python script for $ROWS in [1000, 10000, 100000, 1000000]: truncate kv_test generate $ROWS random values for $i := 1 .. $ROWS: insert $key into kv_test ($rand[i], $rand[i]) vacuum analyze the table for $i := 1 .. $ROWS: select * from kv_test where key = $rand[i] |
PostgreSQL vs Redis vs Memcached:寫操作
寫入鍵值對的計算時間以毫秒為單位。
資料庫 1,000行 10,000行 100,000行 1,000,000行 Redis (v3.0.7) 34 214 1,666 14,638 Memcached (v1.4.14) 23 100 276 2,813 PostgreSQL (v13.3) 29.6 304 2,888 31,230 |
PostgreSQL vs Redis vs Memcached:讀操作
計算的讀取鍵值對的時間(毫秒)。
資料庫 1,000 10,000 100,000 1,000,000 Redis (v3.0.7) 8 6 8 8 Memcached (v1.4.14) 9 14 14 30 PostgreSQL (v13.3) 0.026 0.028 0.027 0.029 |
Postgres 的讀測試結果領先,看起來非常好!與 Postgres 相比,Redis/Memcached 的平均鍵讀取時間似乎太慢了。我懷疑他們仍然使用遠端機器作為快取。
寫入操作方面,Postgres 對於 100k 和 1M 行記錄寫入,僅比 Redis 慢 2 倍。
快取的主要思想是,與無論如何寫入/更新相比,只有當我們從它們中讀取更多內容時,它們才有用!
很高興看到 Postgres 對不斷增長的資料集的響應的相對穩定性非常非常好!甚至擊敗了在 100 萬行讀取慢2 倍的 Memcached!
這一切都可能表明,為 PostgreSQL 選擇的演算法在數學上是合理的,並且實現得很好!
banq注:不能忽視Redis/Memcached分散式伸縮擴充套件能力。
相關文章
- Redis 和 Memcached 比較Redis
- PostgreSQL與MySQL的比較 - hackrMySql
- PostgreSQL與Rust的聚合實現比較SQLRust
- 大偏移量下Redis與MongoDB的分頁/排名效能比較RHRedisMongoDB
- 效能比較
- Java JIT與AOT效能比較 - foojayJava
- Caddy 與 Nginx的基準效能比較 - tjllNginx
- Redis的配置及與memcached區別Redis
- 全面對比 Redis 和 Memcached 的 6 點區別Redis
- 請比較下for、forEach、for of的效能的效能
- Apache與Nginx的優缺點、效能比較,到底選擇哪個比較好?ApacheNginx
- WCF與ASP.NET Core效能比較ASP.NET
- etcd和redis比較Redis
- PHP file_get_contents 與 curl 效能比較PHP
- PostgreSQL TPROC-C基準測試:PostgreSQL 12與PostgreSQL 13效能對比SQL
- Memcached與Redis有什麼區別Redis
- Redis的Java客戶端比較:絕地武士與生菜RedisJava客戶端
- 對比Memcached和Redis,誰才是適合你的快取?Redis快取
- Redis vs. MongoDB比較RedisMongoDB
- Shopify使用Memcached而不是Redis快取提升20%效能Redis快取
- MRAM與常用計算機記憶體的效能比較計算機記憶體
- NATS訊息傳遞與REST效能比較 | VinsguruREST
- Java Bean Copy元件的效能比較JavaBean元件
- 360°全方位比較PostgreSQL和MySQLMySql
- python 批量resize效能比較Python
- Memcached和Redis的區別?Redis
- memcached 和 redis 使用場景及優缺點對比Redis
- 比較Java與Node.js的併發性和效能- maxantJavaNode.js
- redis學習(九) redis事務和redis指令碼的比較Redis指令碼
- volatile與Atomic的比較
- Nosql/Redis/ttserver/Flare/memcache比較SQLRedisTTSServer
- Java實體對映工具MapStruct 與BeanUtils效能比較JavaStructBean
- ==與equals比較
- 雲主機的硬碟IO效能比較硬碟
- 由react效能優化擴充套件出來的bind與閉包的比較(效能)React優化套件
- Java中List集合效能比較Java
- 排序演算法效能比較排序演算法
- MySQL 中的 distinct 和 group by 的效能比較MySql