gpt4 book ai didi

node.js - 如何使用Redis缓存进行分页?

转载 作者:行者123 更新时间:2023-12-05 07:11:47 28 4
gpt4 key购买 nike

我想使用 Redis 缓存进行分页,我正在使用 Node.js 作为我的后端,我正在使用 npmredis-scanner 包,用于通过键进行扫描。在这里,我无法转到特定键并从 Redis 缓存中获取接下来的 15 个键。我该怎么做?

最佳答案

您可以使用 ioredis像这样:

const Redis = require("ioredis");

async getByCursor({ cursor }) {
const db = new Redis();
const stream = db.scanStream({ count: 5 }); // count = number of items to return per page
try {
const scan = () =>
new Promise((resolve, reject) => {
let items = [];
stream.on("data", (page) => {
items = [...items, page]; // page = ['key1', 'key2', etc.]
});
stream.on("end", () => {
resolve(items); // items = [['key1', 'key2'], ['key3', 'key4']]
});
});
const keys = await scan();
return Promise.all(
keys[cursor].map(async (key) => JSON.parse(await db.get(key)))
);
} catch (e) {
console.error(e);
return Promise.resolve([]);
}
}

或稍快:

async getByCursor({ cursor }) {
const stream = db.scanStream({ count: 5 });
try {
return new Promise((resolve, reject) => {
let pageCount = 0;
stream.on("data", (page) => {
pageCount = pageCount + 1;
if (pageCount == Number(cursor)) {
resolve(
Promise.all(
page.map(async (id) => unpack(await db.get(id)))
).catch((e) => {
console.error(e);
reject([]);
})
);
}
});
});
} catch (e) {
console.error(e);
}

使用游标

此处提供游标值 1,例如作为参数或查询调用你的'items-by-cursor' Node 路由时给你前5个项目,下一页的2个值等。请注意,计数只是一个估计,即你不能依赖它总是返回严格 5 个键(有关详细信息,请参见下面的文档链接)。你可以查看https://react-query.tanstack.com/examples/load-more-infinite-scroll用于获取要发送到路由的相关游标的前端解决方案。

性能说明

与通过调用 db.get('*') 和/或过滤路径中的结果通过所有键获取所有项目相比,通过流获取键值对是非阻塞的。因此,建议将此实现用于生产。

更多 ioredis 文档

https://github.com/luin/ioredis#streamify-scanning

关于node.js - 如何使用Redis缓存进行分页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60637053/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com