предисловие
собирать(set
) тип также используется для хранения несколькихстроковый элемент, но иТип спискаОтличие в том, что коллекцияПовторяющиеся элементы не допускаются, а элементы множествабеспорядочный, не могу пройтииндекс индексаПолучите элемент.
Как показано на рисунке, коллекцияuser:1:follow
содержит"it"
,"music"
,"his"
,"sports"
четыре элемента, одинсобиратьМожет хранить до2 ^ 32 - 1
элементы.Redis
Помимо поддержкив коллекцииизCRUD, а также поддерживаетнесколько коллекцийВыбиратьперекресток,союз,разница. Разумное использование типов коллекций может решить многие практические проблемы реальной разработки.
Другие статьи
-
Углубленный анализ серии 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 Добавление элементов
sadd key element [element ...]
Возвращаемый результат: добавление прошло успешно.количество элементов,Например:
127.0.0.1:6379> exists myset
(integer) 0
127.0.0.1:6379> sadd myset a b c
(integer) 3
127.0.0.1:6379> sadd myset a b
(integer) 0
1.1.2 Удаление элементов
srem key element [element ...]
Возвращаемый результат - успешное удалениеколичество элементов,Например:
127.0.0.1:6379> srem myset a b
(integer) 2
127.0.0.1:6379> srem myset hello
(integer) 0
1.1.3 Подсчет количества элементов
scard key
scard
извременная сложностьзаO(1)
,Этоне пройдетУстановите все элементы, но напрямую используйтеRedis
извнутреннийпеременные, например:
127.0.0.1:6379> scard myset
(integer) 1
1.1.4 Определить, принадлежит ли элемент множеству
sismember key element
если данный элементelement
возврат в коллекции1
, иначе возврат0
.
127.0.0.1:6379> sismember myset c
(integer) 1
1.1.5 Случайным образом возвращает указанное количество элементов из коллекции
srandmember key [count]
[count]
данеобязательный параметр, если не написано, по умолчанию1
.
127.0.0.1:6379> srandmember myset 2
1) "a"
2) "c"
127.0.0.1:6379> srandmember myset
"d"
1.1.6 Случайное извлечение элементов из коллекции
spop key
spop
операцию можно начинать ссобиратьсерединавсплывают случайноЭлемент, например, следующий код один разspop
Задний,элемент коллекциистать"d b a"
.
127.0.0.1:6379> spop myset
"c"
127.0.0.1:6379> smembers myset
1) "d"
2) "b"
3) "a"
Уведомление:
Redis
от3.2
версия запускается,spop
также поддерживает[count]
параметр.
srandmember
иspop
обаслучайныйВыберите элементы из набора, разница между нимиspop
После выполнения командыэлементбудет из коллекцииУдалить,иsrandmember
Элементы не удаляются.
1.1.7 Получить все элементы
smembers key
Следующий код получает коллекциюmyset
извсе элементы,ивернуть результатдабеспорядочный.
127.0.0.1:6379> smembers myset
1) "d"
2) "b"
3) "a"
smembers
иlrange
,hgetall
принадлежитТяжелеекоманда, еслислишком много элементовсуществуетблокировать Redis
возможность, на этот раз вы можете использоватьsscan
команду завершить.
1.2 Команды операций между наборами
Естьдва набора, они соответственноuser:1:follow
иuser:2:follow
.
127.0.0.1:6379> sadd user:1:follow it music his sports
(integer) 4
127.0.0.1:6379> sadd user:2:follow it news ent sports
(integer) 4
1.2.1 Нахождение пересечения нескольких множеств
sinter key [key ...]
Следующий код запрашиваетuser:1:follow
иuser:2:follow
два набораперекресток, возвращаемый результатsports
,it
.
127.0.0.1:6379> sinter user:1:follow user:2:follow
1) "sports"
2) "it"
1.2.2 Нахождение объединения множественных множеств
suinon key [key ...]
Следующий код запрашиваетuser:1:follow
иuser:2:follow
два наборасоюз, возвращаемый результатsports
,it
,his
,news
,music
,ent
.
127.0.0.1:6379> sunion user:1:follow user:2:follow
1) "sports"
2) "it"
3) "his"
4) "news"
5) "music"
6) "ent"
1.2.3 Нахождение разности нескольких наборов
sdiff key [key ...]
Следующий код запрашиваетuser:1:follow
иuser:2:follow
два набораразница, возвращаемый результатmusic
иhis
.
127.0.0.1:6379> sdiff user:1:follow user:2:follow
1) "music"
2) "his"
первые триперекресток,союзиразницаРезультат операции показан на рисунке:
1.2.4 Сохранение результатов пересечения, объединения и разности
Комната сбораоперация вбольше элементовбудеткропотливый,такRedis
обеспечивает следующеетри команды(первоначальный заказ + store
)будетПересечение наборов,союз,разницаРезультаты сохраняются вdestination key
середина.
sinterstore destination key [key ...] suionstore destination key [key ...] sdiffstore destination key [key ...]
Следующие действия будутuser:1:follow
иuser:2:follow
два набораизРезультат пересеченияСохранить какuser:1_2:inter
середина,user:1_2:inter
сам тожеТип коллекции.
127.0.0.1:6379> sinterstore user:1_2:inter user:1:follow user:2:follow
(integer) 2
127.0.0.1:6379> type user:1_2:inter
set
127.0.0.1:6379> smembers user:1_2:inter
1) "it"
2) "sports"
СвязанныйсобиратьизОбщие командыВ основном это все, таблица ниже даетСборник общих командизвременная сложность, разработчики могут выбирать в соответствии со своими потребностями.
2. Внутреннее кодирование
Тип коллекцииизВнутреннее кодированиеЕсть два вида:
2.1 intset (множество целых чисел)
Когда элементы коллекциицелое числоиколичество элементовменьше, чемset-max-intset-entries
конфигурация (по умолчанию512
), когдаRedis
выберетintset
прийти каксобиратьизВнутренняя реализация,тем самымуменьшить памятьиспользование.
2.2. хеш-таблица
Когда тип коллекциине в состоянии удовлетворить intset
условия,Redis
Будет использоватьсяhashtable
как коллекцияВнутренняя реализация.
2.3. Конкретные примеры
2.3.1 Внутренне кодируется как набор целых чисел
Когда количество элементовменьшеи обацелое числочас,Внутреннее кодированиезаintset
.
127.0.0.1:6379> sadd setkey 1 2 3 4
(integer) 4
127.0.0.1:6379> object encoding setkey
"intset"
2.3.2 Внутреннее кодирование в виде хэша
- когдаколичество элементовПревосходить
512
Кусок,Внутреннее кодированиестатьhashtable
.
127.0.0.1:6379> sadd setkey 1 2 3 4 5 6 ... 512 513
(integer) 513
127.0.0.1:6379> scard setkey
(integer) 513
127.0.0.1:6379> object encoding listkey
"hashtable"
- когда элементне целое числочас,Внутреннее кодированиетакже станет
hashtable
.
127.0.0.1:6379> sadd setkey a
(integer) 1
127.0.0.1:6379> object encoding setkey
"hashtable"
о типах коллекцийоптимизация памятиНавыки, в следующих статьях будут специальные пояснения.
3. Сценарии применения
3.1 Пользовательские теги
Тип коллекцииТипичный сценарий использования:Этикетка(tag
). Всего два примера:
3.1.3. Рекомендации по развлекательным новостям
Одного пользователя могут больше интересовать развлечения и спорт, другого — история и новости, и эти точки интереса — теги. С помощью этих данных вы можете найти людей, которым нравится один и тот же тег, а также общие теги пользователей.Эти данные важны для взаимодействия с пользователем и повышения его привязанности.
3.1.2. Классификация толпы электронной коммерции
Веб-сайт электронной коммерции будет рекомендовать разные типы пользователей с разными ярлыками, например, людей, которые больше интересуются цифровыми продуктами, рекомендуя им новейшие цифровые продукты на различных страницах или по электронной почте, что обычно приносит больше пользы веб-сайту. преимущества.
использовать нижеТип коллекциивыполнитьФункция метки.
- Добавляйте теги пользователям
sadd user:1:tags tag1 tag2 tag5
sadd user:2:tags tag2 tag3 tag5
...
sadd user:k:tags tag1 tag2 tag4
...
- добавить пользователя в ярлык
sadd tag1:users user:1 user:3
sadd tag2:users user:1 user:2 user:3
...
sadd tagk:users user:1 user:2
...
ПользовательиЭтикеткаизПоддержание отношенийдолжен быть ввнутри сделкиобеспечивать, предотвращатьНе удалось выполнить некоторые командыВызванныйнесогласованность данных, о том, какдве командыставитьсделка, который будет представлен позже
Lua
использование.
- Удалить теги под пользователем
srem user:1:tags tag1 tag5
...
- удалить пользователя под ярлыком
srem tag1:users user:1
srem tag5:users user:1
...
- Вычислить теги, представляющие общий интерес для пользователей
можно использоватьsinter
команда для расчетапользователи заинтересованы визЭтикетка.
sinter user:1:tags user:2:tags
Вышеприведенное просто дает использованиеRedis
Тип коллекциивыполнитьЭтикеткаОсновная идея, по сути,система маркировкиПосетите этосложныйгораздо больше, ноТип коллекцииизСценарии примененияОбычно следующее:
комбинация команд | Сценарии применения |
---|---|
sadd | Маркировка |
spop/srandmember | Случайный предмет (генерация случайных чисел, например, лотерея) |
sadd + sinter | Социальный график |
резюме
В этой статье описываетсяRedis
серединасобиратьНекоторые изосновные команды,включаютОперационные команды внутри коллекциииКоманды операций между наборами, а затем представилсобиратьизВнутреннее кодированиеконвертировать иЯрлык поведения пользователяглавныйСценарии применения.
Ссылаться на
«Разработка и эксплуатация Redis»
Добро пожаловать в технический публичный аккаунт: Zero One Technology Stack
Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.