Извлечь некоторую информацию из базы данных Redis - PullRequest
2 голосов
/ 30 апреля 2019

Я использую игровой сервер, который использует базу данных Redis. Я не знаком с NoSQL Db.

Я пытаюсь извлечь некоторую информацию из этой базы данных, но не могу найти команды, чтобы сделать это с помощью redis-cli. Для этой цели я сделал скриншоты, используя Fastoredis под Windows, но сервер работает под Debian, и я использую redis-cli в качестве клиента (извините, у меня недостаточно репутации, чтобы публиковать изображения, поэтому вот ссылки на мои изображения).

entityinfo

Сначала я хочу получить из "таблицы" (не знаю, могу ли я назвать это таблицей) "entityinfo" всех элементов, имеющих EntityType = Ship. Из этих пунктов мне нравится получать информацию «Shiptype», «EntityName» и «TribeID» (не отображается на скриншоте). Я хочу сохранить эту информацию в файле с именем ship.txt.

TribeID

Затем из второй таблицы под названием «tribedata» я хочу получить все элементы с информацией TribeID и TribeName. Я хочу сохранить эту информацию в файле с именем tribe.txt.

Это для БД игрового сервера, работающей под Debian Stretch с установленным последним пакетом redis-server (3.2.6).

Я уже пытался использовать команду redis-cli --csv lrange, но я действительно не знаю, как она работает, и поэтому я не получаю результатов.

1 Ответ

1 голос
/ 30 апреля 2019

Вы можете искать по значениям с Redis, но это будет непросто, см. Этот ответ

Более простое, но не эффективное решение:

  • Получить все ключи entityinfo
  • Цикл каждой клавиши, получить значение
  • Сохраните его в массив, если это корабль

Пример использования Nodejs:

package.json:

{
  "name": "stackoverflow",
  "version": "1.0.0",
  "license": "ISC",
  "dependencies": {
    "redis": "2.8.0"
  }
}
const redis = require("redis");
const { promisify } = require("util");

const options = {
  url: "redis://localhost:6379"
};
const client = redis.createClient(options);
const keysAsync = promisify(client.keys).bind(client);
const hgetAllAsync = promisify(client.hgetall).bind(client);

const isBoat = entity => entity.EntityType && entity.EntityType === "Ship";

const main = async () => {
  const keys = await keysAsync("entityinfo:*");

  const ships = [];
  for (const [index, key] of keys.entries()) {
    const entity = await hgetAllAsync(key);

    if (isBoat(entity)) {
      ships.push({ type: entity.ShipType, name: entity.EntityName });
    }
  }

  console.log(`  >`, ships);
  process.exit(0);
};

try {
  main();
} catch (error) {
  console.error(error);
  process.exit(1);
}

Я предполагаю, что ваша игра - Atlas, посмотрите на , этот проект - это интерактивная программа просмотра карт для Atlas, созданная Grapeshot. Они используют другой метод (со сканированием), чтобы пройти через каждую сущность.

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