Я строю небольшую социальную сеть (у пользователей есть посты, а у постов есть комментарии - очень простые), используя кластерный сервер nodejs и redis в качестве распределенного кэша.
Мой подход к кэшированию сообщений пользователей состоит в том, чтобы иметь sorted set
, который содержит все идентификаторы сообщений пользователя, упорядоченные по рейтингу (который должен обновляться каждый раз, когда кто-то добавляет лайк или комментарий), и фактические объекты, отсортированные как hash objects
.
Таким образом, поток сообщений пользователя get должен выглядеть следующим образом:
1. используя zrange
, чтобы получить диапазон идентификаторов из sorted set
.
2. используя multi/exec
и hgetall
, чтобы получить все объекты одновременно.
У меня есть пара вопросов:
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);
});
};