有人知道每件物品需要多少开销吗? 当我插入1字节密钥时,'stats'命令显示每个项目消耗65个字节。
这是预期和修复的吗?
谢谢, 彼得
答案 0 :(得分:8)
是的,Memcache自己的数据结构每个项目耗费超过50个字节。它取决于您的数据和密钥,因此在64位计算机上假设60+字节。
在查看memcache的代码时可以看到它:https://github.com/memcached/memcached/blob/master/memcached.h
以下是构成项目的原因:
/**
* Structure for storing items within memcached.
*/
typedef struct _stritem {
struct _stritem *next;
struct _stritem *prev;
struct _stritem *h_next; /* hash chain next */
rel_time_t time; /* least recent access */
rel_time_t exptime; /* expire time */
int nbytes; /* size of data */
unsigned short refcount;
uint8_t nsuffix; /* length of flags-and-length string */
uint8_t it_flags; /* ITEM_* above */
uint8_t slabs_clsid;/* which slab class we're in */
uint8_t nkey; /* key length, w/terminating null and padding */
/* this odd type prevents type-punning issues when we do
* the little shuffle to save space when not using CAS. */
union {
uint64_t cas;
char end;
} data[];
/* if it_flags & ITEM_CAS we have 8 bytes CAS */
/* then null-terminated key */
/* then " flags length\r\n" (no terminating null) */
/* then data with terminating \r\n (no terminating null; it's binary!) */
} item;
有3个指针,在64位机器上总计为3 * 8 = 24字节。那里有两个时间戳,应该是32位,因此它们共计8个字节。以下int应为8字节,short应为2,而u_int8应为单字节,因此它们总和为14.
总共有46个字节。
如果启用了CAS,则会有一个64位的CAS值,它会增加8个字节:总共54个字节
现在它变得凌乱:以下是字符数据,其中标志和数据长度以小数形式打印(代码可以在https://github.com/memcached/memcached/blob/master/items.c,第80行找到)。鉴于该标志为“0”,key为一个char,数据为空,这使得:
这是另一个10字节,为最小的memcache项目大小总共64字节(启用CAS,你可以使用-C选项禁用它)。
如果你得到65字节,也许你的客户设置了标志“10”或类似。
答案 1 :(得分:0)
它因项目类别而异,可以配置为更适合您的应用程序。您最好的选择是存储大量内容并监控缓存率。如果应用程序性能受到影响,那么您可以进行调整。