Architecture 如何为memcached设计一个允许大于1MB的值的包装器?

Architecture 如何为memcached设计一个允许大于1MB的值的包装器?,architecture,memcached,system,Architecture,Memcached,System,在最近一次Skype采访的15分钟片段中,我被要求设计这样一个包装,以下是我的设计。我希望收到更多关于这个设计的意见,如果有更好的设计方法的话 要求:一个围绕Memcached的键值存储包装器(没有任何其他数据结构),它支持任何大小的值输入,因为Memcached的值存储限制为1MB 提案: 数据结构:相同的memcached 设置(键、值):假设输入键为memlarge 检查是否sizeOf(value)>1MB,如果是,将值拆分为多个大小为1MB的二进制文件,并set将每个二进制文件设置为

在最近一次Skype采访的15分钟片段中,我被要求设计这样一个包装,以下是我的设计。我希望收到更多关于这个设计的意见,如果有更好的设计方法的话

要求:一个围绕Memcached的键值存储包装器(没有任何其他数据结构),它支持任何大小的值输入,因为Memcached的值存储限制为1MB

提案

  • 数据结构:相同的memcached

  • 设置(键、值)
    :假设输入键为
    memlarge

    • 检查是否
      sizeOf(value)
      >1MB,如果是,将值拆分为多个大小为1MB的二进制文件,并
      set
      将每个二进制文件设置为memcached,密钥方案如下:

    • 计算键的固定大小哈希码(例如使用
      md5
      ):
      memlarge-1
      memlarge-2
      ,…,
      memlarge-n
      ,假设结果为
      ABC
      DEF
      GHI

    • 连接这些固定大小的散列码并将其保存为原始键的值,向其添加后缀和前缀以防止
      get
      方法将其他值误解为键数组。因此,现在
      memlarge
      缓存了值
      prefixABCDEFGHIsuffix
      ,即
      get('memlarge')
      将首先返回
      prefixABCDEFGHIsuffix
      (然后在下面进行详细说明)
  • 获取(键)

    • 检查结果是否具有数组的前缀和后缀

    • 如果是,则执行后续的
      get
      操作,通过哈希代码know size-->
      get('ABC')、get('DEF')、get('GHI')
      分隔值
      ABCDEFGH
      来获取原始值,并最终加入值以返回给用户

  • 对提案的评论,跟进问题:

  • 即使使用后缀和前缀,随机保存的值仍有(非常小的)机会拥有此后缀和前缀。然后,修复方法是在省略前缀/后缀和校验和(md5)后对剩余值进行长度检查

  • 大小为4MB的值需要5次
    get
    操作。有没有办法把它减少到4

    我认为解决这个问题的方法是使用链表的思想,但是在位/字节级别实现。值块将在1MB限制之前结束,以便为需要另一个
    get
    (下一个节点)的“信号”节省空间。然后,信号的设计可以类似于上面的“阵列”思想


  • 你必须质疑最初的请求。如果你使用memcache(进程外)存储一个大文件,比如skype中的面试,你不仅会获得更好的性能,而且会获得更低的速度和性能;因为您可能知道,要放入memcache(进程外)的所有内容都需要序列化,然后当您从缓存中读取它时,它需要再次反序列化。每次尝试从进程外缓存中获取1 MB对象时,在内存中构建该对象将消耗大量CPU。在您的情况下,如果您在需要时将访问加载到内存中,速度会快得多

    您必须质疑原始请求。如果你使用memcache(进程外)存储一个大文件,比如skype中的面试,你不仅会获得更好的性能,而且会获得更低的速度和性能;因为您可能知道,要放入memcache(进程外)的所有内容都需要序列化,然后当您从缓存中读取它时,它需要再次反序列化。每次尝试从进程外缓存中获取1 MB对象时,在内存中构建该对象将消耗大量CPU。在您的情况下,如果您在需要时将访问加载到内存中,速度会快得多

    我认为你没有抓住问题的重点。这些问题特别要求我们为Memcached设计一个包装器,使用Memcached作为主要数据存储,它的值应该在1MB到GB之间。我认为你没有抓住问题的关键。这些问题特别要求我们为Memcached设计一个包装器,使用Memcached作为主要数据存储,它的值应该在1MB到GB之间。