gpt4 book ai didi

node.js - 使用redis缓存关系数据

转载 作者:IT王子 更新时间:2023-10-29 06:04:55 27 4
gpt4 key购买 nike

我正在构建一个小型社交网络(用户有帖子,帖子有评论 - 非常基本),使用集群 nodejs 服务器和 redis 作为分布式缓存。
我缓存用户帖子的方法是有一个排序集,其中包含按速率排序的所有用户帖子 ID(每次有人添加喜欢或评论时都应该更新),以及实际排序为哈希对象的对象。
所以获取用户帖子的流程应该是这样的:
1. 使用 zrangesorted set 中获取一系列 id。
2. 使用multi/exechgetall 一次获取所有对象。

我有几个问题:
1.关于性能问题,当缓存大小变大时,我的方法会扩展吗,或者我应该使用 lua 什么的?
1.如果我想继续当前的方法,我应该在redis崩溃的情况下保存排序集,如果我使用redis持久性这会影响整体性能,我考虑过使用专用的redis服务器sets(我搜索了是否可以只备份部分redis数据,但没有找到任何相关信息。

我的方法 => getTopObjects({userID}, 0, 20) :

self.zrange = function(setID, start, stop, multi)
{
return execute(this, "zrange", [setID, start, stop], multi);
};

self.getObject = function(key, multi)
{
return execute(this, "hgetall", key, multi);
};

self.getObjects = function(keys)
{
let multi = thisArg.client.multi();
let promiseArray = [];

for (var i = 0, len = keys.length; i < len; i++)
{
promiseArray.push(this.getObject(keys[i], multi));
}
return execute(this, "exec", [], multi).then(function(results)
{
//TODO: do something with the result.
return Promise.all(promiseArray);
});
};

self.getTopObjects = function(setID, start, stop)
{
//TODO: validate the range
let thisArg = this;
return this.zrevrange(setID, start, stop).then(function(keys)
{
return thisArg.getObjects(keys);
});
};

最佳答案

这是一个有趣的智力练习,但在我看来这是经典的premature optimization .

1) 现在引入redis 可能还为时过早,更不用说考虑redis 是否足够快了。您的社交网络几乎可以肯定只有大约 1,000 个用户运行针对 Mysql/Postgres/Random RDS 的原始 SQL 查询。如果它开始变慢,请获取有关运行缓慢的查询的数据,并通过查询优化和适当的索引来修复它们。这将使您的用户超过 10,000 个。

2)现在可以开始介绍redis了。 一般,我鼓励您将您的 redis 视为纯粹的缓存而不是永久存储;它是否被吹走并不重要,这只是意味着您的网站在接下来的几秒钟内变慢了,因为您的用户正在从 SQL 查询而不是 redis 命中获取他们的页面加载(每个查询重新填充该用户的排序帖子列表当然是在 Redis 中)。

您使用 Redis 的策略和示例代码对我来说似乎很好,但是在您拥有关于用户如何使用您的网站的实际数据之前(这可能与您当前的预期大不相同),这根本不可能了解您需要什么类型的 SQL 索引,什么键和列表最适合在 Redis 中缓存,等等。

关于node.js - 使用redis缓存关系数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54182745/

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