zoukankan      html  css  js  c++  java
  • 4.Redis客户端的使用

    标题 :
    4.Redis客户端的使用
    目录 :
    Redis
    序号 :
    4

            Console.WriteLine($"北京和天津之间的距离是:{distance}公里");
    
    #### 事务
    ```csharp
       Console.WriteLine(Environment.NewLine);
                Console.WriteLine("----------------------事务----------------------");
                string bookName = database.StringGet("bookName");
                Console.WriteLine(bookName);
    ​
    ​
                var transaction = database.CreateTransaction();
                transaction.AddCondition(Condition.StringEqual("bookName", bookName));
                Console.WriteLine("transaction begin");
    ​
    ​
                //模拟开启另外一个客户端修改bookName的值,这时Condition.StringEqual("bookName", bookName) 条件就不满足,事务应当失败
                var watingHandle = new ManualResetEvent(false);
                Task.Factory.StartNew(() =>
                {
                    var other = ConnectionMultiplexer.Connect(config).GetDatabase(0);
                    other.StringSet("bookName", "从入门到变黄");
                    Console.WriteLine("我是另外一个客户端,我已经将bookName的值修改为了:"+other.StringGet("bookName"));
                    watingHandle.Set();
                });
                watingHandle.WaitOne();
    ​
    ​
    ​
                database.StringSet("bookName", "R语言从入门到实践");
                var result = transaction.Execute();
                Console.WriteLine("事务提交结果:" + result);
    ​
                bookName = database.StringGet("bookName");
                Console.WriteLine(bookName);
    



    源码中,实际也是以队列方式执行.

    • 我们在事务开启时,添加了条件.我们认为bookName的值在最后提交时应该没有被其他程序修改过
    • 我们开启了另一个客户端修改了bookName的值, 最后我们在exec的时候,返回了失败.(因为bookName已经被其他程序修改了)
    • 为什么transaction.Execute()返回了失败(其实这个失败,代表的是事务提交时指定的条件不满足),但是bookName的值还是被设置成了"R语言从入门到实践"。 这个就和redis的事务机制有关了,它不会回滚.所以
    database.StringSet("bookName", "R语言从入门到实践");
    

    这条语句还是被执行了.

    关于回滚:
    • 如果用命令行执行语句,如果语句本身语法有错误.事务会回滚.运行时错误不会回滚.
    • 如果用客户端库,它会回滚(因为如果语法错误,你程序都编译不过).对于客户端库而言,它只存在运行时错误.

    引用链接

    [无]

    请尽量按照自己期望的生活 email:18980489167@189.cn
  • 相关阅读:
    解决vs code 内置终端,字体间隔过大问题。(linux centos7 ubuntu成功)
    安装Epson打印机但因lsb依赖错误而中断的驱动程序
    ubuntu 权限不够,解决办法,无法获得锁 /var/lib/dpkg/lock
    ubuntu 安装WPS
    GNU GRUB引导的默认启动项是ubuntu
    网络编程基础
    反射、特殊双下方法、单例模式
    异常处理
    封装、多态、类的约束、类的私有成员
    多继承、经典类与新式类、新式类的C3算法详解
  • 原文地址:https://www.cnblogs.com/gytangyao/p/11406121.html
Copyright © 2011-2022 走看看