我试图将 JSON 设置为 Redis 中的值,但收到以下代码的错误:
const createClient = require('redis');
async function redisJSONDemo () {
try {
const TEST_KEY = 'test_node';
const client = createClient.createClient();
await client.connect();
// RedisJSON uses JSON Path syntax. '.' is the root.
await client.json.set(TEST_KEY, '.', { node: 'blah' });
const value = await client.json.get(TEST_KEY, {
// JSON Path: .node = the element called 'node' at root level.
path: '.node'
});
console.log(`value of node: ${value}`);
await client.quit();
} catch (e) {
console.error(e);
}
}
redisJSONDemo();
Run Code Online (Sandbox Code Playgroud)
错误:
ReplyError: …
我将使用 Redis 来存储具有嵌套结构的 json 文档。我的要求只是设置和获取文件。我不需要对文档执行任何特定于 json 的命令。使用 rejson 模块是否有任何优势。GET 和 SET 命令将比 JSON.GET 和 JSON.SET 命令执行得更好。以下来自redis文档
JSON.SET 从 1.0.0 开始可用。时间复杂度:O(M+N),其中 M 是原始值的大小(如果存在),N 是新值的大小。
JSON.GET 从 1.0.0 开始可用。时间复杂度:O(N),其中 N 是值的大小。
GET 密钥 从 1.0.0 开始可用。时间复杂度:O(1)
SET 键值 [expiration EX seconds|PX 毫秒] [NX|XX] 从 1.0.0 开始可用。时间复杂度:O(1)
只是想确认将文档存储为字符串值是正确的做法。
我已按照教程操作并运行:
docker run -p 6379:6379 --name redis-rejson redislabs/rejson:latest
Run Code Online (Sandbox Code Playgroud)
但是当我尝试运行 redis-cli 然后运行 json.get 时,我得到:
ERR unknown command 'JSON.SET'
Run Code Online (Sandbox Code Playgroud)
模块列表返回零。谁能指导我如何使用 docker 运行 rejson?欣赏。
我现在可以将资源作为hash或RedisJSON存储在 Redis 中。我在这个实例中的特定数据是临时数据对象,每个对象由几个字符串和数字字段组成。用户将调用一个创建结构的进程,如:
{
'item_id': 'k0f8h3n5m6n1w9d0k0k1m1n4b6c8f8r7'
'amount': 3.00042
'timestamp': 1590440708,
'user1_status': 'pending',
'user_2_status': 'completed'
}
Run Code Online (Sandbox Code Playgroud)
这实际上是一个客户端用户处理的队列(队列由单独的 Redis流处理),其中每个对象将保持使用(作为散列或 RedisJSON 对象)平均约 1 小时。在任何给定时间,队列中都会有数以万计的这些对象。在队列中时,对象的字段(例如user1_status和user2_status)将被更新多次。
处理完每个对象后,我可以将其保留在 Redis 中,也可以将每个对象移动到冷存储数据库以进行日志保存并从 Redis 中删除。我不确定我是应该这样做还是放弃它。
哪种 Redis 数据类型(哈希或 RedisJSON)更适合我的任务?在决定这两种类型时有哪些一般考虑因素?
注意:我意识到如果我想做这样的事情:
{
'item_id': 'k0f8h3n5m6n1w9d0k0k1m1n4b6c8f8r7'
'amount': 3.00042
'timestamp': 1590440708,
'user1_status': 'pending',
'user_2_status': 'completed'
'parent': {
'item1': 1,
'item2': [1, 2, 3, 4]
'item3': {
'one': 1,
'two': 2 …Run Code Online (Sandbox Code Playgroud) 如何使用brew 在 macOSx 上安装 RedisJSON?
如何在不编译redis的情况下启用redis上的模块?我不想使用 docker 客户端
假设我有一个 JavaScript 对象,其结构如下:
{
id: "someUniqueId",
foo: "otherData",
bar: 30
}
Run Code Online (Sandbox Code Playgroud)
我想在RedisJSON中存储数百个。我目前正在使用node-redis 客户端将密钥初始化'json-objects'为空对象:
await client.json.set('json-objects', `$`, {});
Run Code Online (Sandbox Code Playgroud)
然后,我将对象添加到该键的根对象,例如:
const dataToStore = {
id: "someUniqueId",
foo: "otherData",
bar: 30
}
await client.json.set('json-objects', `$.${dataToStore.id}`, dataToStore as any);
Run Code Online (Sandbox Code Playgroud)
这会导致键下出现一个大对象,'json-objects'如下所示:
{
"someUniqueId-1": {
id: "someUniqueId-1",
foo: "otherData",
bar: 30
},
"someUniqueId-2": {
id: "someUniqueId-2",
foo: "otherData2",
bar: 31
},
"someUniqueId-3": {
id: "someUniqueId-3",
foo: "otherData3",
bar: 32
},
and so on...
}
Run Code Online (Sandbox Code Playgroud)
然后我可以使用路径查询和更新:
await client.json.set('json-objects', `$.${id}.foo`, "someUpdatedData"); …Run Code Online (Sandbox Code Playgroud)