nodejs,redis。检查密钥是否存在,如果不存在则创建新密钥

nodejs,redis。检查密钥是否存在,如果不存在则创建新密钥,第1张

nodejs,redis。检查密钥是否存在,如果不存在则创建新密钥

此代码中至少有两个问题:

  • 第一个链接到Javascript关闭管理。循环的主体不会创建作用域。使用Javascript,变量的范围是在函数级别上,而不是在块级别上。您需要在循环本身中引入一些函数来强制创建适当的闭包。更多信息在这里。

  • 第二个是存在和设置命令之间的竞争条件。如果存在多个正在运行的Redis连接,并在同一键上设置命令,则可能会发生某种冲突。您应该使用setnx来执行检查并在一个原子 *** 作中进行设置,而不是使用存在和设置。

考虑第二个示例,使用forEach解决了关闭问题,但是由于该语言的异步特性,您仍然会在set *** 作之前生成所有get *** 作。

如果您真的想对所有get和set *** 作进行排序(顺便说一句,速度会慢很多),那么您可以使用一些函数式编程来使用递归实现循环。

范例

该程序:

var redis = require('redis')var rc = redis.createClient(6379, 'localhost');var tags = [  "apple",  "tiger",  "mouse",  "apple",  "apple",  "apple",  "tiger",  "mouse",  "mouse",];var count = 0;function loop(tags) {  function rec_loop(tags,i) {     if ( i >= tags.length )        return     rc.get("tag:"+tags[i],function(err,rr) {        console.log("get tag "+tags[i]+" result pre "+rr);        if ( rr == null ) {rc.set("tag:"+tags[i],"info",function(err,rr) {   count++;   console.log('set tag '+tags[i]+' '+rr+' objects count '+count);   rec_loop(tags,++i)})        } else          rec_loop(tags,++i)     })  }  rec_loop(tags,0)}loop(tags)

显示:

get tag apple result pre nullset tag apple OK objects count 1get tag tiger result pre nullset tag tiger OK objects count 2get tag mouse result pre nullset tag mouse OK objects count 3get tag apple result pre infoget tag apple result pre infoget tag apple result pre infoget tag tiger result pre infoget tag mouse result pre infoget tag mouse result pre info

请注意,在此示例中竞赛条件仍然存在。您应该使用setnx来实现这种检查和设置 *** 作。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4919163.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存