使用redis缓存关系数据



我正在构建一个小型社交网络(用户有帖子,帖子有评论-非常基本),使用集群nodejs服务器和redis作为分布式缓存。
我缓存用户帖子的方法是有一个sorted set,它包含按速率排序的所有用户帖子ID(每次有人添加点赞或评论时都应该更新),以及按hash objects排序的实际对象
所以get用户的帖子流应该是这样的:
1.使用CCD_ 3从CCD_
2。使用CCD_ 5和CCD_。

我有几个问题:
1.关于性能问题,当缓存大小越来越大时,我的方法会扩展吗?或者我应该使用lua之类的
1。如果我想继续使用当前的方法,在redis崩溃的情况下,我应该保存排序集,如果我使用redis持久性,这将影响整体性能,我考虑为sets使用一个专用的redis服务器(我搜索了是否可以只备份部分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);
});
};

这是一个有趣的智力练习,但在我看来,这是典型的过早优化。

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

2) 现在您可以开始介绍redis了。在general中,我鼓励您将redis视为纯粹的缓存,而不是永久存储;如果它被吹走了也没关系,这只意味着你的网站在接下来的几秒钟里会变慢,因为你的用户从SQL查询而不是redis点击中获得页面加载(当然,每个查询都会在redis中重新填充用户的帖子排序列表)。

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

我遇到了类似的问题,我需要一种更有效地查询数据的方法。不能肯定,但我听说Redis是单线程的,在运行lua脚本时会阻塞主线程,我相信这对社交网站来说不好。我听说了Tarantool,它看起来很有前景,目前正试图让我的头脑围绕它。

如果你担心你的缓存大小越来越大,我认为大多数社交网络都会在用户缓存中保留两周的数据,任何超过两周的内容都会被删除,你只需实现一个滚动功能,该功能可以在用户向下滚动时使用分页,获取接下来两周的数据,并仅为该特定用户将其添加回内存(不要忘记为新添加的数据指定新的ttl)。这有助于保持缓存大小的精简。

当redis或任何正在使用的内存中数据工具崩溃时,只需将数据重新加载回内存即可。它们都具有将数据保存到文件作为备份的功能。我正在考虑实现另一个不知道的数据库层,比如Cassandra或Mongodb,它保存了自创建以来每个用户的时间表。当然,这会产生另一个开销,因为您必须保持三个数据层(例如mysql、redis和mongodb)同步!

如果这看起来工作量很大,请随时使用第三方服务来托管内存中的数据,至少你可以轻松入睡,但这会让你付出代价。

也就是说,这是非常固执己见的。厌倦了人们告诉我要等到我的网站用户爆满,或者你得到的所谓的过早优化回复:)

最新更新