用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
用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系统。更多复杂的逻辑可以根据实际需求进行扩展。