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

Как да анулирате части от йерархия (дърво) от данни в кеша на Redis

Има поне 3 различни начина за това, всеки има своите плюсове и минуси.

Първият подход е да се използва неатомно ad-hoc сканиране на дървото, за да се идентифицира и обезсили (изтрие) 2-ро ниво на дървото (1-ви набор от персонализации). За да направите това, използвайте йерархична схема за именуване за полетата на вашия хеш и повторете през тях, като използвате HSCAN . Например, ако приемем, че ключовото име на вашия хеш е идентификационният номер на продукта (напр. ProductA), ще използвате нещо като '0001:0001' като име на полето за първата версия на първата персонализация, '0001:0002' за втората версия и така нататък. По същия начин, '0002:0001' ще бъде втората версия за персонализиране, 1-ва версия и т.н... След това намерете всички версии на персонализиране 42, използвайте HSCAN ProductA 0 MATCH 0042:* , HDEL полетата в отговора и повторете, докато курсорът не стане нула.

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

HSET ProductA 0001:0001 "<customization 1 version 1 JSON payload"
SADD ProductA:0001 0001

Имайте предвид, че тези две операции трябва да бъдат в една транзакция (т.е. използвайте MULTI\EXEC блок или EVAL скрипт на Lua). Когато сте настроили тази настройка, анулирането на персонализиране е просто въпрос на извикване на SMEMBERS на съответния комплект и изтриване на версиите в него от хеша (и самия комплект също). Важно е да се отбележи обаче, че четенето на всички членове от голям набор може да отнеме време - 1K членове не е толкова лошо, но за по-големите набори има SSCAN .

И накрая, можете да помислите за използването на сортиран набор вместо хеш. Макар че може би е по-малко интуитивен в този случай на използване, сортираният комплект ще ви позволи да извършите всички операции, от които се нуждаете. Цената за използването му обаче е повишената сложност на O(logN) за добавяне/премахване/четене в сравнение с O(1) на хеша, но предвид числата разликата не е значителна.

За да разгърнете силата на сортирания набор, ще използвате лексикографско подреждане, така че всички членове на сортирания набор да имат еднакъв резултат (например използвайте 0). Всеки продукт ще бъде представен от сортиран набор, точно както при хеша. Членовете на набора са еквиваленти на полето на хеша, а именно версиите на персонализациите. "Трикът" е да се конструират членовете по начин, който ви позволява да извършвате търсене на диапазон (или анулиране на ниво 2, ако желаете). Ето пример за това как трябва да изглежда (обърнете внимание, че тук ключовият ProductA не е хеш, а сортиран набор):

ZADD ProductA 0 0001:0001:<JSON>

За да прочетете версия за персонализиране, използвайте ZRANGEBYLEX ProductA [0001:0001: [0001:0001:\xff и разделете JSON от отговора и за да премахнете цялата персонализация, използвайте ZREMRANGEBYLEX .




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Нещо като кеш на маркери и запитване към него, за да ги предложи да използват Redis

  2. Как да изброя всички Redis бази данни?

  3. Стартиране на ElastiCache Integration

  4. Блокиране на достъпа до ключа Redis (ServiceStack)

  5. Можете ли да се свържете с Amazon ElastiСache Redis извън Amazon?