如何使用Redis缓存进行分页?

3

我希望在Redis缓存中进行分页,我的后端是Node.js,我正在使用npm redis-scanner包来扫描键。但是我无法跳转到特定的键并从Redis缓存中获取下一个15个键。我该如何做?


你可以将数据存储为列表,并使用lrange - freakish
我将数据存储为键值对。 - shubham urolagin
2
那你就做不到。 - freakish
1个回答

0

您可以这样使用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);
    }

使用游标

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

性能说明

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

ioredis进一步文档

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接