2012-08-27 111 views
1

我需要在我的數據庫中存儲大型(30K未壓縮)的JSON字符串。我使用gzip壓縮字符串,因此使用MySQL的BLOB數據類型來存儲它。但是,只有5%的請求包含唯一的數據,並且只有唯一的數據需要存儲在數據庫中。將大型json字符串存儲到數據庫+散列表

我的方法如下。

  1. array_multisort數據(數組[a, b, c]幾乎相同[a, c, b])。
  2. json_encode數據(json_encodeserialize更快;我們需要字符串數組表示用於步驟)。
  3. sha1數據(比md5慢,雖然碰撞的可能性較小)。
  4. 檢查數據庫中是否存在散列。
    • 存在:請勿插入數據。
    • 新功能:gzip數據並將其存儲在散列中。

是否有這事(除了JSON數據存儲到數據庫中的第1名),聽起來腥或應該做不同的方式?

數據庫每個月都有大約1kk獨特的記錄被創建。

+0

聽起來像是一個很好的方法 – Scuzzy

+0

有多大? – Sysyphus

+0

30k未壓縮。自然地,由於它是純文本數據,因此更少。 – Gajus

回答

-1

它對我來說很好。我已經自己實現了這樣的東西,即使我必須承認不打擾sha1()md5sum。雖然我沒有這樣的數據流量。 在緩存命中(我用它作爲緩存)時,我沿着已壓縮的blob發送了合適的Content-Type

舊瀏覽器(以及那些沒有發送合適的Accept)需要解壓縮。

0

在我看來,你在做什麼是某種L2 /持久性/分佈式緩存。

整個過程非常正確,但您應該考慮使用適合您的環境並具有最佳性能的散列算法。

MD5有128位,SHA-1有160位,差別很大!雖然MD5可能具有2^128(〜3.4x10^38),但SHA-1可能具有2^160(〜1.4x10^48)。你認爲你會碰到使用MD5?

最佳案例場景,假設每月有100萬條獨特的記錄(10^6),您需要大約3.4x10^32個月纔會發生衝突。當然這些都是理論值,即使MD5不能均勻分佈在2^128以上。另外,如果您認爲舊值應該被丟棄(如LRU算法),因爲它們不再相關存儲,您甚至可以使用更簡單和更快的散列算法。

如果無論如何性能和/或存儲容量不是問題,堅持使用SHA-1,SHA-1的持續時間會更長,碰撞的可能性更小。

乾杯!

相關問題