предисловие
собирать(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
Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.