我被要求在最近的一次15分钟的Skype采访中设计这样一个包装,这是我的设计。我希望能收到更多有关此设计的意见,以及是否有更好的设计方法。
要求: Memcached(没有任何其他数据结构)的键值存储包装器,支持任意大小的值输入,因为Memcached在值存储上的限制为1MB。
提案:
数据结构:相同的memcached
set(key, value)
:输入密钥为memlarge
检查sizeOf(value)
> 1MB,如果是,则将值拆分为多个大小为1MB的二进制文件,并将每个set
拆分为memcached,密钥方案如下:
计算一个固定大小的密钥哈希码(例如使用md5
):memlarge-1
,memlarge-2
,...,memlarge-n
,说结果会是ABC
,DEF
,GHI
get
方法将其他值误解为键数组。所以现在memlarge
缓存了值prefixABCDEFGHIsuffix
,即get('memlarge')
将首先返回prefixABCDEFGHIsuffix
(然后更多) get(key)
:
检查结果是否具有数组的前缀和后缀
如果是,请执行后续的get
操作,以通过哈希码知道大小来划分值ABCDEFGH
来获取原始值 - > get('ABC'), get('DEF'), get('GHI')
并最终加入该值以返回给用户
批评提案,跟进问题:
即使使用后缀和前缀,随机保存的值仍有(非常小)的机会拥有此后缀&字首。在省略prefix / suffix和校验和(md5)之后,修复将是剩余值的长度检查。
值大小为4MB需要5次get
次操作。有没有办法将其减少到4?
我认为对此的解决方案是使用链表的想法,但是在位/字节级实现。值块将在1MB限制之前结束,以便为需要另一个get
(下一个节点)的“信号”节省空间。然后信号可以与上面的“阵列”想法类似地设计。
答案 0 :(得分:-1)
您必须质疑原始请求。如果你使用memcache(进程外)来存储像skype中的访谈这样的大文件,你不仅会获得更好的性能,而且还会降低速度和性能;因为你可能知道将要放在内存中的所有东西(进程外)需要进行血清化,然后当你从缓存中读取它时,需要再次反序列化。每次你尝试从进程外缓存中获取一个1 MB的对象时,它将消耗大量的CPU来在内存中构建该对象。在你的情况下,如果你在需要时将访问加载到内存中会更快。