предисловие
Большинство языков программирования предоставляютхэш(hash
) типы, их можно назватьхэш,Словарь,ассоциативный массив. существуетRedis
середина,тип хешаозначает, что само значение ключа являетсяструктура ключ-значение.
хэшВ формеvalue={ {field1,value1},...{fieldN,valueN} }
,Redis
пара ключ-значениеитип хешаОтношения между ними показаны на рисунке:
в виде хешаСопоставление отношенийназывается
field-value
,здесьvalue
Относится кfield
соответствующийценность,нетключсоответствующее значение.
Другие статьи
-
Углубленный анализ серии Redis (1) — введение в Redis и построение master-slave
-
Углубленный анализ серии Redis (2) — контрольный режим Redis и кластер высокой доступности
-
Углубленный анализ серии Redis (4) — Обзор структуры данных Redis и глобальных команд
-
Углубленный анализ серии Redis (5) — Строка структуры данных Redis
-
Углубленный анализ серии Redis (6) — хэш структуры данных Redis
-
Углубленный анализ серии Redis (7) — Список структур данных Redis
-
Углубленный анализ серии Redis (8) — коллекции структур данных Redis.
текст
1. Связанные команды
1.1 Основные команды
1.1.1. Установка значений
hset key field value
Нижеuser:1
добавить паруfield-value
, если настройка выполнена успешно, возвращается1
, иначе вернется0
.
127.0.0.1:6379> hset user:1 name tom
(integer) 1
такжеRedis
при условииhsetnx
команды, их взаимосвязь подобнаset
иsetnx
Команда та же, за исключениемсфераЗависит отключстатьfield
.
1.1.2. Получить значение
hget key field
Для получения используются следующие операции.user:1
изname
домен (атрибут)соответствующее значение.
127.0.0.1:6379> hget user:1 name
"tom"
еслиключилиfield
не существует, вернетсяnil
:
127.0.0.1:6379> hget user:2 name
(nil)
127.0.0.1:6379> hget user:1 age
(nil)
1.1.3. Удалить поле
hdel key field [field ...]
hdel
удалитодин или больше field
, возвращаемый результатУспешно удалено field
номер, например:
127.0.0.1:6379> hdel user:1 name
(integer) 1
127.0.0.1:6379> hdel user:1 age
(integer) 0
1.1.4 Подсчет количества полей
hlen key
например ключuser:1
имеют3
Кусокfield
:
127.0.0.1:6379> hset user:1 name tom
(integer) 1
127.0.0.1:6379> hset user:1 age 23
(integer) 1
127.0.0.1:6379> hset user:1 city chengdu
(integer) 1
127.0.0.1:6379> hlen user:1
(integer) 3
1.1.5 Пакетная установка или получение значения поля
hmget key field [field ...] hmset key field value [field value ...]
hmset
иhmget
соответственноПакетные настройкииПолучать field-value
,hmset
Требуемые параметрыkey
имного пар field-value
,hmget
Требуемые параметрыkey
инесколько field
. Например:
127.0.0.1:6379> hmset user:1 name tom age 12 city chengdu
OK
127.0.0.1:6379> hmget user:1 name city
1) "tom"
2) "chengdu"
1.1.6. Определить, существует ли поле
hexists key field
Напримерuser:1
Включаютname
домен, поэтому возвращаемый результат1
, вернуть, если не включены0
:
127.0.0.1:6379> hexists user:1 name
(integer) 1
1.1.7 Получить все поля
hkeys key
hkeys
Команда должна быть вызванаhfields
Точнее, он возвращает указанныйхэш-ключвсеfield
,Например:
127.0.0.1:6379> hkeys user:1
1) "name"
2) "age"
3) "city"
1.1.8. Получить все значения
hvals key
Получите это, выполнив следующие действияuser:1
всеvalue
:
127.0.0.1:6379> hvals user:1
1) "tom"
2) "12"
3) "chengdu"
1.1.9 Получить все значения полей
hgetall key
Получите это, выполнив следующие действияuser:1
всеfield-value
:
127.0.0.1:6379> hgetall user:1
1) "name"
2) "tom"
3) "age"
4) "12"
5) "city"
6) "chengdu"
в настоящее время использует
hgetall
когда, еслихэш-элементКоличество больше, будетблокироватьRedis
возможный. Если разработчику нужно только получитьчастьfield
,можно использоватьhmget
, если вы должны получитьвсеfield-value
,можно использоватьhscan
команда, которая будетпрогрессивный обходТип хеша.
1.2. Необычные команды
1.2.1. Автоматическое увеличение значения ключа
hincrby key field hincrbyfloat key field
hincrby
иhincrbyfloat
, какincrby
иincrbyfloat
Команды те же, но ихсферадаfield
.
1.2.2 Вычислить длину строки значения
hstrlen key field
Напримерhget user:1 name
изvalue
даtom
,Такhstrlen
Возвращаемый результат3
.
127.0.0.1:6379> hstrlen user:1 name
(integer) 3
НижеКоманда типа хешаизвременная сложность, разработчики могут обратиться к этой таблице, чтобы выбрать соответствующую команду.
2. Внутреннее кодирование
тип хешаизВнутреннее кодированиеЕсть два вида:
2.1. почтовый список
когдатип хешаколичество элементовменьше, чем hash-max-ziplist-entries
конфигурация (по умолчанию512
), в то же времявсе значенияВсеменьше, чем hash-max-ziplist-value
конфигурация (по умолчанию64
байт),Redis
Будет использоватьсяziplist
в видехэшизВнутренняя реализация,ziplist
использовать большекомпактная структурареализовать несколько элементовнепрерывное хранение, так что всохранить памятьсоотношение сторонhashtable
лучше.
2.2. хэш-таблица
когдатип хешане в состоянии удовлетворитьziplist
условия,Redis
Будет использоватьсяhashtable
в видехэшизВнутренняя реализация, потому что в это времяziplist
изЭффективность чтения и записиуменьшится, при этомhashtable
прочти и напишивременная сложностьзаO(1)
.
Следующий пример демонстрируеттип хешаизВнутреннее кодирование, и соответствующие изменения.
когдаfield
номерчуть меньше, и не большойvalue
час,Внутреннее кодированиезаziplist
:
127.0.0.1:6379> hmset hashkey f1 v1 f2 v2
OK
127.0.0.1:6379> object encoding hashkey
"ziplist"
- когда есть
value
больше, чем64
байты,Внутреннее кодированиебудетziplist
статьhashtable
:
127.0.0.1:6379> hset hashkey f3 "one string is bigger than 64 byte...忽略..."
OK
127.0.0.1:6379> object encoding hashkey
"hashtable"
- когда
field
номерПревосходить512
,Внутреннее кодированиетакжеziplist
статьhashtable
:
127.0.0.1:6379> hmset hashkey f1 v1 f2 v2 f3 v3 ... f513 v513
OK
127.0.0.1:6379> object encoding hashkey
"hashtable"
3. Применимые сценарии
Как показано на рисунке, дляреляционная таблица данныхдваИнформация о пользователе, атрибут пользователя используется как столбец таблицы, а информация о каждом пользователе используется как строка.
использоватьRedis
хэш-структураместо храненияИнформация о пользователеСхематическая диаграмма выглядит следующим образом:
по сравнению с использованиемСериализация строктайникИнформация о пользователе,тип хешастать большеинтуитивный, И воперация обновлениявстречаболее удобно. У каждого пользователяid
определяется какключевой суффикс, много парfield-value
для каждого пользователяАтрибуты, аналогичный следующему псевдокоду:
public UserInfo getUserInfo(long id) {
// 用户id作为key后缀
String userRedisKey = "user:info:" + id;
// 使用hgetall获取所有用户信息映射关系
Object userInfoMap = redis.hgetAll(userRedisKey);
UserInfo userInfo;
if (userInfoMap != null) {
// 将映射关系转换为UserInfo
userInfo = transferMapToUserInfo(userInfoMap);
} else {
// 从MySQL中获取用户信息
userInfo = mysql.get(id);
// 将userInfo变为映射关系使用hmset保存到Redis中
redis.hmset(userRedisKey, transferUserInfoToMap(userInfo));
// 添加过期时间
redis.expire(userRedisKey, 3600);
}
return userInfo;
}
3.1 Структура хеша и реляционная таблица
должен быть в курсетип хешаиРеляционная база данныхЕсть два отличия:
-
тип хешадаредкий,иРеляционная база данныхдаполностью структурированный, Напримертип хешакаждыйключможет иметь разные
field
,иРеляционная база данныхПосле добавления новогоСписок,все линиивсе для этогоНастройки(даже еслиNULL
), как показано на рисунке:
-
Реляционная база данныхможет делать сложныереляционный запрос, при использовании
Redis
Для имитации сложных реляционных запросовСложность разработки,Высокая стоимость обслуживания.
3.2 Несколько методов кэширования
До сих пор мы могли использоватьтри методатайникИнформация о пользователе, три схемы приведены нижеВыполнениеиАнализ преимуществ и недостатков.
3.2.1 Собственные строковые типы
Назначьте каждый атрибут информации о пользователеключ.
set user:1:name tom
set user:1:age 23
set user:1:city beijing
-
преимущество: Простой и интуитивно понятный, каждое свойство поддерживаетоперация обновления.
-
недостаток: занятослишком много ключей,объем памятибольше, а информация о пользователеПлохая сплоченность, поэтому это решение обычно не используется в производственной среде.
3.2.2 Сериализация строковых типов
информация о пользователеСериализацияпосле использованияключспасти.
set user:1 serialize(userInfo)
-
преимущество:Упрощенное программирование, если разумно использоватьСериализацияМожетУлучшить использование памяти.
-
недостаток:СериализацияидесериализоватьЕсть определенные накладные расходы, при этом каждый разобновить свойстванужноВсе данныевыигратьдесериализовать,ОбновленоСноваСериализацияприбыть
Redis
середина.
3.2.3 Типы хешей
Каждый пользовательский атрибут используетпара field-value
, но только сключспасти.
hmset user:1 name tom age 23 city beijing
-
преимущество:Простой и интуитивно понятный, если использовать разумноуменьшить объем памятииспользование.
-
недостаток: контролировать и уменьшатьхэшсуществует
ziplist
иhashtable
дваВнутреннее кодированиеизконвертировать,hashtable
будет потреблятьбольше памяти.
резюме
В этой статье описываетсяRedis
серединахэш-структураНекоторые изосновные команды,Внутреннее кодированиеиПрименимая сцена. Наконец-то сравнилреляционная таблицаихэш-структураразница и несколькоспособ храненияпреимущества и недостатки.
Ссылаться на
«Разработка и эксплуатация Redis»
Добро пожаловать в технический публичный аккаунт: Zero One Technology Stack
Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.