Commit 7666958f authored by 陈家荣's avatar 陈家荣

推荐列表增加缓存

parent 7596abfc
...@@ -23,7 +23,8 @@ var forumThreadService = require('../../service/forumThreadService'), ...@@ -23,7 +23,8 @@ var forumThreadService = require('../../service/forumThreadService'),
// var forumLimitActionRefService = require('../../service/forumLimitActionRefService'); // var forumLimitActionRefService = require('../../service/forumLimitActionRefService');
forumLimitOperationService = require('../../service/forumLimitOperationService'), forumLimitOperationService = require('../../service/forumLimitOperationService'),
forumAboutMEService = require('../../service/forumAboutMEService'), forumAboutMEService = require('../../service/forumAboutMEService'),
httpService = require('../../service/httpService'); httpService = require('../../service/httpService'),
redisThreadList = require('../../utils/redisThreadList');
var userUtil = require('../../utils/user'); var userUtil = require('../../utils/user');
var floorGenerator = require('../../utils/floorGenerator'); var floorGenerator = require('../../utils/floorGenerator');
...@@ -1593,6 +1594,8 @@ router.post('/thread/:tid/essence', function(req, res, next) { ...@@ -1593,6 +1594,8 @@ router.post('/thread/:tid/essence', function(req, res, next) {
console.error(err); console.error(err);
res.json(returnCode.BUSY); res.json(returnCode.BUSY);
} else { } else {
//更新推荐列表redis
redisThreadList.updateRedisEsenceThreads(ent_code, "", '_thread_essence', function() {});
res.json(returnCode.SUCCESS); res.json(returnCode.SUCCESS);
} }
}); });
...@@ -1619,6 +1622,8 @@ router.post('/thread/:tid/unEssence', function(req, res, next) { ...@@ -1619,6 +1622,8 @@ router.post('/thread/:tid/unEssence', function(req, res, next) {
console.error(err); console.error(err);
res.json(returnCode.BUSY); res.json(returnCode.BUSY);
} else { } else {
//更新推荐列表redis
redisThreadList.updateRedisEsenceThreads(ent_code, "", '_thread_essence', function() {});
res.json(returnCode.SUCCESS); res.json(returnCode.SUCCESS);
} }
}); });
......
...@@ -24,6 +24,7 @@ var user = require('../../utils/user'); ...@@ -24,6 +24,7 @@ var user = require('../../utils/user');
var floorGenerator = require('../../utils/floorGenerator'); var floorGenerator = require('../../utils/floorGenerator');
var async = require('async'); var async = require('async');
var ForumModeratorApply = mongoose.model('ForumModeratorApply'); var ForumModeratorApply = mongoose.model('ForumModeratorApply');
var redisThreadList = require('../../utils/redisThreadList');
module.exports = function(app) { module.exports = function(app) {
app.use('/v1/forum', router); app.use('/v1/forum', router);
}; };
...@@ -1774,10 +1775,11 @@ router.post('/thread/:tid/disable', function(req, res, next) { ...@@ -1774,10 +1775,11 @@ router.post('/thread/:tid/disable', function(req, res, next) {
}); });
//获取推荐文章 //获取推荐文章 //旧的,无用 2016/1/28日后请删除
router.get('/thread/getThreadWithEssence', function(req, res, next) { router.get('/thread/getThreadWithEssence_old', function(req, res, next) {
var pageNo = req.query.pageNo || 1; var pageNo = req.query.pageNo || 1;
var pageSize = req.query.pageSize || 10; var pageSize = req.query.pageSize || 10;
var infoId = req.query.infoId || null;
var sort = '-new_recommend_time'; var sort = '-new_recommend_time';
var ent_code = req.session.user.ent_code; var ent_code = req.session.user.ent_code;
var today = new Date(); var today = new Date();
...@@ -1795,43 +1797,18 @@ router.get('/thread/getThreadWithEssence', function(req, res, next) { ...@@ -1795,43 +1797,18 @@ router.get('/thread/getThreadWithEssence', function(req, res, next) {
'event.eventStartTime' : {$lte : today} 'event.eventStartTime' : {$lte : today}
}] }]
}; };
forumThreadService.getThreadWithNotPopulateComment(conditions, pageNo, pageSize, sort, function(err, results) { if(infoId){
if (err) { conditions.info = infoId;
console.error(err);
res.json(returnCode.BUSY);
} else {
util.loadLevel(req.session.user.ent_code, results.items, function() {
redisPraiseLog.get(ent_code, user.getMobileUser(req), 'thread', function(error, docs) {
_.forEach(results.items, function(d, i) {
if (results.items[i].toObject) {
results.items[i] = results.items[i].toObject();
} }
//设置帖子的活动 queryThread(conditions, pageNo, pageSize, sort, function(err, results){
if(results.items[i].isEvent && results.items[i].isEvent == 1){ if(err){
if(results.items[i].event.eventEndTime < today){ console.error(err);
results.items[i].eventStatus = 2; //'已结束'; res.json(returnCode.BUSY);
}else{ }else{
results.items[i].eventStatus = 1; //'进行中'; util.loadLevel(ent_code, results.items, function() {
} handleThreadList(req, results, ent_code, function(result){
} res.json(_.assign(result, returnCode.SUCCESS));
//获取等级最高的荣誉
if(results.items[i].from.honorTitles && results.items[i].from.honorTitles.length > 0){
var temp_honorTitles = _.sortBy(results.items[i].from.honorTitles, 'order_idx')
results.items[i].from.honorTitles = temp_honorTitles[temp_honorTitles.length - 1];
}
results.items[i].isPraise = false;
for (var k = docs.length - 1; k >= 0; k--) {
if (results.items[i]._id == docs[k]) {
results.items[i].isPraise = true;
break;
}
};
});
res.json(_.assign(results, returnCode.SUCCESS));
}); });
}); });
} }
...@@ -1842,6 +1819,7 @@ router.get('/thread/getThreadWithEssence', function(req, res, next) { ...@@ -1842,6 +1819,7 @@ router.get('/thread/getThreadWithEssence', function(req, res, next) {
router.get('/thread/getThreadWithNotPopulateComment', function(req, res, next) { router.get('/thread/getThreadWithNotPopulateComment', function(req, res, next) {
var pageNo = req.query.pageNo || 1; var pageNo = req.query.pageNo || 1;
var pageSize = req.query.pageSize || 10; var pageSize = req.query.pageSize || 10;
var infoId = req.query.infoId || null;
var sort = '-_id'; var sort = '-_id';
var ent_code = req.session.user.ent_code; var ent_code = req.session.user.ent_code;
var today = new Date(); var today = new Date();
...@@ -1858,12 +1836,104 @@ router.get('/thread/getThreadWithNotPopulateComment', function(req, res, next) { ...@@ -1858,12 +1836,104 @@ router.get('/thread/getThreadWithNotPopulateComment', function(req, res, next) {
'event.eventStartTime' : {$lte : today} 'event.eventStartTime' : {$lte : today}
}] }]
}; };
forumThreadService.getThreadWithNotPopulateComment(conditions, pageNo, pageSize, sort, function(err, results) { if(infoId){
if (err) { conditions.info = infoId;
}
queryThread(conditions, pageNo, pageSize, sort, function(err, results){
if(err){
console.error(err); console.error(err);
res.json(returnCode.BUSY); res.json(returnCode.BUSY);
} else { }else{
util.loadLevel(req.session.user.ent_code, results.items, function() { util.loadLevel(ent_code, results.items, function() {
handleThreadList(req, results, ent_code, function(result){
res.json(_.assign(result, returnCode.SUCCESS));
});
});
}
});
});
//获取推荐文章
router.get('/thread/getThreadWithEssence', function(req, res, next) {
var pageNo = req.query.pageNo || 1;
var pageSize = req.query.pageSize || 10;
var infoId = req.query.infoId || null;
var ent_code = req.session.user.ent_code;
var skip = (pageNo - 1) * pageSize;
var redis_type = '_thread_essence';
var sort = '-new_recommend_time';
var today = new Date();
var conditions = {
ent_code: ent_code,
level: 1,
status: 1,
new_recommend: 1,
$or: [{
isEvent: 0
}, {
isEvent: null
}, {
isEvent: 1,
'event.eventStartTime' : {$lte : today}
}]
};
if((pageNo * pageSize) > redisThreadList.getThreadRedisCount() || infoId){
if(infoId){
conditions.info = infoId;
}
queryThread(conditions, pageNo, pageSize, sort, function(err, results){
if(err){
console.error(err);
res.json(returnCode.BUSY);
}else{
util.loadLevel(ent_code, results.items, function() {
handleThreadList(req, results, ent_code, function(result){
res.json(_.assign(result, returnCode.SUCCESS));
});
});
}
});
}else{
//更新推荐列表redis
redisThreadList.get(ent_code, "", redis_type, function(error, docs) {
var results = JSON.parse(docs);
if(results.items == null){ //如果不存在,继续重新获取
redisThreadList.getRedisEsenceThreads(ent_code, "", redis_type, function(error, docs){
if(error){
console.error(err);
res.json(returnCode.BUSY);
}else{
docs = JSON.parse(docs);
docs.items = docs.items.slice(skip, skip+pageSize);
handleThreadList(req, docs, ent_code, function(result){
res.json(_.assign(result, returnCode.SUCCESS));
});
}
});
}else{ //只取缓存里面
results.items = results.items.slice(skip, Number(skip) + Number(pageSize));
handleThreadList(req, results, ent_code, function(result){
res.json(_.assign(result, returnCode.SUCCESS));
});
}
});
}
});
//查询帖子
function queryThread(conditions, pageNo, pageSize, sort,callback){
forumThreadService.getThreadWithNotPopulateComment(conditions, pageNo, pageSize, sort, function(err, results) {
callback(err, results);
});
}
//处理帖子
function handleThreadList(req, results, ent_code, callback){
var today = new Date();
redisPraiseLog.get(ent_code, user.getMobileUser(req), 'thread', function(error, docs) { redisPraiseLog.get(ent_code, user.getMobileUser(req), 'thread', function(error, docs) {
_.forEach(results.items, function(d, i) { _.forEach(results.items, function(d, i) {
if (results.items[i].toObject) { if (results.items[i].toObject) {
...@@ -1892,11 +1962,8 @@ router.get('/thread/getThreadWithNotPopulateComment', function(req, res, next) { ...@@ -1892,11 +1962,8 @@ router.get('/thread/getThreadWithNotPopulateComment', function(req, res, next) {
break; break;
} }
}; };
}); });
res.json(_.assign(results, returnCode.SUCCESS)); callback(results);
});
});
}
}); });
}); }
\ No newline at end of file
'use strict';
var redis=global.redis;
var expire = 60*60*3;
//缓存数量
var ThreadRedisCount = 50;
var _ = require('lodash');
var then = require('thenjs');
var forumThreadService=require('../service/forumThreadService');
var redisPraiseLog=require('./redisPraiseLog');
var util=require('./util');
function getKey(ent_code,keyID,type){
var key = ent_code + keyID + type;
return key;
}
function setToRedis(ent_code,keyID,type,value){
var key = getKey(ent_code,keyID,type);
if(!redis){
console.log('redis error');
return 'error'
}
redis.set(key, value, function(error, res){
redis.expire(key, expire);
return 'success'
});
}
exports.get=function(ent_code,keyID,type,callback){
var key = getKey(ent_code,keyID,type);
if(!redis){
console.log('redis error');
return callback && callback('error');
}
redis.get(key, function(error, res){
if(!res){
//不存在,先获取再返回
getEsenceThreads(ent_code, keyID, type,function(err){
redis.get(key, function(error, res){
return callback && callback(error, res.split(","));
});
});
}else{
return callback && callback(error, res);
}
});
};
exports.set=function(ent_code,keyID,type,value,callback){
var key = getKey(ent_code,keyID,type);
if(!redis){
console.log('redis error');
return callback && callback('error');
}
redis.set(key, value, function(error, res){
redis.expire(key, expire);
return callback && callback(error, 'success');
});
};
exports.clear = function(ent_code,keyID,type,callback){
var key = getKey(ent_code,keyID,type);
if(!redis){
console.log('redis error');
return callback && callback('error');
}
redis.del(key, function(error, res){
return callback && callback(error, !!res);
});
};
function getEsenceThreads(ent_code,keyID,type,callback){
var sort = '-new_recommend_time';
var today = new Date();
var conditions = {
ent_code: ent_code,
level: 1,
status: 1,
new_recommend: 1,
$or: [{
isEvent: 0
}, {
isEvent: null
}, {
isEvent: 1,
'event.eventStartTime' : {$lte : today}
}]
};
forumThreadService.getThreadWithNotPopulateComment(conditions, 1, ThreadRedisCount, sort, function(err, results) {
if (err) {
console.error(err);
callback(err);
} else {
util.loadLevel(ent_code, results.items, function() {
setToRedis(ent_code,keyID,type,JSON.stringify(results));
callback(null);
});
}
});
};
//获取缓存列表
exports.getRedisEsenceThreads = function(ent_code,keyID,type,callback){
var key = getKey(ent_code,keyID,type);
getEsenceThreads(ent_code, keyID,type, function(err){
redis.get(key, function(error, res){
return callback && callback(error, res.split(","));
});
});
};
//更新缓存列表
exports.updateRedisEsenceThreads = function(ent_code,keyID,type,callback){
var key = getKey(ent_code,keyID,type);
getEsenceThreads(ent_code, keyID,type, function(err){
callback();
});
};
//获取缓存数值
exports.getThreadRedisCount = function(){
// callback(ThreadRedisCount);
return ThreadRedisCount;
};
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment