从Redis数据库中提取一些信息

时间:2019-04-30 08:01:59

标签: redis

我正在运行一个使用Redis数据库的游戏服务器。我对NoSQL Db不太熟悉。

我正在尝试从该数据库中提取一些信息,但是我找不到使用redis-cli进行操作的命令。为此,我在Windows下使用Fastoredis制作了屏幕截图,但服务器在Debian下运行,并且我使用redis-cli作为客户端(对不起,我没有足够的声誉来发布图像,因此此处是指向我的图像的链接)。 / p>

entityinfo

首先,我想从“表”(不知道我是否可以称其为表)“ entityinfo”中获取所有具有EntityType = Ship的项。从这些项目中,我想获取信息“ Shiptype”,“ EntityName”和“ TribeID”(未显示在屏幕截图中)。我想将这些信息保存在一个名为ship.txt的文件中。

TribeID

然后从另一个名为“ tribedata”的表中,我想获取所有具有信息TribeID和TribeName的项。我要将这些信息保存在名为tribe.txt的文件中。

这是用于在Debian Stretch下运行的Game Server数据库,其中安装了最新的redis-server(3.2.6)软件包。

我已经尝试使用命令redis-cli --csv lrange,但是我真的不知道它是如何工作的,这就是为什么我没有得到结果的原因。

1 个答案:

答案 0 :(得分:1)

您可以使用Redis按值进行搜索,但这并不容易,see this answer

一个更简单但效率不高的解决方案是:

  • 获取所有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,请看this project,它是由Grapeshot完成的Atlas交互式地图查看器。他们正在使用另一种方法(带有扫描)来遍历每个实体。