Architecture 如何为memcached设计一个允许大于1MB的值的包装器?
在最近一次Skype采访的15分钟片段中,我被要求设计这样一个包装,以下是我的设计。我希望收到更多关于这个设计的意见,如果有更好的设计方法的话 要求:一个围绕Memcached的键值存储包装器(没有任何其他数据结构),它支持任何大小的值输入,因为Memcached的值存储限制为1MB 提案:Architecture 如何为memcached设计一个允许大于1MB的值的包装器?,architecture,memcached,system,Architecture,Memcached,System,在最近一次Skype采访的15分钟片段中,我被要求设计这样一个包装,以下是我的设计。我希望收到更多关于这个设计的意见,如果有更好的设计方法的话 要求:一个围绕Memcached的键值存储包装器(没有任何其他数据结构),它支持任何大小的值输入,因为Memcached的值存储限制为1MB 提案: 数据结构:相同的memcached 设置(键、值):假设输入键为memlarge 检查是否sizeOf(value)>1MB,如果是,将值拆分为多个大小为1MB的二进制文件,并set将每个二进制文件设置为
设置(键、值)
:假设输入键为memlarge
- 检查是否
>1MB,如果是,将值拆分为多个大小为1MB的二进制文件,并sizeOf(value)
将每个二进制文件设置为memcached,密钥方案如下:set
- 计算键的固定大小哈希码(例如使用
):md5
,memlarge-1
,…,memlarge-2
,假设结果为memlarge-n
,ABC
,DEF
GHI
- 连接这些固定大小的散列码并将其保存为原始键的值,向其添加后缀和前缀以防止
方法将其他值误解为键数组。因此,现在get
缓存了值memlarge
,即prefixABCDEFGHIsuffix
将首先返回get('memlarge')
(然后在下面进行详细说明)prefixABCDEFGHIsuffix
获取(键)
:
- 检查结果是否具有数组的前缀和后缀
- 如果是,则执行后续的
操作,通过哈希代码know size-->get
分隔值get('ABC')、get('DEF')、get('GHI')
来获取原始值,并最终加入值以返回给用户ABCDEFGH
get
操作。有没有办法把它减少到4
我认为解决这个问题的方法是使用链表的思想,但是在位/字节级别实现。值块将在1MB限制之前结束,以便为需要另一个get
(下一个节点)的“信号”节省空间。然后,信号的设计可以类似于上面的“阵列”思想你必须质疑最初的请求。如果你使用memcache(进程外)存储一个大文件,比如skype中的面试,你不仅会获得更好的性能,而且会获得更低的速度和性能;因为您可能知道,要放入memcache(进程外)的所有内容都需要序列化,然后当您从缓存中读取它时,它需要再次反序列化。每次尝试从进程外缓存中获取1 MB对象时,在内存中构建该对象将消耗大量CPU。在您的情况下,如果您在需要时将访问加载到内存中,速度会快得多 您必须质疑原始请求。如果你使用memcache(进程外)存储一个大文件,比如skype中的面试,你不仅会获得更好的性能,而且会获得更低的速度和性能;因为您可能知道,要放入memcache(进程外)的所有内容都需要序列化,然后当您从缓存中读取它时,它需要再次反序列化。每次尝试从进程外缓存中获取1 MB对象时,在内存中构建该对象将消耗大量CPU。在您的情况下,如果您在需要时将访问加载到内存中,速度会快得多 我认为你没有抓住问题的重点。这些问题特别要求我们为Memcached设计一个包装器,使用Memcached作为主要数据存储,它的值应该在1MB到GB之间。我认为你没有抓住问题的关键。这些问题特别要求我们为Memcached设计一个包装器,使用Memcached作为主要数据存储,它的值应该在1MB到GB之间。