v1.18.x
Barış Soner Uşaklı 8 years ago
parent 114f416ec0
commit e7d076a084

@ -46,7 +46,7 @@
"json-2-csv": "^2.0.22", "json-2-csv": "^2.0.22",
"less": "^2.0.0", "less": "^2.0.0",
"logrotate-stream": "^0.2.3", "logrotate-stream": "^0.2.3",
"lru-cache": "4.0.1", "lru-cache": "4.0.2",
"mime": "^1.3.4", "mime": "^1.3.4",
"minimist": "^1.1.1", "minimist": "^1.1.1",
"mkdirp": "~0.5.0", "mkdirp": "~0.5.0",

@ -5,6 +5,7 @@ var cacheController = {};
cacheController.get = function (req, res) { cacheController.get = function (req, res) {
var postCache = require('../../posts/cache'); var postCache = require('../../posts/cache');
var groupCache = require('../../groups').cache; var groupCache = require('../../groups').cache;
var userSettingsCache = require('../../user').settingsCache;
var avgPostSize = 0; var avgPostSize = 0;
var percentFull = 0; var percentFull = 0;
@ -21,6 +22,12 @@ cacheController.get = function (req, res) {
percentFull: percentFull, percentFull: percentFull,
avgPostSize: avgPostSize, avgPostSize: avgPostSize,
}, },
userSettingsCache: {
length: userSettingsCache.length,
max: userSettingsCache.max,
itemCount: userSettingsCache.itemCount,
percentFull: ((userSettingsCache.length / userSettingsCache.max) * 100).toFixed(2),
},
groupCache: { groupCache: {
length: groupCache.length, length: groupCache.length,
max: groupCache.max, max: groupCache.max,

@ -2,56 +2,94 @@
'use strict'; 'use strict';
var async = require('async'); var async = require('async');
var meta = require('../meta'); var meta = require('../meta');
var db = require('../database'); var db = require('../database');
var plugins = require('../plugins'); var plugins = require('../plugins');
var LRU = require('lru-cache');
var cache = LRU({
max: 500,
length: function () { return 1; },
maxAge: 1000 * 60 * 60,
});
module.exports = function (User) { module.exports = function (User) {
User.settingsCache = cache;
User.getSettings = function (uid, callback) { User.getSettings = function (uid, callback) {
if (!parseInt(uid, 10)) { if (!parseInt(uid, 10)) {
return onSettingsLoaded(0, {}, callback); return onSettingsLoaded(0, {}, callback);
} }
db.getObject('user:' + uid + ':settings', function (err, settings) { var cached = cache.get('user:' + uid + ':settings');
if (err) { if (cached) {
return callback(err); return onSettingsLoaded(uid, cached || {}, callback);
} }
onSettingsLoaded(uid, settings || {}, callback); async.waterfall([
}); function (next) {
db.getObject('user:' + uid + ':settings', next);
},
function (settings, next) {
settings = settings || {};
settings.uid = uid;
cache.set('user:' + uid + ':settings', settings);
onSettingsLoaded(uid, settings || {}, next);
},
], callback);
}; };
User.getMultipleUserSettings = function (uids, callback) { User.getMultipleUserSettings = function (uids, callback) {
function getFromCache(next) {
var settings = uids.map(function (uid) {
return cache.get('user:' + uid + ':settings') || {};
});
async.map(settings, function (setting, next) {
onSettingsLoaded(setting.uid, setting, next);
}, next);
}
if (!Array.isArray(uids) || !uids.length) { if (!Array.isArray(uids) || !uids.length) {
return callback(null, []); return callback(null, []);
} }
var keys = uids.map(function (uid) { var nonCachedUids = uids.filter(function (uid) {
return 'user:' + uid + ':settings'; return !cache.has('user:' + uid + ':settings');
}); });
db.getObjects(keys, function (err, settings) { if (!nonCachedUids.length) {
if (err) { return getFromCache(callback);
return callback(err);
} }
for (var i = 0; i < settings.length; i += 1) { var keys = nonCachedUids.map(function (uid) {
settings[i] = settings[i] || {}; return 'user:' + uid + ':settings';
settings[i].uid = uids[i]; });
}
async.map(settings, function (setting, next) { async.waterfall([
onSettingsLoaded(setting.uid, setting, next); function (next) {
}, callback); db.getObjects(keys, next);
},
function (settings, next) {
settings.forEach(function (userSettings, index) {
userSettings = userSettings || {};
userSettings.uid = nonCachedUids[index];
cache.set('user:' + userSettings.uid + ':settings', userSettings);
}); });
getFromCache(next);
},
], callback);
}; };
function onSettingsLoaded(uid, settings, callback) { function onSettingsLoaded(uid, settings, callback) {
plugins.fireHook('filter:user.getSettings', { uid: uid, settings: settings }, function (err, data) { async.waterfall([
if (err) { function (next) {
return callback(err); plugins.fireHook('filter:user.getSettings', { uid: uid, settings: settings }, next);
} },
function (data, next) {
settings = data.settings; settings = data.settings;
var defaultTopicsPerPage = parseInt(meta.config.topicsPerPage, 10) || 20; var defaultTopicsPerPage = parseInt(meta.config.topicsPerPage, 10) || 20;
@ -76,9 +114,9 @@ module.exports = function (User) {
settings.delayImageLoading = parseInt(getSetting(settings, 'delayImageLoading', 1), 10) === 1; settings.delayImageLoading = parseInt(getSetting(settings, 'delayImageLoading', 1), 10) === 1;
settings.bootswatchSkin = settings.bootswatchSkin || meta.config.bootswatchSkin || 'default'; settings.bootswatchSkin = settings.bootswatchSkin || meta.config.bootswatchSkin || 'default';
settings.scrollToMyPost = parseInt(getSetting(settings, 'scrollToMyPost', 1), 10) === 1; settings.scrollToMyPost = parseInt(getSetting(settings, 'scrollToMyPost', 1), 10) === 1;
next(null, settings);
callback(null, settings); },
}); ], callback);
} }
function getSetting(settings, key, defaultValue) { function getSetting(settings, key, defaultValue) {
@ -138,6 +176,7 @@ module.exports = function (User) {
User.updateDigestSetting(uid, data.dailyDigestFreq, next); User.updateDigestSetting(uid, data.dailyDigestFreq, next);
}, },
function (next) { function (next) {
cache.del('user:' + uid + ':settings');
User.getSettings(uid, next); User.getSettings(uid, next);
}, },
], callback); ], callback);
@ -160,8 +199,9 @@ module.exports = function (User) {
User.setSetting = function (uid, key, value, callback) { User.setSetting = function (uid, key, value, callback) {
if (!parseInt(uid, 10)) { if (!parseInt(uid, 10)) {
return callback(); return setImmediate(callback);
} }
cache.del('user:' + uid + ':settings');
db.setObjectField('user:' + uid + ':settings', key, value, callback); db.setObjectField('user:' + uid + ':settings', key, value, callback);
}; };
}; };

@ -26,6 +26,24 @@
</div> </div>
</div> </div>
<div class="panel panel-default">
<div class="panel-heading"><i class="fa fa-calendar-o"></i> User Settings Cache</div>
<div class="panel-body">
<label>[[admin/advanced/cache:items-in-cache]]</label><br/>
<span>{userSettingsCache.itemCount}</span><br/>
<label>[[admin/advanced/cache:length-to-max]]</label><br/>
<span>{userSettingsCache.length} / {userSettingsCache.max}</span><br/>
<div class="progress">
<div class="progress-bar" role="progressbar" aria-valuenow="{userSettingsCache.percentFull}" aria-valuemin="0" aria-valuemax="100" style="width: {userSettingsCache.percentFull}%;">
[[admin/advanced/cache:percent-full, {userSettingsCache.percentFull}]]
</div>
</div>
</div>
</div>
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"><i class="fa fa-calendar-o"></i> Group Cache</div> <div class="panel-heading"><i class="fa fa-calendar-o"></i> Group Cache</div>
<div class="panel-body"> <div class="panel-body">

Loading…
Cancel
Save