Да, собственные структуры данных Memcache потребляют более 50 байт на элемент.Это немного зависит от ваших данных и ключа, поэтому предположим, что на 64-битной машине требуется более 60 байт.
Это видно при просмотре кода memcache: https://github.com/memcached/memcached/blob/master/memcached.h
Вот что делаетup элемент:
/**
* 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 байт, короткое число должно быть 2, а u_int8 должно быть одним байтом, поэтому они составляют до 14.
Это составляет в общей сложности 46 байтов.
ЕслиCAS означает, что есть 64-битное значение CAS, которое добавляет 8 байтов: всего 54 байта
Теперь все становится запутанным: ниже приведены символьные данные, где флаги и длина данных печатаются в виде десятичных дробей (код можетможно найти в https://github.com/memcached/memcached/blob/master/items.c, строка 80).Учитывая, что флаг равен «0», ключ равен одному символу, а данные пусты, это значит:
- 1 байт + 1 байт 0
- 1 байт «Пробел», 1Флаг байтов "0", 1 байт "Пробел", 1 байт "0"
- 2 Байт "\ r \ n" (перевод строки)
- 2 Байт для данных завершения
Это еще 10 байт, то есть всего 64 байта для наименьшего возможного размера элемента кэша памяти (CAS включен, вы можете отключить его с помощью опции -C).
Если вы получите 65 байт, может быть, ваш клиент установил флаг "10" или такой.