С какими NoSQL базами данных вы работали? Расскажите о задачах, которые вы решали с их помощью.

Ответ

Да, я активно работал с несколькими типами NoSQL баз данных, выбирая подходящий инструмент в зависимости от задачи.

  1. MongoDB (документо-ориентированная БД):

    • Задачи: Хранение данных с гибкой схемой, таких как профили пользователей, каталоги товаров, логи. Отлично подходит, когда структура данных может меняться.
    • Go-драйверы: Работал с официальным mongo-go-driver. Также знаком с его предшественником mgo, который сейчас считается устаревшим.
    • Пример (с mongo-go-driver):

      // Установка соединения
      client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))
      if err != nil { log.Fatal(err) }
      collection := client.Database("webapp").Collection("users")
      
      // Вставка документа
      user := bson.D{{Key:"name", Value:"Alice"}, {Key:"email", Value:"alice@example.com"}}
      _, err = collection.InsertOne(ctx, user)
      
      // Поиск документа
      var result bson.M
      err = collection.FindOne(ctx, bson.M{"name": "Alice"}).Decode(&result)
  2. Redis (in-memory key-value хранилище):

    • Задачи: Высокопроизводительное кэширование данных (например, сессий, результатов тяжелых запросов к основной БД), реализация Pub/Sub для обмена сообщениями между сервисами, rate limiting.
    • Go-драйверы: Использовал go-redis.
    • Пример:

      // Создание клиента
      rdb := redis.NewClient(&redis.Options{
          Addr: "localhost:6379",
      })
      
      // Установка значения с временем жизни 1 час
      err := rdb.Set(ctx, "user:1:session", "session_token_string", time.Hour).Err()
      
      // Получение значения
      session, err := rdb.Get(ctx, "user:1:session").Result()
  3. Cassandra (колоночная БД):

    • Задачи: Использовал в проектах, где требовалась высокая доступность и масштабируемость на запись, например, для хранения временных рядов (time-series data) или аналитических событий.
    • Go-драйверы: Работал с gocql.