Use locking to avoid possible unnecessary fetching and caching of presets and objects
This commit is contained in:
1 parent
3ba1e05c2e
commit
7695b606c6
1 file changed
+62
-10
@@ -51,6 +51,53 @@ getTask = (taskId, callback) ->
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
getCached = (name, valueCallback, valueExpiry, callback) ->
|
||||||
|
redisClient.get(name, (err, res) ->
|
||||||
|
return callback(err) if err
|
||||||
|
return callback(null, JSON.parse(res)) if res?
|
||||||
|
|
||||||
|
lockAcquired = () ->
|
||||||
|
valueCallback((err, value) ->
|
||||||
|
return callback(err, value) if err
|
||||||
|
redisClient.setex(name, valueExpiry, JSON.stringify(value), (err) ->
|
||||||
|
return callback(err, value) if err
|
||||||
|
redisClient.del("lock.#{name}", (err) ->
|
||||||
|
callback(err, value)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
redisClient.setnx("lock.#{name}", Date.now() + 30000, (err, res) ->
|
||||||
|
return callback(err) if err
|
||||||
|
if res == 1
|
||||||
|
lockAcquired()
|
||||||
|
else
|
||||||
|
setTimeout(() ->
|
||||||
|
redisClient.get("lock.#{name}", (err, timestamp) ->
|
||||||
|
return callback(err) if err
|
||||||
|
now = Date.now()
|
||||||
|
if not timestamp?
|
||||||
|
getCached(name, valueCallback, valueExpiry, callback)
|
||||||
|
else if timestamp > now
|
||||||
|
setTimeout(() ->
|
||||||
|
getCached(name, valueCallback, valueExpiry, callback)
|
||||||
|
, 1000)
|
||||||
|
else
|
||||||
|
redisClient.getset("lock.#{name}", now + 30000, (err, timestamp) ->
|
||||||
|
return callback(err) if err
|
||||||
|
if timestamp > now
|
||||||
|
setTimeout(() ->
|
||||||
|
getCached(name, valueCallback, valueExpiry, callback)
|
||||||
|
, 1000)
|
||||||
|
else
|
||||||
|
lockAcquired()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
, 1000)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
getPresets = (callback) ->
|
getPresets = (callback) ->
|
||||||
redisClient.mget('presets', 'objects', (err, res) ->
|
redisClient.mget('presets', 'objects', (err, res) ->
|
||||||
presets = JSON.parse(res[0])
|
presets = JSON.parse(res[0])
|
||||||
@@ -60,22 +107,27 @@ getPresets = (callback) ->
|
|||||||
return
|
return
|
||||||
|
|
||||||
if not presets
|
if not presets
|
||||||
presetsCollection.find().toArray((err, p) ->
|
getCached('presets', (callback) ->
|
||||||
|
presetsCollection.find().toArray((err, res) ->
|
||||||
|
callback(err, res)
|
||||||
|
)
|
||||||
|
, config.PRESETS_CACHE_DURATION, (err, res) ->
|
||||||
throw err if err
|
throw err if err
|
||||||
presets = p
|
presets = res
|
||||||
|
|
||||||
redisClient.setex('presets', config.PRESETS_CACHE_DURATION, JSON.stringify(presets))
|
|
||||||
callback(presets, objects) if objects
|
callback(presets, objects) if objects
|
||||||
)
|
)
|
||||||
|
|
||||||
if not objects
|
if not objects
|
||||||
objectsCollection.find().toArray((err, o) ->
|
getCached('objects', (callback) ->
|
||||||
|
objectsCollection.find().toArray((err, res) ->
|
||||||
|
return callback(err) if err
|
||||||
|
objs = {}
|
||||||
|
objs[r._id] = r for r in res
|
||||||
|
callback(null, objs)
|
||||||
|
)
|
||||||
|
, config.PRESETS_CACHE_DURATION, (err, res) ->
|
||||||
throw err if err
|
throw err if err
|
||||||
objects = {}
|
objects = res
|
||||||
for i in o
|
|
||||||
objects[i._id] = i
|
|
||||||
|
|
||||||
redisClient.setex('objects', config.PRESETS_CACHE_DURATION, JSON.stringify(objects))
|
|
||||||
callback(presets, objects) if presets
|
callback(presets, objects) if presets
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in new issue
Block a user