我正在运行一个使用Redis数据库的游戏服务器。我对NoSQL Db不太熟悉。
我正在尝试从该数据库中提取一些信息,但是我找不到使用redis-cli进行操作的命令。为此,我在Windows下使用Fastoredis制作了屏幕截图,但服务器在Debian下运行,并且我使用redis-cli作为客户端(对不起,我没有足够的声誉来发布图像,因此此处是指向我的图像的链接)。 / p>
首先,我想从“表”(不知道我是否可以称其为表)“ entityinfo”中获取所有具有EntityType = Ship的项。从这些项目中,我想获取信息“ Shiptype”,“ EntityName”和“ TribeID”(未显示在屏幕截图中)。我想将这些信息保存在一个名为ship.txt的文件中。
然后从另一个名为“ tribedata”的表中,我想获取所有具有信息TribeID和TribeName的项。我要将这些信息保存在名为tribe.txt的文件中。
这是用于在Debian Stretch下运行的Game Server数据库,其中安装了最新的redis-server(3.2.6)软件包。
我已经尝试使用命令redis-cli --csv lrange
,但是我真的不知道它是如何工作的,这就是为什么我没有得到结果的原因。
答案 0 :(得分:1)
您可以使用Redis按值进行搜索,但这并不容易,see this answer
一个更简单但效率不高的解决方案是:
使用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交互式地图查看器。他们正在使用另一种方法(带有扫描)来遍历每个实体。