Create Redis Key — это пакет NPM, утилита для создания ключа Redis для NodeJS (наиболее эффективна при использовании с Typescript).


Разделы


Мотивация

Вы можете задаться вопросом: «Зачем мне нужен пакет для создания ключа Redis? Разве это не просто строка?»

Что ж, это так.

Но даже если отдельный ключ представляет собой строку, большую часть времени мы используем многие из них. Кэшируй это, кешируй это, Кэшируй их всех!

У вас когда-нибудь было серверное приложение, использующее Redis в качестве основной базы данных?

У меня есть. Микросервис, в котором много ресурсов хранится в Redis. Он хранит данные, которые изменяются в течение ожидаемого промежутка времени, от менее секунды до нескольких часов.

Наступает критическая часть (части): будь то кэширование или хранение данных, ключи в основном поделиться шаблоном И что отличает отдельные клавиши, так это то, что эти клавиши включать идентификаторы ресурсов как часть их, поскольку они пытаются найти разные ресурсы. Кроме того, если ресурс принадлежит другому ресурсу, он ключ начинается с ключа ресурса, которому он принадлежит.

Возьмем в качестве примера Инстаграм.

Просто мы можем хранить пользователя с id 1 в ключе users:1. Тогда имеет смысл хранить пользователя с id 2 по ключу users:2 и это продолжается.

Как мы видим, они разделяют шаблон users:%UserID% и шаблон включает идентификатор ресурса.

Существуют различные виды ресурсов, которые принадлежат пользователю, такие как подписки, подписчики, сообщения и т. д. Мы можем хранить их в ключах. users:%UserID%:follows, users:%UserID%:followers, users:%UserID%:posts которые начинаются с ключа ресурса, которому они принадлежат (users:%UserID%).

Итак, было бы неплохо, если бы у нас был способ легко управлять всеми нашими ключами?

Представляем создание ключа Redis.


Создать ключ Redis

Утилита для создания ключей Redis.

Создавать Redis Key Templatesкоторые включают параметры, используя вложенный объект конфигурации и используют ваш Redis Key Template строки для создания ключей Redis.

Видеть создать-redis-ключ на НПМ.

Видеть создать-redis-ключ на Гитхабе.


Применение

Прежде всего, импортируйте необходимые функции следующим образом:

import {
  createRedisKeyParam,
  createRedisKeysMap,
  createRedisKey,
} from 'create-redis-key';
Войти в полноэкранный режим

Выйти из полноэкранного режима

Создать Redis Keys Config объект.

Вы должны написать as const в конце объекта для правильной работы типов Typescript.

const redisKeysConfig = {
  SCOPE_FIRST_PART: [],

  // app-statuses
  appStatus: ['app-statuses'],

  users: {
    SCOPE_FIRST_PART: ['users'],

    // users:online
    online: ['online'],

    byID: {
      SCOPE_FIRST_PART: ['by-id', createRedisKeyParam('UserID')],

      feed: {
        SCOPE_FIRST_PART: ['feed'],

        // users:by-id:%UserID%:feed:following
        following: ['following'],
        // users:by-id:%UserID%:feed:favorites
        favorites: ['favorites'],
      },

      // users:by-id:%UserID%:follows
      follows: ['follows'],
      // users:by-id:%UserID%:followers
      followers: ['followers'],
      posts: {
        SCOPE_FIRST_PART: ['posts'],

        byID: {
          SCOPE_FIRST_PART: ['by-id', createRedisKeyParam('PostID')],

          // users:by-id:%UserID%:posts:by-id:%PostID%:comments
          comments: ['comments'],
          // users:by-id:%UserID%:posts:by-id:%PostID%:likes
          likes: ['likes'],
        },
      },
    },
  },
} as const;
Войти в полноэкранный режим

Выйти из полноэкранного режима

Затем создайте Redis Keys Templates Map используя конфиг:

Если вы укажете неверную конфигурацию, тип возврата будет never.

const RedisKeysMap = createRedisKeysMap(redisKeysConfig);
Войти в полноэкранный режим

Выйти из полноэкранного режима

Результирующий объект будет таким, который представляет собой Redis Keys Templates Map:

{
    "appStatus": "app-statuses",
    "users": {
        "online": "users:online",
        "byID": {
            "feed": {
                "following": "users:by-id:%UserID%:feed:following",
                "favorites": "users:by-id:%UserID%:feed:favorites"
            },
            "follows": "users:by-id:%UserID%:follows",
            "followers": "users:by-id:%UserID%:followers",
            "posts": {
                "byID": {
                    "comments": "users:by-id:%UserID%:posts:by-id:%PostID%:comments",
                    "likes": "users:by-id:%UserID%:posts:by-id:%PostID%:likes"
                }
            }
        }
    }
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

Затем вы можете использовать эту карту для создания ключа Redis, когда это необходимо:

Вы получите рекомендации по параметрам в вашей среде IDE на основе Redis Key Template вы предоставили createRedisKey() функция.

Все параметры на Redis Key Template необходимы. Вы получите ошибки типа, если не предоставите их все.

const likesOfPostRK = createRedisKey(RedisKeysMap.users.byID.posts.byID.likes, {
  UserID: '1234',
  PostID: '9876',
});
Войти в полноэкранный режим

Выйти из полноэкранного режима

Вы можете увидеть сгенерированный ключ, запустив его в консоль:

console.log(likesOfPostRK);
Войти в полноэкранный режим

Выйти из полноэкранного режима

Журнал будет:

users:by-id:1234:posts:by-id:9876:likes
Войти в полноэкранный режим

Выйти из полноэкранного режима

Вот и все. Теперь вы можете использовать сгенерированный ключ для чтения ресурса из Redis.

На самом деле есть 3 способа использования этой библиотеки. Если вам понравилась идея, вы можете проверить больше вариантов и документации на создать-redis-ключ на Гитхабе.

Я хочу видеть ваши комментарии. Это полезный способ сделать это? Есть ли какая-либо другая широко распространенная стратегия, которую вы видели в проектах, над которыми работали ранее? Считаете ли вы его простым в использовании? Хотели бы вы внедрить его в свои существующие проекты или использовать в своих будущих проектах?

Удачного кодирования!