当前位置:  开发笔记 > 编程语言 > 正文

你如何解决memcached的键/值限制?

如何解决《你如何解决memcached的键/值限制?》经验,为你挑选了2个好方法。

Memcached对密钥(250?)和值(大约1MB)有长度限制,以及一些(据我所知)对密钥没有很好定义的字符限制.在您看来,解决这些问题的最佳方法是什么?我使用Perl API Cache :: Memcached.

我目前所做的是,如果原始值太大("parts:"),则为主键的值存储一个特殊字符串,在这种情况下,我使用名为1+

的键存储部分,2 + <主键>等.对于某些情况,这似乎"好"(但很乱),对其他情况不太好,并且它有一些固有的问题,即某些部分可能随时丢失(因此空间被浪费)为了保持他人和时间浪费阅读他们).

至于关键限制,人们可能会实现散列并在值中存储完整的密钥(以解决冲突),但我还不需要这样做.

有没有人提出更优雅的方式,甚至是透明处理任意数据大小(和键值)的Perl API?有没有人黑客入侵memcached服务器以支持任意键/值?



1> Dustin..:

服务器已经允许您指定所需的大小:

-I            Override the size of each slab page. Adjusts max item size
              (default: 1mb, min: 1k, max: 128m)

然而,大多数时候,当人们想要缓存更大的对象时,他们做错了什么.你真的需要一个缓存密钥中的那么多数据吗?未压缩?

如果您有足够大的任务,那么低延迟访问的好处与您实际传输数据所需的时间相比是相形见绌的.或者你发现在同一个键中抛出所有东西意味着你的前端最终不得不做大量的工作来反序列化他们想要的一些数据.

这取决于您的需求,如果不了解您正在做的事情,我无法告诉您什么对您最好.如果你确实需要大于1MB的东西,那就是我们添加的原因-I.



2> peabody..:

$键= ABS(CRC32($ long_key))

通过这种方式,您可以获得查询和其他长密钥的唯一密钥,这些密钥可能会超出250个字符的memcache.

哇......小心.很好的建议,但没有重要的警告.这可能会导致碰撞.当然这是非常不可能的,但它只需要发生一次,以造成一个惊天动地的错误.您仍然可能希望使用memcached存储长密钥,并始终仔细检查密钥上的冲突.处理它们的最佳方法是存储一个简单的long_key/value对列表.


取决于你的缓存.如果缓存的信息对用户是私有的,则哈希冲突可能意味着泄露私有数据(我称之为破坏地球的错误).虽然有哈希使哈希冲突概率有效,但是crc32不是其中之一.哈希冲突的几率为1比2(http://preshing.com/20110504/hash-collision-probabilities)只需略微超过77000个值.对密钥使用更好的哈希函数会有所帮助,但我知道每个哈希表实现都会导致冲突.这并不难; 只需存储并检查密钥.
推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有