Redis
 sql >> база данни >  >> NoSQL >> Redis

Въведение в Redis Data Structures:Набори

Redis (сървър за отдалечен речник) е изключително популярно хранилище за ключ-стойност в паметта, което също така осигурява допълнителна издръжливост, разделяне, репликация и множество други функции. В момента това е най-популярната база данни ключ-стойност и е известна със своята простота, малък отпечатък на паметта и ниска крива на обучение. Redis се нарича също сървър за структура на данни и поддържа атомни операции върху структури от данни като хешове, списъци, набори, сортирани набори, растерни изображения и хиперлогове. В тази публикация ще разгледаме зададения тип данни, предоставен от Redis, заедно с неговата употреба и случаи на употреба в реалния живот.

Набори на Redis

Наборите на Redis са неподредени колекции от низове (низът е основната стойност на Redis, която може да съдържа почти всичко), които осигуряват постоянно добавяне, премахване и проверки за членство. Redis също така поддържа сравнително бързи операции за обединяване, пресичане и изваждане между набори. Както се очаква, той не позволява повтарящи се стойности.

Ето няколко примера за набори Redis в действие от redis-cli . Ето обобщение на ключови представяния в примера по-долу:

  • users:all представлява съвкупност от всички потребители, регистрирани на уебсайт.
  • users:actv представлява активни потребители.
  • users:inactv представлява неактивни потребители (потребители, които не са посещавали сайта известно време).
# sadd key member [member ...] : add members to a set
127.0.0.1:6379> sadd users:all 11 12 13 14 15 Rocket Pocket Socket
(integer) 8
127.0.0.1:6379> type users:all
set
# smembers key: get all members of a set
127.0.0.1:6379> smembers users:all
1) "Pocket"
2) "11"
3) "Socket"
4) "13"
5) "14"
6) "Rocket"
7) "12"
8) "15"
# sismember key member: is the given value a member of the set?
127.0.0.1:6379> sismember users:all 00
(integer) 0
127.0.0.1:6379> sismember users:all 11
(integer) 1
127.0.0.1:6379> sismember users:all Socket
(integer) 1
127.0.0.1:6379> sadd users:inactv 11 12 13
(integer) 3
# sinter key [key ...]: Intersection of multiple sets
# Similar: sinterstore stores the result of intersection of sets to a new set
127.0.0.1:6379> sinter users:all users:inactv
1) "11"
2) "12"
3) "13"
# scard key: cardinality of the set i.e. number of members present in the set
127.0.0.1:6379> scard users:all
(integer) 8
# sdiff key [key ...] : Subtract multiple sets
# Similar: sdiffstore: subtract and store result in a new destination set
127.0.0.1:6379> sdiff users:all
1) "Pocket"
2) "11"
3) "Socket"
4) "13"
5) "14"
6) "12"
7) "Rocket"
8) "15"
127.0.0.1:6379> sdiff users:all users:inactv
1) "14"
2) "Pocket"
3) "Rocket"
4) "Socket"
5) "15"
# sdiffstore destination key [key ...]
127.0.0.1:6379> sdiffstore users:actv users:all users:inactv
(integer) 5
127.0.0.1:6379> smembers users:actv
1) "14"
2) "Pocket"
3) "Rocket"
4) "Socket"
5) "15"
127.0.0.1:6379> sdiff users:all users:actv users:inactv
(empty list or set)
# smove source destination member: move a member from source set to destination.
127.0.0.1:6379> smove users:inactv users:actv 11
(integer) 1
127.0.0.1:6379> smembers users:actv
1) "Pocket"
2) "11"
3) "Socket"
4) "14"
5) "Rocket"
6) "15"

Други важни команди за набор включват:

  • SUNION – задаване на съединение
  • SPOP – премахване на елемент на случаен принцип
  • SREM – премахване на един или повече елементи

Пълният списък на свързаните с набор команди Redis може да се намери тук.

Вътрешни елементи на Redis

Redis вътрешно съхранява набори като речници. Речниците в Redis се изпълняват като хеш таблици, които използват хеш функцията MurmurHash2 и се увеличават чрез инкрементално преоразмеряване. Хеш колизиите се обработват чрез верижно свързване. Наборите имат специално кодиране за малки набори, когато всички членове на набор са в основа 10 в диапазона # от 64-битови цели числа със знак, наречени IntSets. Това по същество е сортиран масив от цели числа. Търсенията в масива се извършват чрез двоично търсене. Очевидно това изпълнение е ефективно за много малки набори. Размерът, до който се използва това кодиране, се управлява от set-max-intset-entries конфигурационен параметър. Стойността по подразбиране е 512. Тук можете да намерите добро описание на вътрешните структури от данни, използвани от Redis.

Приложения Redis

Ето малък списък с няколко от възможните приложения Redis Set:

  • Като комплект може да се използва за проследяване на уникални елементи:
    • Всички уникални IP адреси, посещаващи вашия сайт.
    • Всички уникални екземпляри на задания, които в момента са в дадено състояние и т.н.
  • Отново, като набор, може да се използва за обозначаване като „принадлежи на“ или подобна връзка:
    • Всички артикули, принадлежащи към определена категория.
    • Всички обекти с конкретен маркер и т.н.
  • Наборите могат да се използват само за комбиниране на връзки, т.е. обединение/пресичане/изваждане на набори:
    • Всички артикули, които принадлежат към категория тениски, но не и подкатегория поло врата.

Нека вземем пример от реалния живот и да проучим по-нататък свързаните с набор случаи.

Визуален профил за вашия магазин за електронни книги

Да приемем, че сте собственик на много голям онлайн магазин за книги, който изброява милиони заглавия. Вашата основна база данни е MongoDB и тя работи доста добре за повечето от случаите на използване с правилното използване на индексиране, разделяне и т.н. Ето частична схема на DB документ за книгите колекции:

...
sku: SKU,
pid: Product ID,
title: String,
auth: String,
pub: String,
isbn: ISBN,
edition: Int,
price: Float,
rating: Float,
cats: [String, String ...],
tags: [String, String ...],
...

Записвате и транзакции в колекция, наречена txns което може да изглежда така:

txnid: TxnID,
cid: CustomerID,
amnt: Float,
curr: Currency,
sku: [sku1, sku2, ...],
time: TimeStamp,
...

И колекция за изгледи, наречена views:

time: TimeStamp, # daily aggregated
cid: CustomerID,
sku: [sku1, sku2, ...],
...

Очевидно, това е силно опростен пример, който прави широки предположения. Нашето намерение е да покажем пример на Redis в (почти) реален сценарий.

Добре, така че сега вие, като мениджър на магазина, искате инструмент Visual Profiler за анализиране на взаимоотношенията и поведението на клиентите в различни категории. Например:

  • Коя е най-популярната категория?
  • Хората, които гледат или купуват научна фантастика, гледат ли и нехудожествената литература?

Искате да можете да правите това в реално време, т.е. потребителският интерфейс на профайлъра ще маркира квадратчета, бутони, които ви позволяват да променяте параметрите и да преглеждате резултатите (почти) незабавно.

Извършването на такива операции в MongoDB ще доведе до извършване на доста ангажирани заявки за присъединяване към различни категории, тагове и други данни, които може да ви интересуват. С работен набор, който не се побира в паметта, това няма да са най-бързите операции. Например:

  • Намирането на всички продадени днес книги, които са били фантастика, но не и научна фантастика, ще включва запитване на txn събиране на днешните транзакции. След това итериране на SKU за събиране на техните категории и след това извършване на операции $in/$nin.

Нека видим как ще се справи с това, като включим Redis в микса. В края на всеки ден, ежедневните планирани задачи могат да изпълняват тези колекции MongoDB, за да създават Redis набори. Видът набори, които искате да създадете, ще зависи от вида на филтрите, които искате да поддържате във вашия интерфейс. Например, кажете, че искате да поддържате заявки, свързани с категории, ще искаме да създадем набори като:

cat:type:catID
cat:sku:fiction
cat:sku:nonfiction
cat:sku:scfiction
cat:sku:history
cat:sku:milhistory
cat:sku:military
...
cat:cid:fiction
cat:cid:nonfiction
cat:cid:scfiction
cat:cid:history
cat:cid:milhistory
cat:cid:military
...

Комплектите cat:sku:* ще съдържат SKU на книги, продадени/прегледани днес в тази категория. По подобен начин cat:cid:* ще съдържа идентификационния номер на клиенти, които са закупили/продавали книги в тази категория. Примерни заявки, на които можем да отговорим с тези набори, са:

  • Клиенти (или # клиенти), които са гледали/купили художествени книги (единична категория) днес:членове cat:cid:fiction
  • Клиенти, които са гледали/купили История, но не и Военна история днес:sdiff cat:cid:history cat:cid:milhistory
  • (Брой) продадени днес книги, които бяха научна фантастика и военна фантастика, т.е. военна научна фантастика:sinter cat:sku:scfiction cat:sku:military
  • Произволен брой такива операции на обединение, пресичане и разлика, които ви интересуват.

Това само по себе си ни дава много мощни възможности за заявки. Нека добавим още комплекти! Да речем, ние създаваме допълнителни комплекти въз основа на рейтинги на книги. Например:

rat:sku:5str: Set of books with ratings > 4.5
rat:sku:4str: Set of books with ratings > 3.5 && <= 4.5
rat:sku:3str: ...
rat:sku:2str: ...
...
rat:cid:5str: Set of customer who bought books with ratings as mentioned above.
rat:cid:4str: ...
..

Оборудвани с тези комплекти, вече можете бързо да откривате неща като:

  • Книги с 4 звезди и по-висока художествена литература, закупени днес:  sunionstore rat:sku:4strabv rat:sku:5str rat:sku:5str/sinter rat:sku:4strabv cat :sku:фантастика
  • Клиент, който е купил книги с 3 и повече звезди в историята:sunionstore rat:cid:5strabv rat:cid:3str rat:cid:5str rat:cid:5str/sinter cat:cid:history rat:cid:5strabv

Сега да приемем, че искате да изпратите талон за отстъпка на всички твои клиенти, закупили книга по астрология днес с оценка 2 или по-ниска (като извинение за лошото изживяване че трябва да прочета тази книга!). Можете да експортирате този списък с CustomerID и го изпратете до вашето имейл приложение. По подобен начин можете да създадете набори за други неща, които може да искате да изложите като филтри във вашия Visual Profiler, като тагове, ценови диапазони и т.н.

Предимствата от използването на Redis Sets са очевидни тук. Съхранението в паметта ще доведе до наистина бърз достъп, така че интерфейсът да се чувства бърз. Освен това, операциите за задаване на Redis са или с постоянно време, или линейни.

Заключение

В тази публикация представихме с примери една от най-полезните Redis Data Structures:Sets. Ето някои от другите ни публикации в поредицата структури от данни на Redis:

  • Redis хешове
  • Растрови изображения на Redis
  • Набори на Redis
  • Сортирани набори на Redis


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Това валидно използване на ServiceStack Redis ли е?

  2. изчакване на redis с predis

  3. HSET, ако съществува ключ

  4. Redis:NOAUTH Изисква се удостоверяване, но няма настройка на парола

  5. Как да хванем redis.serializer.SerializationException