инструкция
Когда дело доходит до структуры данных Redis, мы, вероятно, подумаем о пяти общих структурах данных Redis: String, List, Hash, Set и Sorted Set, а также об их характеристиках и сценариях применения. Однако это структуры данных, предоставляемые Redis для операций API, и каковы основные базовые структуры данных, из которых они состоят?
- Простые динамические строки (SDS)
- связанный список
- Словарь
- стол для прыжков
- коллекция целых чисел
- Сжатый список
Адрес Redis на GitHubGitHub.com/Антиэнтузиазм/Горячие…
Простые динамические строки (SDS)
Redis написан на C, но Redis не использует строковое представление C (C — это строковое представление).\0
массив символов, оканчивающийся нулем), вместо этого строитпростая динамическая строка(простая динамическая строка, SDS) абстрактный тип и используется в качестве строкового представления по умолчанию для Redis.
В Redis базовые пары ключ-значение, содержащие строковые значения, реализованы с помощью SDS.
Определение паспорта безопасности
Структура SDS определена вsds.h
В файле определение SDS имеет некоторые изменения после версии Redis 3.2, от одной структуры данных до пяти структур данных, и разные структуры будут выбираться в соответствии с длиной содержимого, хранящегося в SDS, для достижения эффекта экономии памяти. , Определение структуры, мы смотрим на следующий код
// 3.0
struct sdshdr {
// 记录buf数组中已使用字节的数量,即SDS所保存字符串的长度
unsigned int len;
// 记录buf数据中未使用的字节数量
unsigned int free;
// 字节数组,用于保存字符串
char buf[];
};
// 3.2
/* Note: sdshdr5 is never used, we just access the flags byte directly.
* However is here to document the layout of type 5 SDS strings. */
struct __attribute__ ((__packed__)) sdshdr5 {
unsigned char flags; /* 3 lsb of type, and 5 msb of string length */
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr8 {
uint8_t len; /* used */
uint8_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr16 {
uint16_t len; /* used */
uint16_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr32 {
uint32_t len; /* used */
uint32_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr64 {
uint64_t len; /* used */
uint64_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[];
};
После версии 3.2 соответствующая структура данных будет выбираться в соответствии с длиной строки.
static inline char sdsReqType(size_t string_size) {
if (string_size < 1<<5) // 32
return SDS_TYPE_5;
if (string_size < 1<<8) // 256
return SDS_TYPE_8;
if (string_size < 1<<16) // 65536 64k
return SDS_TYPE_16;
if (string_size < 1ll<<32) // 4294967296 4G
return SDS_TYPE_32;
return SDS_TYPE_64;
}
Следующее основано на версии 3.2.sdshdr8
посмотреть пример
-
len
: Запишите количество используемых в настоящее время байтов (исключая'\0'
), сложность получения длины SDS составляет O(1) -
alloc
: Запишите общее количество байтов, выделенных текущим массивом байтов (исключая'\0'
) -
flags
: отметить атрибут текущего массива байтов, даsdshdr8
все ещеsdshdr16
И т.д., определение значения флагов можно увидеть в следующем коде -
buf
: массив байтов для хранения строки, включая конечные пробельные символы.'\0'
// flags值定义
#define SDS_TYPE_5 0
#define SDS_TYPE_8 1
#define SDS_TYPE_16 2
#define SDS_TYPE_32 3
#define SDS_TYPE_64 4
Пустое пространство в массиве байтов выше представляет собой неиспользуемое пространство, которое является стратегией использования пространства, оптимизированной Redis, оставляя место для строковых операций для обеспечения безопасности и повышения эффективности.
Разница между строками SDS и C
Язык C использует массив символов длины N+1 для представления строки длины N, а последним элементом массива символов является нулевой символ.'\0'
, но этот простой метод представления строк не может соответствовать требованиям Redis к безопасности, эффективности и функциональности строк, так в чем преимущества использования SDS?
Обратитесь к разделу «Проектирование и реализация Redis».
Постоянная сложность для получения длины строки
Строка C не записывает длину строки.Чтобы получить длину, нужно пройти всю строку, а сложность O(N), а сама структура SDS имеет запись длины строки.len
свойства, все со сложностью O (1). Redis снижает сложность, необходимую для получения длины строки, с O(N) до O(1), гарантируя, что работа по получению длины строки не станет узким местом производительности для Redis.
Исключите переполнение буфера и уменьшите количество перераспределений памяти при изменении строк.
Строки C не записывают свою собственную длину, и каждый раз, когда строка увеличивается или сокращается, выполняется операция перераспределения памяти в базовом массиве символов. Если размер пространства базовых данных не увеличивается за счет перераспределения памяти перед операцией объединения, произойдет переполнение буфера; если неиспользуемое пространство не будет освобождено за счет перераспределения памяти после усеченной операции обрезки, произойдет утечка памяти.
SDS разделяет длину строки и базовую длину данных через неиспользуемое пространство.Версия 3.0 используетfree
Свойство записывает неиспользуемое пространство, версия 3.2alloc
Свойство записывает общее количество выделенных байтов. За счет неиспользуемого пространства SDS достигаетпредварительное выделение пространстваиВыпуск инертного пространстваДве оптимизированные стратегии распределения пространства для решения проблемы с конкатенацией и перехватом строк.
бинарный сейф
Символы в строке C должны соответствовать определенной кодировке.За исключением конца строки, строка не может содержать нулевые символы, в противном случае она будет считаться концом строки, что ограничивает строку C сохранением только текстовых данных. , и не может сохранять двоичные данные, такие как изображения
SDS API будет обрабатываться в двоичном виде и храниться вbuf
Данные в массиве не накладывают никаких ограничений на данные в нем. использование паспортов безопасностиlen
Значение свойства, чтобы определить, заканчивается ли строка, а не нулевой символ
Совместимость с некоторыми строковыми функциями C
Хотя SDS API является двоично-безопасным, он по-прежнему завершается нулем, как строки C. Цель состоит в том, чтобы позволить SDS, который сохраняет текстовые данные, повторно использовать некоторые функции строки C.
Сравнение строк C и SDS
струна до | SDS |
---|---|
Сложность получения длины строки O(N) | Сложность получения длины строки O(1) |
API небезопасен и может вызвать переполнение буфера | API безопасен и не вызывает переполнения буфера. |
Изменение длины строки неизбежно потребует перераспределения памяти. | Изменение длины строки N раз потребует не более N перераспределений памяти. |
Только текстовые данные могут быть сохранены | Может сохранять текст или двоичные данные |
может использовать все<string.h> функции в библиотеке |
можно использовать часть<string.h> функции в библиотеке |
связанный список
Связанный список — это относительно распространенная структура данных, которая характеризуется простотой вставки и удаления, высоким уровнем использования памяти и гибкостью настройки длины связанного списка, но к ней трудно получить произвольный доступ. Многие языки программирования высокого уровня имеют встроенные реализации связанных списков, но язык C не реализует связанные списки, поэтому Redis реализует собственную структуру данных связанных списков.
Связанные списки широко используются в Redis, а базовая реализация списков — это связанные списки. Кроме того, Redis для публикации и подписки, медленных запросов, мониторинга и других функций также использует связанные списки.
Определение узлов связанных списков и связанных списков
Узлы в связанном списке определяются следующим образом:adlist.h/listNode
typedef struct listNode {
// 前置节点
struct listNode *prev;
// 后置节点
struct listNode *next;
// 节点值
void *value;
} listNode;
Связанный список определяется следующим образом:adlist.h/list
typedef struct list {
// 链表头节点
listNode *head;
// 链表尾节点
listNode *tail;
// 节点值复制函数
void *(*dup)(void *ptr);
// 节点值释放函数
void (*free)(void *ptr);
// 节点值对比函数
int (*match)(void *ptr, void *key);
// 链表所包含的节点数量
unsigned long len;
} list;
каждый узелlistNode
в состоянии пройтиprev
иnext
Распределение указателей указывает на предыдущий узел и следующий узел для формирования двустороннего связанного списка, и каждый связанный список также будет иметьlist
Структура предоставляет указатель заголовка для связанного списка.head
, Хвостовой указательtail
, и счетчик длины связанного спискаlen
и еще три функции для конкретных типов для реализации полиморфных связанных списков.
-
dup
: используется для копирования значения, хранящегося в узле связанного списка. -
free
: используется для освобождения значения, хранящегося в узле связанного списка. -
match
: используется для сравнения значения, сохраненного узлом связанного списка, с другим входным значением.
Схема структуры связанного списка
Функции связанного списка
- Двусторонний связанный список: с указателями на пре-узел и пост-узел сложность получения этих двух узлов составляет O (1).
- Ациклический: узел заголовка
prev
и хвостовой узелnext
Оба указывают на NULL, и доступ к связанному списку заканчивается на NULL - Счетчик длины связанного списка: с
len
Атрибут, сложность получения длины связанного списка O(1) - Полиморфизм: использование узлов связанного списка
void*
Указатели содержат значения узлов и могут содержать различные типы значений.
Словарь
Словарь, также известный как таблица символов, ассоциативный массив или карта, представляет собой абстрактную структуру данных, используемую для хранения пар ключ-значение. Каждый ключ в словаре уникален, связанное с ним значение можно найти по ключу, а также изменить или удалить его.
Хранение пары ключ-значение в Redis реализовано со словарем, и одна из базовых реализаций хэша (Hash) также является словарем.
Давайте посмотрим непосредственно на то, как определяются и реализуются словари.
Реализация определения словаря
Базовый словарь Redis должен использоватьхеш-таблицаРеализовано, хеш-таблица может иметь несколькоузел хеш-таблицы, каждый узел хеш-таблицы содержит один из словарейпара ключ-значение
Определение структуры хеш-таблицы,dict.h/dictht
typedef struct dictht {
// 哈希表数组
dictEntry **table;
// 哈希表大小
unsigned long size;
// 哈希表大小掩码,用于计算索引值,等于size-1
unsigned long sizemask;
// 哈希表已有节点的数量
unsigned long used;
} dictht;
Хеш-таблицы состоят из массивовtable
сочинение,table
Каждый элемент является указателем наdict.h/dictEntry
Указатель на структуру, узел хеш-таблицы определяется следующим образом
typedef struct dictEntry {
// 键
void *key;
// 值
union {
void *val;
uint64_t u64;
int64_t s64;
double d;
} v;
// 指向下一个哈希表节点,形成链表
struct dictEntry *next;
} dictEntry;
вkey
наш ключ;v
ключевое значение, которое может быть указателем, целым числом или числом с плавающей запятой;next
Атрибут — это указатель на следующий узел хеш-таблицы, который может сделать несколько пар ключ-значение с одним и тем же значением хеш-функции в виде связанного списка для решения проблемы конфликта ключей.
Наконец, наша структура словаря,dict.h/dict
typedef struct dict {
// 和类型相关的处理函数
dictType *type;
// 私有数据
void *privdata;
// 哈希表
dictht ht[2];
// rehash 索引,当rehash不再进行时,值为-1
long rehashidx; /* rehashing not in progress if rehashidx == -1 */
// 迭代器数量
unsigned long iterators; /* number of iterators currently running */
} dict;
type
свойства иprivdata
Атрибуты представляют собой пары ключ-значение для разных типов и используются для создания многотипных словарей.type
указывает наdictType
указатель на структуру,privdata
затем содержит необязательные параметры, которые необходимо передать в функцию, специфичную для типа, оdictType
Структуру и функции, специфичные для типа, можно увидеть в следующем коде.
typedef struct dictType {
// 计算哈希值的行数
uint64_t (*hashFunction)(const void *key);
// 复制键的函数
void *(*keyDup)(void *privdata, const void *key);
// 复制值的函数
void *(*valDup)(void *privdata, const void *obj);
// 对比键的函数
int (*keyCompare)(void *privdata, const void *key1, const void *key2);
// 销毁键的函数
void (*keyDestructor)(void *privdata, void *key);
// 销毁值的函数
void (*valDestructor)(void *privdata, void *obj);
} dictType;
dict
изht
свойство представляет собой двухэлементный массив, содержащий дваdictht
Хэш-таблица, используется только общий словарьht[0]
хеш-таблица,ht[1]
Хэш-таблица будетht[0]
хеш-таблицаrehash
(повторное хеширование), то есть, когда количество пар ключ-значение в хеш-таблице превышает количество загрузок, пары ключ-значение будут перенесены вht[1]
начальство
rehashidx
Это также связано с перефразированием.Операция перефразирования не завершается в одно мгновение.rehashidx
Записывает ход перефразирования, если в данный момент перефразирование не выполняется, его значение равно -1.
Объединив вышеуказанные структуры, давайте посмотримСтруктура словаря(переработка не ведется)
Здесь работа алгоритма хеширования и перехеширования (повторного хэширования) подробно описываться не будет, и в дальнейшем будет представлено отдельно.
Когда в словарь нужно добавить новую пару ключ-значение, хеш-значение и значение индекса будут вычисляться в соответствии с ключом пары ключ-значение и помещаться в соответствующую хэш-таблицу в соответствии со значением индекса, то есть , если значение индекса равно 0, то поставить
ht[0]
на хеш-таблице. Происходит, когда два или более ключа назначаются одному и тому же индексу в массиве хэш-таблицы.ключевой конфликтПроблема с использованием хеш-таблицыметод цепного адресарешить, т. е. используя узел хеш-таблицыnext
Указатель для подключения нескольких узлов к одному и тому же индексу. Когда в хеш-таблице слишком много или слишком мало пар ключ-значение, хеш-таблицу необходимо расширить и сжать с помощьюrehash
(перефразируя) выполнить
стол для прыжков
Временная сложность запроса элемента в обычном односвязном списке составляет O(N), даже если односвязный список отсортирован. Использование списка пропуска (SkipList) предназначено для решения проблемы поиска. Это упорядоченная структура данных, а не сбалансированная древовидная структура или хэш-структура. Он поддерживает несколько указателей на другие узлы в каждом узле. И достигает цели быстрого доступ к узлу
Таблица пропуска — одна из базовых реализаций отсортированного набора.Если отсортированный набор содержит много элементов или члены элементов представляют собой относительно длинные строки, Redis будет использовать таблицу пропуска в качестве базовой реализации отсортированного набора.
Определение таблицы пропуска
Таблицу переходов на самом деле можно понимать какмногоуровневый связанный список, он обладает следующими свойствами
- многослойныйструктуры, каждый слой представляет собойупорядоченный связанный список
- Связный список самого низкого уровня (уровень 1) содержит все элементы
- Количество операций поиска в таблице пропуска аналогично количеству слоев, временная сложность — O(logn), а вставка и удаление — также O(logn).
- Таблица пропуска представляет собой рандомизированную структуру данных (количество слоев определяется подбрасыванием монеты).
Итак, как понять список переходов, мы начинаем с нижнего списка, который содержит все элементы, учитывая следующий список
Затем мы помещаем каждый второй элемент в связанный список предыдущего уровня, здесь я называю этовсплыть(Обратите внимание, что научный подходбросить монетуметод, чтобы определить, перемещается ли элемент на верхний уровень связанного списка, здесь я просто перемещаю каждый другой элемент на верхний уровень связанного списка, легко понять), структура после завершения операции выглядит следующим образом
Способ поиска элементов такой, начиная с верхнего слоя, найти голову справа от большого числа и найти голову слева от десятичной, например, я хочу найти17
, порядок запроса: 13 -> 46 -> 22 -> 17; если это поиск35
, то 13 -> 46 -> 22 -> 46 -> 35; если54
, то 13 -> 46 -> 54
Вышеупомянутое, чтобы найти элемент.Если это добавить элемент, он определяется путем подбрасывания монеты, сколько слоев появится элемент, то есть он будет иметь 1/2 вероятность появления во втором слое и вероятность появления в первом слое 1/4.Три этажа...
Удаление и добавление узлов таблицы пропуска непредсказуемо, и трудно гарантировать, что индекс таблицы пропуска всегда будет однородным Способ подбрасывания монеты может сделать его в целом однородным.
Предполагая, что у нас уже есть таблица пропуска из приведенного выше примера, давайте добавим в нее элемент18
, Определить количество слоев, в которых она появится, подбрасывая монету. Если выпадет решка, то она продолжится, а если решка, она остановится. Если я подброшу монету дважды, в первый раз выпадет орел, а во второй раз решка
Удаление таблицы переходов очень просто, если сначала найти удаляемый узел, а затем удалить один и тот же узел в каждом слое.
Стоимость поддержания структурного баланса таблицы пропуска относительно невелика, и он полностью зависит от случайности.По сравнению с двоичным деревом поиска, после нескольких вставок и удалений требуется перебалансировка для корректировки структурного баланса.
Реализация таблицы пропуска
Реализация таблицы пропуска Redis выполняетсяredis.h/zskiplistNode
иredis.h/zskiplist
(После версии 3.2 redis.h был изменен на server.h) Два определения структуры,zskiplistNode
определить узлы таблицы пропуска,zskiplist
Сохранить информацию об узлах таблицы пропуска
/* ZSETs use a specialized version of Skiplists */
typedef struct zskiplistNode {
// 成员对象 (robj *obj;)
sds ele;
// 分值
double score;
// 后退指针
struct zskiplistNode *backward;
// 层
struct zskiplistLevel {
// 前进指针
struct zskiplistNode *forward;
// 跨度
// 跨度实际上是用来计算元素排名(rank)的,在查找某个节点的过程中,将沿途访过的所有层的跨度累积起来,得到的结果就是目标节点在跳跃表中的排位
unsigned long span;
} level[];
} zskiplistNode;
typedef struct zskiplist {
// 表头节点和表尾节点
struct zskiplistNode *header, *tail;
// 表中节点的数量
unsigned long length;
// 表中层数最大的节点的层数
int level;
} zskiplist;
zskiplistNode
структура
-
level
Массив (слой): Каждый раз, когда создается новый узел таблицы пропуска, размер массива уровней вычисляется по степенному закону, то есть высота подслоя, и каждый слой имеет два атрибута —указатель впередиохватывать, прямой указатель используется для доступа к другим указателям в направлении конца таблицы; диапазон используется для записи расстояния между текущим узлом и узлом, на который указывает прямой указатель (указатель равен NULL, а ширина равно 0) -
backward
(обратный указатель): указывает на предыдущий узел текущего узла -
score
(оценка): используется для сортировки, если оценки совпадают, переменные-члены сортируются в лексикографическом порядке. -
obj
илиele
: объект-член представляет собой указатель, указывающий на строковый объект, в котором хранится sds; объект-член каждого узла в таблице переходов должен быть уникальным, а оценка может быть одинаковой.
zskiplist
структура
-
header
,tail
узел заголовка и узел нижнего колонтитула -
length
количество узлов в таблице -
level
Количество слоев узла с наибольшим количеством слоев в таблице
Предположим, теперь мы показываем таблицу переходов с четырьмя узлами, а высоты узлов равны 2, 1, 4 и 3.
zskiplist
Головной узел не является допустимым узлом, он имеетZSKIPLIST_MAXLEVELслоев (32 слоя), каждый слойforward
Указывает на первый узел таблицы переходов этого слоя, если нет, то это NULL.В Redis структура таблицы переходов выше выглядит следующим образом
- Количество слоев каждого узла таблицы пропуска составляет от 1 до 32.
- В таблице переходов узлы сортируются в соответствии с размером оценки.Оценки нескольких узлов могут быть одинаковыми.Если они одинаковы, узлы сортируются в соответствии с размером объекта-члена.
- Переменные-члены должны быть уникальными для каждого узла.
коллекция целых чисел
Целочисленный набор (intset) — это абстрактная структура данных коллекции, используемая Redis для хранения целочисленных значений. Она может хранить целочисленные значения типов int16_t, int32_t и int64_t и гарантирует отсутствие повторяющихся элементов в коллекции.
Целочисленный набор является одной из базовых реализаций набора.Если набор содержит только целочисленные элементы и число элементов невелико, целочисленный набор будет использоваться в качестве базовой реализации.
Определение и реализация множества целых чисел
Набор целых чисел определяется какinset.h/inset
typedef struct intset {
// 编码方式
uint32_t encoding;
// 集合包含的元素数量
uint32_t length;
// 保存元素的数组
int8_t contents[];
} intset;
-
contents
Массив: каждый элемент набора целых чисел сортируется в массиве в порядке возрастания значения и не содержит дубликатов. -
length
Запишите количество элементов целочисленной коллекции, то есть длину массива содержимого. -
encoding
Определите реальный тип массива содержимого, например INTSET_ENC_INT16, INTSET_ENC_INT32, INTSET_ENC_INT64.
Обновление целочисленной коллекции
Если вы хотите добавить новый элемент в набор целых чисел, а тип нового элемента длиннее, чем тип всех существующих элементов набора целых чисел, перед добавлением нового элемента необходимо обновить набор целых чисел. к множеству целых чисел. Каждый раз, когда вы хотите добавить новый элемент в целочисленную коллекцию, это может привести к обновлению, и каждое обновление требует преобразования типов всех существующих элементов базового массива.
Обновление добавляет новые элементы:
- Расширяет размер базового массива целочисленной коллекции в соответствии с новым типом элемента и выделяет место для нового элемента.
- Преобразуйте существующие элементы массива в тип нового элемента и поместите преобразованные элементы в правильное положение и сохраните порядок массива.
- Добавить новые элементы в базовый массив
Стратегия обновления целочисленных наборов может повысить гибкость целочисленных наборов и максимально сэкономить память.
Кроме того, целочисленная коллекция не поддерживает понижение версии, после обновления кодировка всегда останется в обновленном состоянии.
Сжатый список
Сжатый список (ziplist) предназначен для экономии памяти. Это последовательная структура данных, состоящая из ряда специально закодированных смежных блоков памяти. Сжатый список может содержать несколько узлов, и каждый узел может сохранять один байт, массив или целочисленное значение.
Сжатые списки являются одной из базовых реализаций списков и хэшей. Список содержит лишь небольшое количество элементов списка, и каждый элемент списка представляет собой небольшое целочисленное значение или относительно короткую строку. В качестве базовой реализации используются сжатые списки (после используется версия 3.2quicklist
выполнить)
Состав сжатого списка
Упакованный список может содержать несколько записей, каждая из которых может содержать массив байтов или целочисленное значение.
Компоненты каждой части описаны следующим образом
-
zlbytes
: записать количество байтов памяти, занимаемых всем списком сжатия, перераспределить память в списке сжатия или вычислитьzlend
расположение -
zltail
: Запишите количество байтов от начального адреса списка сжатия до конечного узла списка сжатия.По этому смещению можно определить адрес конечного узла без обхода всего списка сжатия. -
zllen
: Запишите количество узлов, содержащихся в сжатом списке, но когда значение этого атрибута меньше UINT16_MAX (65535), значение представляет собой количество узлов в сжатом списке, в противном случае необходимо пройти весь сжатый список, чтобы рассчитать фактическое количество узлов -
entryX
: узлы сжатого списка -
zlend
: специальное значение 0xFF (десятичное число 255), используемое для обозначения конца упакованного списка.
Состав узлов сжатого списка
Каждый узел сжатого списка может содержать число байтов или целочисленное значение, структура выглядит следующим образом.
-
previous_entry_ength
: запись длины предыдущего байта сжатого списка -
encoding
: Кодировка узла сохраняет тип содержимого содержимого узла. -
content
: Область содержимого используется для сохранения содержимого узла Тип содержимого и длина узла определяются кодировкой
объект
Основные базовые структуры данных Redis представлены выше, включая простые динамические строки (SDS), связанные списки, словари, таблицы переходов, целочисленные наборы и сжатые списки. Однако Redis не использует эти структуры данных напрямую для построения базы данных пары ключ-значение, а создает объектную систему на основе этих структур данных, то есть тех типов данных Redis, управляемых API, с которыми мы знакомы, например String , Список, Хэш, Набор, Отсортированный набор
В зависимости от типа объекта можно судить о том, может ли объект выполнить данную команду.Он также может быть реализован с использованием различных структур данных для различных сценариев использования, чтобы оптимизировать эффективность использования объекта в различных сценариях. сценарии.
тип | кодирование | Вывод команды OBJECT ENCODING | объект |
---|---|---|---|
REDIS_STRING | REDIS_ENCODING_INT | "int" | Строковый объект, реализованный с использованием целочисленных значений |
REDIS_STRING | REDIS_ENCODING_EMBSTR | "embstr" | Строковый объект, реализованный с использованием простых динамических строк, закодированных в embstr |
REDIS_STRING | REDIS_ENCODING_RAW | "raw" | Строковый объект, реализованный с использованием простых динамических строк |
REDIS_LIST | REDIS_ENCODING_ZIPLIST | "ziplist" | Объект списка, реализованный с использованием сжатых списков |
REDIS_LIST | REDIS_ENCODING_LINKEDLIST | '"linkedlist' | Объект списка, реализованный с использованием двусвязного списка |
REDIS_HASH | REDIS_ENCODING_ZIPLIST | "ziplist" | Хэш-объект, реализованный с использованием сжатых списков |
REDIS_HASH | REDIS_ENCODING_HT | "hashtable" | Хэш-объект, реализованный с использованием словаря |
REDIS_SET | REDIS_ENCODING_INTSET | "intset" | Объект коллекции, реализованный с использованием коллекции целых чисел. |
REDIS_SET | REDIS_ENCODING_HT | "hashtable" | Объекты коллекции, реализованные с помощью словарей |
REDIS_ZSET | REDIS_ENCODING_ZIPLIST | "ziplist" | Отсортированные объекты коллекции, реализованные с использованием сжатых списков |
REDIS_ZSET | REDIS_ENCODING_SKIPLIST | "skiplist" | Отсортированный объект коллекции, реализованный с использованием таблицы пропуска таблицы |
Ссылка: «Проектирование и реализация Redis»