Memcached项目开销

时间:2011-11-14 22:24:32

标签: memcached

有人知道每件物品需要多少开销吗? 当我插入1字节密钥时,'stats'命令显示每个项目消耗65个字节。

这是预期和修复的吗?

谢谢, 彼得

2 个答案:

答案 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,数据为空,这使得:

  • 1个字节键+ 1个字节0
  • 1字节“空格”,1字节标志“0”,1字节“空格”,1字节“0”
  • 2字节“\ r \ n”(换行符)
  • 2个终止数据字节

这是另一个10字节,为最小的memcache项目大小总共64字节(启用CAS,你可以使用-C选项禁用它)。

如果你得到65字节,也许你的客户设置了标志“10”或类似。

答案 1 :(得分:0)

它因项目类别而异,可以配置为更适合您的应用程序。您最好的选择是存储大量内容并监控缓存率。如果应用程序性能受到影响,那么您可以进行调整。