Create Redis Key — простой способ настроить все ключи Redis в одном месте

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

Разделы

  • Мотивация
  • Пакет
  • Как использовать

Мотивация

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

Так и есть.

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

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

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

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

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

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

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

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

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

Представляем вашему вниманию Create Redis Key.

Create Redis Key

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

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

См. create-redis-key на NPM.

См. create-redis-key на GitHub.

Использование

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

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);
Вход в полноэкранный режим Выйти из полноэкранного режима

В результате будет получен объект this, который является 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 способа использования этой библиотеки. Если вам понравилась идея, вы можете ознакомиться с дополнительными возможностями и документацией по create-redis-key на GitHub.

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

Счастливого кодинга!

Оцените статью
devanswers.ru
Добавить комментарий