Углубленный анализ серии Redis (8) — коллекции структур данных Redis.

Redis задняя часть Архитектура NoSQL

предисловие

собирать(set) тип также используется для хранения несколькихстроковый элемент, но иТип спискаОтличие в том, что коллекцияПовторяющиеся элементы не допускаются, а элементы множествабеспорядочный, не могу пройтииндекс индексаПолучите элемент.

Как показано на рисунке, коллекцияuser:1:followсодержит"it","music","his","sports"четыре элемента, одинсобиратьМожет хранить до2 ^ 32 - 1элементы.RedisПомимо поддержкив коллекцииизCRUD, а также поддерживаетнесколько коллекцийВыбиратьперекресток,союз,разница. Разумное использование типов коллекций может решить многие практические проблемы реальной разработки.

Другие статьи

текст

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

零壹技术栈

Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.