zoukankan      html  css  js  c++  java
  • Basic Tutorials of Redis(8) -Transaction

      Data play an important part in our project,how can we ensure correctness of the data and prevent the data

    from error.In relational database, we are famillar with the usage of transaction.

    begin
    opreations
    commit/rollback

      But there are some differences between the Redis and relational database.Let's introduce the commands

    first.There are only 5 commands to use while you use the transaction in redis.

      I want to take an example to show you how to use the transaction.So here is the backgroud.There are three

    persons and they want to buy the apple from the shop.The key for buying apple is the amount.

      For this example,I use the hash to store the infomation of the users and the products.I use the string to store

    the totalmoney for the trade.The following picture shows this example's initial data.

     

      Let's start to finish this example.The first step is to initialize the data.

    hmset user-1 name tom money 200
    hmset user-2 name jack money 300
    hmset user-3 name paul  money 500
    hmset product-1 name apple price 150 amount 2
    set totalmoney 0

     

      Tom wants to buy the apple,so the product-1's amount should decrease by one,tom's money should decrease

    by 150 and the totalmoney should increase by 150.The action buy includes three steps.We should check up the

    product-1 with buy action.

    watch product-1
    multi
    hincrby product-1 amount -1
    hincrby user-1 money -150
    incrby totalmoney 150
    exec

      You will find that after the command  multi ,the commands before  exec  all return queued.It means that those

    commands store in a queue.After exec command,the client send this queue to the server and execute the commands.

    But this is a normal situation that the amount is not changed before the transaction execute.

      Now jack want to buy the apple , so does paul.And paul takes first,so jack can't buy the apple successfully!To show

    this,we need another client to imitate paul takes first.Before execute the transaction of jack's action,we decrease the

    amount of product-1 to imitate paul buy the apple first.After executing the transaction of jack's action,the client returns

    (nil) meaning the transaction of jack's action executed fail and the three commands didn't execute too.

     

      This example shows the basic usage of transaction in redis.It is suitable for many questions.

      command  discard can help you to abort the current transaction.After executing the command discard.At this time

    execute the command exec will return an error.Because the multi didn't exists in this session.

     

      Now I will show you how to use the transaction in StackExchange.Redis.

     1              //Initiate the data
     2             db.HashSet("user-1", new HashEntry[2] { new HashEntry("name", "tom"), new HashEntry("money", 200) });
     3             db.HashSet("user-2", new HashEntry[2] { new HashEntry("name", "jack"), new HashEntry("money", 300) });
     4             db.HashSet("user-3", new HashEntry[2] { new HashEntry("name", "paul"), new HashEntry("money", 500) });
     5             db.HashSet("product-1", new HashEntry[3] { new HashEntry("name", "apple"), new HashEntry("price", 150),new HashEntry("amount", 2) });
     6             db.StringSet("totalmoney", 0);
     7             
     8             //multi
     9             var tran = db.CreateTransaction();
    10             //watch
    11             tran.AddCondition(Condition.HashEqual("product-1", "amount", "2"));
    12 
    13             tran.HashDecrementAsync("product-1", "amount");
    14             tran.HashDecrementAsync("user-1", "money", 150);
    15             tran.StringIncrementAsync("totalmoney", 150);
    16 
    17             Console.WriteLine(string.Format("execute the transaction {0}!", tran.Execute() ? "Y" : "N"));
    18 
    19             //multi
    20             var tran2 = db.CreateTransaction();
    21             //watch
    22             tran.AddCondition(Condition.HashEqual("product-1", "amount", "1"));
    23 
    24             tran.HashDecrementAsync("product-1", "amount");
    25             tran.HashDecrementAsync("user-2", "money", 150);
    26             tran.StringIncrementAsync("totalmoney", 150);
    27 
    28             //paul take first
    29             db.HashDecrement("product-1", "amount");
    30 
    31             Console.WriteLine(string.Format("execute the transaction {0}!", tran.Execute() ? "Y" : "N"));

      Debuging the code ,you will see the result as follow.

      

      The next post of this series is the RedisHelper.Thanks for your reading
     
  • 相关阅读:
    你好,这里有一份2019年目标检测指南
    谷歌2019 学术指标发榜:CVPR首次进入Top 10,何恺明论文引用最高!
    魔图互联:知识图谱推荐系统-给人们带来更个性化的推荐
    NLPer入门指南 | 完美第一步
    一文总结数据科学家常用的Python库(下)
    一文总结数据科学家常用的Python库(上)
    一文看懂NLP神经网络发展历史中最重要的8个里程碑!
    如何为计算机视觉任务选择正确的标注类型
    C. Queen Codeforces Round #549 (Div. 2) dfs
    D. Equalize Them All Codeforces Round #550 (Div. 3)
  • 原文地址:https://www.cnblogs.com/catcher1994/p/5861118.html
Copyright © 2011-2022 走看看