Dynamodb 根据时间和喜好获取项目
Dynamodb get items based on time and likes
目前,我正在制作一个 9gag.com 副本,用户可以在其中看到 posts 从上次 中获得超过 20 票 ]2个月,我怎样才能高效地做到这一点?
这是我目前为 post table
设计的
userID | createTime | totalUpvotes | imageUrl | title
其中 userID 是分区键,createTime 是排序键,我还需要分页,所以最后这是我获取项目的参数:
const params = {
TableName: TABLE_NAME,
FilterExpression:
'#createTime >= :_createTime AND #totalUpvotes >= :_votes',
ExpressionAttributeNames: {
'#createTime': 'createTime',
'#totalUpvotes': 'totalUpvotes'
},
ExpressionAttributeValues: {
':_createTime': Date.now() - FEED_TIME_THRESHOLD,
':_votes': votes
},
Limit: MAX_POST_FETCH
};
if (lastEvaluatedKey) params.ExclusiveStartKey = lastEvaluatedKey;
return db.scan(params).promise();
我知道 scan 功能不推荐,但我正在考虑使用 Redis 缓存 posts,并重新 运行 扫描 每 20 分钟左右操作一次,因为所有用户都应该在我的网站上看到相同的内容。
创建一个属性 popular
,其值仅适用于热门项目(即 20+ 赞成票)。您可以使用一个简单的常量作为值。然后创建一个(稀疏)GSI,其中 popular
作为 PK,createTime
作为 SK。然后,您可以在 GSI 中查询 createTime
大于两个月前的热门商品。
目前,我正在制作一个 9gag.com 副本,用户可以在其中看到 posts 从上次 中获得超过 20 票 ]2个月,我怎样才能高效地做到这一点?
这是我目前为 post table
设计的userID | createTime | totalUpvotes | imageUrl | title
其中 userID 是分区键,createTime 是排序键,我还需要分页,所以最后这是我获取项目的参数:
const params = {
TableName: TABLE_NAME,
FilterExpression:
'#createTime >= :_createTime AND #totalUpvotes >= :_votes',
ExpressionAttributeNames: {
'#createTime': 'createTime',
'#totalUpvotes': 'totalUpvotes'
},
ExpressionAttributeValues: {
':_createTime': Date.now() - FEED_TIME_THRESHOLD,
':_votes': votes
},
Limit: MAX_POST_FETCH
};
if (lastEvaluatedKey) params.ExclusiveStartKey = lastEvaluatedKey;
return db.scan(params).promise();
我知道 scan 功能不推荐,但我正在考虑使用 Redis 缓存 posts,并重新 运行 扫描 每 20 分钟左右操作一次,因为所有用户都应该在我的网站上看到相同的内容。
创建一个属性 popular
,其值仅适用于热门项目(即 20+ 赞成票)。您可以使用一个简单的常量作为值。然后创建一个(稀疏)GSI,其中 popular
作为 PK,createTime
作为 SK。然后,您可以在 GSI 中查询 createTime
大于两个月前的热门商品。