栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

一个客户端的Redis WATCH MULTI EXEC

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一个客户端的Redis WATCH MULTI EXEC

您的结果完全可以预测。是的。

请记住-node.js是一个线程应用程序。Node.js使用异步输入输出,但是命令应该以redis严格顺序的“请求-
响应”发送。因此,当您仅使用一个连接到Redis服务器时,您的代码和请求将严格并行执行。

查看您的代码:

rc.on('ready', function () {    rc.set("inc",0)    for(var i = 1; i <= 10; i++){        rc.watch("inc")        //10 times row by row call get function. It`s realy means that your written        //in an asynchronous style pre executed strict in series. You are using just        //one connection - so all command would be executed one by one.        rc.get("inc",function(err,data){ //Your data variable data = 0 for each if request. var multi = rc.multi() data++ //This operation is not atomic for redis so your always has data = 1 multi.set("inc",data) //and set it multi.exec(function(err,replies){     console.log(replies)  })        })    }})

要确认这一点,请执行以下步骤:

  1. 连接到redis并执行
    monitor
    命令。
  2. 运行您的node.js应用程序

输出将是

    SET inc 0    WATCH inc    GET inc     .... get command more 9 times    MULTI    SET inc 1    EXEC    .... command block more 9 times

这样一来,您就可以准确地得到上面编写的结果:“在exec回调中获得0个错误,但最终获得“ inc”变量=1。”。

您可以为每次迭代创建新的客户端连接吗?

对于此示例-
是的,它可以解决您的问题。通常,这取决于您要运行多少个“并发”查询。Redis仍然是一个线程,因此这种“并发”意味着将批处理命令并发到Redis引擎的正确方法。

例如,如果使用2个连接,则

monitor
可以给出如下所示的内容:

 1 SET inc 0 //from 1st connection 2 WATCH inc //from 1st connection 3 SET inc 0 //from 2nd connection  4 GET inc //from 1nd connection  5 WATCH int //from 2nd connection        6 GET inc //from 2nd connection       7 MULTI //from 1st connection 8 SET inc 1 //from 1st connection     9 MULTI //from 2nd connection10 SET inc 1 //from 2nd connection11 EXEC //from 1st failed becouse of 2nd connection SET inc 0 (line 3)         //was executed after WATCH (line 2) 12 EXEC //success becouse of MULTI from 1st connection was failed and SET inc 1 from first         //connection was not executed-------------------------------------------------------------------------------> time     |   |    |  |   |     |     |    |   |     |    |         |connection 1  set watch | get  |     |   multi set  |     |   exec(fail) |connection 2          set    watch  get multi set exec

了解redis如何执行命令非常重要。Redis是单线程的,来自所有连接的所有命令都一行一行地执行。Redis不能保证一个连接中的命令会连续执行(如果这里存在另一个连接),因此如果要确保命令执行了一个块(如果需要),则应该使用MULTI。但是为什么需要WA​​TCH?看看我上面的redis命令。您可以看到来自不同连接的命令混合在一起。并观看让您管理。

这在 文档中得到了很好的解释。请阅读!



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/376306.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号