用Nodejs加redis实现follow,tag,feed系统

用Nodejs加redis实现follow,tag,feed系统

follow,tag,和feed系统都非常适合用redis来实现,以tag系统为例: 用户ltebean要给nodejs加一个标签amazing就是:

sadd user:ltebean:tag:amazing nodejs
sadd user:ltebean:item:nodejs amazing

存一个反向关系是为了即能根据tag查也能根据item查,下面是redis的command:

拿到nodejs所有的标签:

smembers user:ltebean:item:nodejs

拿到tag amazing下所有的item:

smembers user:ltebean:tag:amazing

拿到既打了amazing标签,又打了web标签的item

sunion user:ltebean:tag:amazing user:ltebean:tag:web

下面是nodejs实现的api:

taggie.user('ltebean').item('bootstrap').addTag('css', function(err, res) {});
taggie.user('ltebean').item('bootstrap').addTag('web', function(err, res) {});
taggie.user('ltebean').item('jquery').addTag('web', function(err, res) {});
taggie.user('ltebean').item('jquery').addTag('js', function(err, res) {});
taggie.user('ltebean').item('nodjs').addTag('js', function(err, res) {});

taggie.user(‘ltebean’).item(‘jquery’).allTags(function(err, res) { console.log(“jquery 's tag: %s”, res); // jquery 's tag: js,web });

taggie.user(‘ltebean’).item().allItems(function(err, res) { console.log(“all items: %s”, res); // all items: jquery,nodjs,bootstrap });

taggie.user(‘ltebean’).tag(‘web’).allItems(function(err,res){ console.log(‘tagged with web: %s’,res); // tagged with web: jquery,bootstrap });

taggie.user(‘ltebean’).tag().allTags(function(err,res){ console.log(‘all tags: %s’,res); // all tags: js,web,css });

taggie.user(‘ltebean’).tag([‘web’,‘js’]).itemsByInter(function(err,res){ console.log(‘tagged with web and js: %s’,res); // tagged with web and js: jquery });

taggie.user(‘ltebean’).tag([‘web’,‘js’]).itemsByUnion(function(err,res){ console.log(‘tagged with web or js: %s’,res); // tagged with web or js: jquery,nodjs,bootstrap });

用户follow和feed系统的实现也类似, 最后附上三个项目的地址: taggie: https://github.com/ltebean/taggie user-graph: https://github.com/ltebean/user-graph feedie: https://github.com/ltebean/feedie


2 回复

用Node.js加Redis实现Follow、Tag、Feed系统

概述

本文将介绍如何使用Node.js和Redis来实现一个简单的Follow、Tag和Feed系统。我们将从Tag系统开始,逐步扩展到其他功能。

Tag系统实现

示例代码

首先,我们来看一下如何使用Redis来管理标签(Tag)。

const redis = require('redis');
const client = redis.createClient();

// 添加标签
function addTag(username, item, tag, callback) {
    const key1 = `user:${username}:tag:${tag}`;
    const key2 = `user:${username}:item:${item}`;

    client.sadd(key1, item, (err, res) => {
        if (err) return callback(err);
        client.sadd(key2, tag, (err, res) => {
            callback(null, res);
        });
    });
}

// 获取所有标签
function getAllTags(username, item, callback) {
    client.smembers(`user:${username}:item:${item}`, callback);
}

// 获取带有特定标签的所有项目
function getItemsByTag(username, tag, callback) {
    client.smembers(`user:${username}:tag:${tag}`, callback);
}

// 获取带有多个标签的所有项目
function getItemsByMultipleTags(username, tags, callback) {
    client.sinterstore('temp', tags.map(tag => `user:${username}:tag:${tag}`), (err, res) => {
        if (err) return callback(err);
        client.smembers('temp', (err, res) => {
            client.del('temp', () => {});
            callback(null, res);
        });
    });
}
示例调用
addTag('ltebean', 'bootstrap', 'css', (err, res) => {
    console.log(res); // 输出添加结果
});

getAllTags('ltebean', 'bootstrap', (err, res) => {
    console.log(res); // 输出所有标签
});

getItemsByTag('ltebean', 'css', (err, res) => {
    console.log(res); // 输出带有该标签的所有项目
});

getItemsByMultipleTags('ltebean', ['css', 'web'], (err, res) => {
    console.log(res); // 输出同时带有这两个标签的所有项目
});

Follow系统实现

示例代码

接下来,我们来看一下如何使用Redis来实现Follow系统。

// 关注用户
function followUser(follower, following, callback) {
    const key1 = `user:${follower}:following`;
    const key2 = `user:${following}:followers`;

    client.sadd(key1, following, (err, res) => {
        if (err) return callback(err);
        client.sadd(key2, follower, (err, res) => {
            callback(null, res);
        });
    });
}

// 获取关注者列表
function getFollowers(username, callback) {
    client.smembers(`user:${username}:followers`, callback);
}

// 获取被关注者列表
function getFollowing(username, callback) {
    client.smembers(`user:${username}:following`, callback);
}
示例调用
followUser('user1', 'user2', (err, res) => {
    console.log(res); // 输出添加结果
});

getFollowers('user2', (err, res) => {
    console.log(res); // 输出关注者列表
});

getFollowing('user1', (err, res) => {
    console.log(res); // 输出被关注者列表
});

Feed系统实现

示例代码

最后,我们来看一下如何使用Redis来实现Feed系统。

// 发布动态
function postActivity(username, activity, callback) {
    const key = `user:${username}:activity`;

    client.rpush(key, activity, (err, res) => {
        callback(null, res);
    });
}

// 获取用户的动态
function getActivity(username, callback) {
    client.lrange(`user:${username}:activity`, 0, -1, callback);
}
示例调用
postActivity('ltebean', 'Learning Node.js', (err, res) => {
    console.log(res); // 输出发布结果
});

getActivity('ltebean', (err, res) => {
    console.log(res); // 输出动态列表
});

总结

以上代码展示了如何使用Node.js和Redis来实现一个简单的Follow、Tag和Feed系统。通过这些基本的功能,你可以进一步扩展和优化你的应用。更多详细的实现可以参考GitHub上的项目地址:

希望这些示例对你有所帮助!


要在Node.js中使用Redis实现follow、tag和feed系统,我们可以利用Redis的数据结构如Set、Sorted Set等。以下是一些基本概念和代码示例,用于帮助理解和实现这些功能。

Tag系统

Tag系统主要涉及为项目添加标签、获取项目的标签以及获取特定标签下的所有项目。

添加标签

const redis = require('redis');
const client = redis.createClient();

client.sadd(`user:ltebean:item:nodejs`, 'amazing', (err, reply) => {
    if (!err) {
        console.log(reply); // 输出结果
    }
});

client.sadd(`user:ltebean:tag:amazing`, 'nodejs', (err, reply) => {
    if (!err) {
        console.log(reply); // 输出结果
    }
});

获取标签

client.smembers(`user:ltebean:item:nodejs`, (err, tags) => {
    if (!err) {
        console.log(tags); // 输出结果
    }
});

获取特定标签下的所有项目

client.smembers(`user:ltebean:tag:amazing`, (err, items) => {
    if (!err) {
        console.log(items); // 输出结果
    }
});

Follow系统

Follow系统涉及到用户之间的关注关系。可以使用Set来存储关注者或被关注者。

添加关注

client.sadd(`user:ltebean:following`, 'otheruser', (err, reply) => {
    if (!err) {
        console.log(reply); // 输出结果
    }
});

获取关注的用户列表

client.smembers(`user:ltebean:following`, (err, users) => {
    if (!err) {
        console.log(users); // 输出结果
    }
});

Feed系统

Feed系统用于显示用户的动态,例如他们关注的人发布的内容。

添加到Feed

client.zadd(`user:ltebean:feed`, Date.now(), 'newpost', (err, reply) => {
    if (!err) {
        console.log(reply); // 输出结果
    }
});

获取Feed

client.zrange(`user:ltebean:feed`, 0, -1, (err, posts) => {
    if (!err) {
        console.log(posts); // 输出结果
    }
});

通过这些简单的例子,你可以看到如何使用Redis来构建follow、tag和feed系统。更多复杂的逻辑可以根据实际需求进行扩展。

回到顶部