如何使用node-redis分页获取Redis中的哈希对象列表?
如何用node_redis实现分页获取Redis中存储的帖子哈希对象列表?
问题描述
我用node_redis在Redis里存了一些帖子数据,结构大概是这样的:
127.0.0.1:6379> keys * 1) "posts:list" 2) "posts:page.view" 3) "slug.to.id" 4) "posts:count" 5) "post:1002" 6) "post:1001" 7) "post:3" 8) "post:2" 9) "post:1000" 127.0.0.1:6379> type post:2 hash
其中posts:list是一个列表,存的是帖子的ID,每个post:{id}是一个哈希对象存储帖子详情。我想实现分页获取这些帖子的功能,已经写了个开头:
function getPostsByPage(page = 1, pageSize = 10) { const start = (page - 1) * pageSize; const end = page * pageSize - 1; return client.lrangeAsync('posts:list', start...
请问怎么把这个函数完整实现,拿到对应页的哈希对象列表?
回答
嘿,这个需求其实很好实现,结合你已经写的开头,咱们一步步来补全:
首先看你的代码里用了lrangeAsync,应该是用了promisified版本的node_redis(比如用bluebird或者Node.js自带的util.promisify处理过),那咱们直接用async/await来写,代码会更清晰。
完整的实现代码如下:
async function getPostsByPage(page = 1, pageSize = 10) { // 先做个参数校验,避免非法参数导致的问题 if (page < 1) page = 1; if (pageSize < 1) pageSize = 10; const start = (page - 1) * pageSize; const end = page * pageSize - 1; // 第一步:从posts:list里拿到当前页对应的帖子ID列表 const postIds = await client.lrangeAsync('posts:list', start, end); // 如果当前页没有ID,直接返回空数组 if (!postIds.length) { return []; } // 第二步:针对每个ID,获取对应的哈希对象 // 这里用Promise.all批量处理异步请求,效率更高 const postPromises = postIds.map(postId => client.hgetallAsync(`post:${postId}`)); const posts = await Promise.all(postPromises); // 可选:把帖子ID也加到返回的对象里,方便后续业务使用 return posts.map((post, index) => ({ id: postIds[index], ...post })); }
额外说明:
- 如果你的node_redis还没被promisify,可以用Node.js自带的
util.promisify来处理:
const { promisify } = require('util'); const redis = require('redis'); const client = redis.createClient(); // 把需要用的方法promisify const lrangeAsync = promisify(client.lrange).bind(client); const hgetallAsync = promisify(client.hgetall).bind(client);
之后在函数里就可以用lrangeAsync和hgetallAsync了。
关于分页顺序:
posts:list的顺序决定了帖子返回的顺序,如果这个列表是按帖子发布时间倒序存的(最新的ID在最前面),那返回的分页列表就是最新的帖子在前,符合常规的帖子列表需求。性能优化:如果你的
pageSize很大,批量获取哈希的时候用Promise.all并行处理请求已经足够高效,因为每个hgetall都是轻量操作,Redis处理起来很快。
内容的提问来源于stack exchange,提问作者Lin Du
相关产品推荐
相关产品推荐

