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