大佬教程收集整理的这篇文章主要介绍了在node.js中使用redis支持的“kue”库 – 为什么我的redis内存使用量不断增加?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
任何想法为什么redis内存使用量不断增加,即使我删除已完成的工作?参考代码:
gaemodel.update = (params) -> job = jobs.create "gaemodel-update",params job.attempts 2 job.save() job.on "complete",-> job.remove (err) -> throw err if err console.log 'completed job #%d',job.id
redis使用通用内存分配器(jemalloc,ptmalloc,tcmalloc等).这些分配器不一定将内存返回给系统.当一些内存被释放时,分配器往往保留它(以便将其重新用于将来的分配).当许多小对象被随机分配时,尤其如此,redis通常是这样.
结果是在给定时间点的记忆消耗峰值将导致redis累积记忆并保持记忆.这个内存不会丢失,如果出现内存消耗的另一个峰值,它将被重新使用.但是从系统的角度来看,内存仍然分配给redis.对于排队系统,如果您将项目排队的速度比您能够将其排队的速度更快,则内存消耗将达到峰值.
我的建议是为了调整应用程序以定期的时间间隔获取和记录队列长度,以检查队列中项目数量的变化(并识别峰值).
更新:
我用kue测试了几件东西来了解它在redis中的存储.实际上,数据结构是相当复杂的(混合的字符串,集合,zsets和哈希).如果您查看redis,您会发现以下内容:
q:job:nnn (hash,job deFinition and properties) q:search:object:nnn (set,@L_33_17@phone tokens associated to job nnn) q:search:word:XXXXX (set,reverse index to support job full-text indexing) q:jobs:inactive (zset,all the unprocessed jobs) q:jobs:X:inactive (zset,all the unprocessed jobs of job type X) q:jobs:active (zset,all the on-going jobs) q:jobs:X:active (zset,all the on-going jobs of job type X) q:jobs:complete (zset,all the completed jobs) q:jobs:X:complete (zset,all the completed jobs of job type X) q:jobs:Failed (zset,all the Failed jobs) q:jobs:X:Failed (zset,all the Failed jobs of job type X) q:jobs:delayed (zset,all the delayed jobs) q:jobs:X:delayed (zset,all the delayed jobs of job type X) q:job:types (set,all the job types) q:jobs (zset,all the jobs) q:stats:work-time (String,work time statistiC) q:ids (String,job id sequencE)
我根本不知道Coffeescript,所以我试图用简单的旧的Javascript来重现这个问题:
var kue = require('kue'),jobs = kue.createQueue(); jobs.process( 'email',function(job,donE) { console.log('Processing email '+JSON.Stringify(job) ) done(); }); function create_email(i) { var j = jobs.create('email',{ title: 'This is email '+i,to: 'didier',template: 'Bla bla bla' }); j.on('complete',function() { console.log('complete email job #%d',j.id); j.remove(function(err){ if (err) throw err; console.log('removed completed job #%d',j.id); }); }); j.save(); } for ( i=0; i<5; ++i ) { create_email(i); } kue.app.listen(8080);
redis 127.0.0.1:6379> keys * 1) "q:ids" 2) "q:jobs:complete" 3) "q:jobs:email:complete" 4) "q:stats:work-time" 5) "q:job:types" redis 127.0.0.1:6379> zrange q:jobs:complete 0 -1 1) "1" 2) "2" 3) "3" 4) "4" 5) "5"
所以似乎完成的工作保留在q:作业:完成和q:作业:X:尽管作业被删除完成.我建议你检查这些zsets在你自己的redis实例的基数.
我的解释是这些zset的管理发生在“完成”事件发生之后.所以作业被正确删除,但它们的id被插入到这些zsets之后.
解决方法是避免依赖每个作业的事件,而是使用每队列事件来删除作业.例如,可以进行以下修改:
// added this jobs.on('job complete',function(id) { console.log('Job complete '+id ) kue.Job.get(id,function(err,job) { if (err) return; job.remove(function(err){ if (err) throw err; console.log('removed completed job #%d',job.id); }); }); }); // updated that function create_email(i) { var j = jobs.create('email',template: 'Bla bla bla' }); j.save(); }
redis 127.0.0.1:6379> keys * 1) "q:stats:work-time" 2) "q:ids" 3) "q:job:types"
您可以使用类似的Coffescript策略.
以上是大佬教程为你收集整理的在node.js中使用redis支持的“kue”库 – 为什么我的redis内存使用量不断增加?全部内容,希望文章能够帮你解决在node.js中使用redis支持的“kue”库 – 为什么我的redis内存使用量不断增加?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。