2012-08-27 82 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的持续时间会更长,碰撞的可能性更小。

干杯!

相关问题