精华内容
下载资源
问答
  • 表示当前目录的父目录,cd ..当中一定有个空格。 文件处理命令:ls 命令名称:ls 命令英文原意:list 命令所在路径:/bin/ls 执行权限:所有用户 功能描述:显示当前或指定目录中的文件 语法:ls 选项[-ald] ...
  • HTML中部分标签说明

    2014-12-27 21:45:46
    1.HTML不把“ ”当空格,因为HTML中经常有缩进,如果把缩进空格在浏览器中以空格形式展现话,排版会很麻烦。... 这么写就不对了,表示的当前目录这张图片。  "/"表示网站根目录,"../"表示父目录,,

    1.HTML不把“ ”当空格,因为HTML中经常有缩进,如果把缩进的空格在浏览器中以空格形式展现的话,排版会很麻烦。

    2.如果要用空格,就用  (no-break space)。

    3.为什么<>要用&lt;&gt;代替? 就是因为<>有特殊含义:标签的定义。

    4.<b>fd</b> 表示粗体。

    5.<img src="/images/juhua.jpg"/>  此网站根目录下的这种图片。 <img src="images/juhua.jpg"/>   这么写就不对了,表示的是当前目录下的这张图片。

      "/"表示网站根目录,"../"表示父目录,,"../../"表示父目录的父目录

    6.将a的target属性设定为"_blank"就可以在新窗口打开超链接。例如:<a target="_blank" href="http://www.qq.com">腾讯</a>  国内的很多网站都是在新窗口中打开的。

    7.<img scr="a.jpg"/> 注意图片是链接的不是插入的,所以如果只想scr的图片被删除了也就看不了了。alt属性为图片无法显示时的显示文本;鼠标方式也有会悬浮提示“点击查看大图”;

    8.<ul></ul> unordered list表示没有顺序的list;.<ol></ol>表示有顺序的list。

    9.<table></table>为表格,在内部<tr>创建行,<tr>内部通过<td>创建单元格。 table的border=1显示表格线,0表示隐藏表格线。align表示对齐方式。

    10.子标签默认继承父标签的属性,如果自己单独指定了属性,则会覆盖父类的属性。

    11.rowspan、colspan进行单元格的合并。

    
    
    展开全文
  • 1.抽象: 抽象就是忽略一个主题中与当前目标无关那些方面,以便更充分地注意与当前目标有关方面。抽象并不打算了解全部问题,而只是选择其中一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是...
  • 在介绍zookeeper(下文zk代替)实现分布式锁机制之前,先粗略介绍一下zk是什么东西: Zookeeper是一种提供配置管理、分布式协同以及命名中心化服务。 zk模型是这样:zk包含一系列节点,叫做znode,就好像...

    前言

    在介绍zookeeper(下文用zk代替)实现分布式锁的机制之前,先粗略介绍一下zk是什么东西:

    Zookeeper是一种提供配置管理、分布式协同以及命名的中心化服务。

    zk的模型是这样的:zk包含一系列的节点,叫做znode,就好像文件系统一样每个znode表示一个目录,然后znode有一些特性:

    • 有序节点:

    假如当前有一个父节点为/lock,我们可以在这个父节点下面创建子节点;

    zookeeper提供了一个可选的有序特性,例如我们可以创建子节点“/lock/node-”并且指明有序,那么zookeeper在生成子节点时会根据当前的子节点数量自动添加整数序号

    也就是说,如果是第一个创建的子节点,那么生成的子节点为/lock/node-0000000000,下一个节点则为/lock/node-0000000001,依次类推。

    • 临时节点:

    客户端可以建立一个临时节点,在会话结束或者会话超时后,zookeeper会自动删除该节点。

    • 事件监听:

    在读取数据时,我们可以同时对节点设置事件监听,当节点数据或结构变化时,zookeeper会通知客户端。当前zookeeper有如下四种事件:

    1. 节点创建
    2. 节点删除
    3. 节点数据修改
    4. 子节点变更

    基于以上的一些zk的特性,我们很容易得出使用zk实现分布式锁的落地方案:

    • 使用zk的临时节点和有序节点,每个线程获取锁就是在zk创建一个临时有序的节点,比如在/lock/目录下。
    • 创建节点成功后,获取/lock目录下的所有临时节点,再判断当前线程创建的节点是否是所有的节点的序号最小的节点
    • 如果当前线程创建的节点是所有节点序号最小的节点,则认为获取锁成功。
    • 如果当前线程创建的节点不是所有节点序号最小的节点,则对节点序号的前一个节点添加一个事件监听。

    比如当前线程获取到的节点序号为/lock/003,然后所有的节点列表为[/lock/001,/lock/002,/lock/003],则对/lock/002这个节点添加一个事件监听器。

    如果锁释放了,会唤醒下一个序号的节点,然后重新执行第3步,判断是否自己的节点序号是最小

    比如/lock/001释放了,/lock/002监听到时间,此时节点集合为[/lock/002,/lock/003],则/lock/002为最小序号节点,获取到锁。

    整个过程如下:

    在这里插入图片描述
    具体的实现思路就是这样,至于代码怎么写,这里比较复杂就不贴出来了。

    Curator介绍
    Curator是一个zookeeper的开源客户端,也提供了分布式锁的实现。

    他的使用方式也比较简单:

    InterProcessMutex interProcessMutex = new InterProcessMutex(client,"/anyLock");
    interProcessMutex.acquire();
    interProcessMutex.release();
    

    其实现分布式锁的核心源码如下:

    private boolean internalLockLoop(long startMillis, Long millisToWait, String ourPath) throws Exception
    {
        boolean  haveTheLock = false;
        boolean  doDelete = false;
        try {
            if ( revocable.get() != null ) {
                client.getData().usingWatcher(revocableWatcher).forPath(ourPath);
            }
    
            while ( (client.getState() == CuratorFrameworkState.STARTED) && !haveTheLock ) {
                // 获取当前所有节点排序后的集合
                List<String>        children = getSortedChildren();
                // 获取当前节点的名称
                String              sequenceNodeName = ourPath.substring(basePath.length() + 1); // +1 to include the slash
                // 判断当前节点是否是最小的节点
                PredicateResults    predicateResults = driver.getsTheLock(client, children, sequenceNodeName, maxLeases);
                if ( predicateResults.getsTheLock() ) {
                    // 获取到锁
                    haveTheLock = true;
                } else {
                    // 没获取到锁,对当前节点的上一个节点注册一个监听器
                    String  previousSequencePath = basePath + "/" + predicateResults.getPathToWatch();
                    synchronized(this){
                        Stat stat = client.checkExists().usingWatcher(watcher).forPath(previousSequencePath);
                        if ( stat != null ){
                            if ( millisToWait != null ){
                                millisToWait -= (System.currentTimeMillis() - startMillis);
                                startMillis = System.currentTimeMillis();
                                if ( millisToWait <= 0 ){
                                    doDelete = true;    // timed out - delete our node
                                    break;
                                }
                                wait(millisToWait);
                            }else{
                                wait();
                            }
                        }
                    }
                    // else it may have been deleted (i.e. lock released). Try to acquire again
                }
            }
        }
        catch ( Exception e ) {
            doDelete = true;
            throw e;
        } finally{
            if ( doDelete ){
                deleteOurPath(ourPath);
            }
        }
        return haveTheLock;
    }
    

    其实curator实现分布式锁的底层原理和上面分析的是差不多的。这里我们用一张图详细描述其原理:

    在这里插入图片描述
    小结:

    本节介绍了zookeeperr实现分布式锁的方案以及zk的开源客户端的基本使用,简要的介绍了其实现原理。相关可以参考:肝一下ZooKeeper实现分布式锁的方案,附带实例!

    与Redis分布式锁方案的优缺点比较

    学完了两种分布式锁的实现方案之后,本节需要讨论的是redis和zk的实现方案中各自的优缺点。

    对于redis的分布式锁而言,它有以下缺点:

    • 它获取锁的方式简单粗暴,获取不到锁直接不断尝试获取锁,比较消耗性能。
    • 另外来说的话,redis的设计定位决定了它的数据并不是强一致性的,在某些极端情况下,可能会出现问题。锁的模型不够健壮
    • 即便使用redlock算法来实现,在某些复杂场景下,也无法保证其实现100%没有问题,关于redlock的讨论可以看How to do distributed locking
    • redis分布式锁,其实需要自己不断去尝试获取锁,比较消耗性能。

    但是另一方面使用redis实现分布式锁在很多企业中非常常见,而且大部分情况下都不会遇到所谓的“极端复杂场景”

    所以使用redis作为分布式锁也不失为一种好的方案,最重要的一点是redis的性能很高,可以支撑高并发的获取、释放锁操作。

    对于zk分布式锁而言:

    • zookeeper天生设计定位就是分布式协调,强一致性。锁的模型健壮、简单易用、适合做分布式锁。
    • 如果获取不到锁,只需要添加一个监听器就可以了,不用一直轮询,性能消耗较小。

    但是zk也有其缺点:如果有较多的客户端频繁的申请加锁、释放锁,对于zk集群的压力会比较大。

    写在最后

    通过前面的分析,实现分布式锁的两种常见方案:redis和zookeeper,他们各有千秋。应该如何选型呢?

    就个人而言的话,我比较推崇zk实现的锁:

    因为redis是有可能存在隐患的,可能会导致数据不对的情况。但是,怎么选用要看具体在公司的场景了。

    如果公司里面有zk集群条件,优先选用zk实现,但是如果说公司里面只有redis集群,没有条件搭建zk集群。

    那么其实用redis来实现也可以,另外还可能是系统设计者考虑到了系统已经有redis,但是又不希望再次引入一些外部依赖的情况下,可以选用redis。

    这个是要系统设计者基于架构的考虑了

    展开全文
  • 大量使用流程图表示程序执行过程,使用结构图表示程序内部状态 每章最后都给出了典型练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 Java语言基本语法 第1章 让自己第一个Java程序跑...
  • 在Qt Creator 的安装目录的qt 文件下的bin 文件夹下(我安装在了D 盘, 所以路径是D:\Qt\2009.04\qt\bin),可以找到所有的相关.dll 文件。在这里 找到mingwm10.dll 文件,将其复制到C:\WINDOWS\system 文件夹下,...
  • 大量使用流程图表示程序执行过程,使用结构图表示程序内部状态 每章最后都给出了典型练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 Java语言基本语法 第1章 让自己第一个Java程序跑...
  • 大量使用流程图表示程序执行过程,使用结构图表示程序内部状态 每章最后都给出了典型练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 Java语言基本语法 第1章 让自己第一个Java程序跑...
  • 开发时候需要用的模块,但是项目跑起来后就不需要了</li></ul> 代码检查 项目使用现在比较流行 <code>ESLint</code> 作为代码检查工具,并使用 <code>Airbnb</code> 检查规则。 <p>ESLint:...
  • html入门到放弃笔记

    2018-05-15 15:06:12
    3、父目录,先返回 3、根相对路径 路径形式是以 / 作为开始。 / : 表示的是服务器根路径 2、图像 1、图像格式 WEB中支持图像格式 1、*.jpg 2、*.gif(动图) 3、*.png(透明) 2、图像语法 标记: ...
  • 用户可选择d m e ,然后if语句将作出判断,d表示执行标号为defrag程序段,m表示执行标号为mem程序段,e表示执行标号为end程序段,每个程序段最后都以goto end将程序跳到end标号处,然后程序将显示good bye,...
  •  如果不带任何参数,chkdsk 将显示当前驱动器中磁盘状态。 drive: 指定要 chkdsk 检查驱动器。 /p 即使驱动器不在 chkdsk 检查范围内,也执行彻底检查。该参数不对驱动器做任何更改。 /r 找到坏扇区并...
  • java 面试题 总结

    2009-09-16 08:45:34
    抽象就是忽略一个主题中与当前目标无关那些方面,以便更充分地注意与当前目标有关方面。抽象并不打算了解全部问题,而只是选择其中一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。...
  • 在不同系统中thread_t这个类型有不同实现,它可能是一个整数值,也可能是一个结构体,也可能是一个地址,所以不能简单地当成整数printf打印,调用pthread_self(3)可以获得当前线程id。 attr参数表示线程属性...
  • JAVA面试题最全集

    2010-03-13 13:09:10
    多线程,用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用? 59.使用socket建立客户端与服务器通信过程 60.JAVA语言国际化应用,Locale类,Unicode 61.描述反射机制作用 62.如何读写一个...
  • 基于cocos creatorUI框架, 当前使用cocos creator版本2.4.3版本 中心思想, 将所有UI窗体分为4类管理(screen窗体, 固定窗体, 弹出窗体, 独立窗体), 再将窗体制作成预制体, 动态加载与释放; 使用UIManager....
  • asp.net知识库

    2015-06-18 08:45:45
    一完美关于请求的目录不存在而需要url重写解决方案! 在C#中实现MSN消息框功能 XmlHttp实现无刷新三联动ListBox 鼠标放在一个连接上,会显示图片(类似tooltip) 使用microsoft.web.ui.webcontrolsTabStrip与...
  • C++MFC教程

    热门讨论 2013-05-21 13:37:15
    而32位系统中每一运行程序都会有一个消息队列,所以系统可以在多个消息队列中转换而不必等待当前程序完成消息处理就可以得到控制权。这种多任务系统就称为抢先式多任务系统。Windows95/NT就是这种系统。 1.3 ...
  • 你就可以根据这个 JavaScript 对象表示的树结构来构建一棵真正DOM树。 之前章节所说,状态变更->重新渲染整个视图方式可以稍微修改一下: JavaScript 对象表示 DOM 信息和结构,当...
  • 如果想自定义模型新增/编辑前端模板,只需在app/resources/views/admin/content目录下创建模板文件即可。模板文件命名需遵循如下命名规则:模型名_add.blade.php。例如User模型对应模板文件名为user_add.blade...
  • 乐优商城.xmind

    2019-03-31 17:26:39
    表示给参数命名,名称就是括号中内容 name 命名为aa,然后sql语句....where s_name= #{aa} 中就可以根据aa得到参数值 修改 回显 Controller @PathVariable("bid") 通过 @PathVariable 可以将 URL 中占位符...
  • 2009达内SQL学习笔记

    2010-02-10 19:46:58
    ORDER BY子句中使用列将是为显示所选择列,但是实际上并不一定要这样,非检索列排序数据是完全合法。 为了按多个列排序,列名之间逗号分开。 2、支持按相对列位置进行排序。 输入 SELECT prod_id,...
  • powerbuilder

    2013-11-21 17:11:48
    参数printjobnumber:PrintOpen()函数打开打印作业号fontnumber:指定赋给当前定义字体编号,有效值在1到8之间 facename:string类型,指定字体名称,该字体应该是你打印机支持字体,比如“宋体”height:...
  • 用的比较多方法有exec用于捕获包含第一个匹配项数组,没有则返回null。test,用于判断,如果匹配返回true,不匹配返回false。 <p><strong>处理字符串</strong></p> 在Js中还有一种...
  • 2.1 为什么是c++ 19 2.2 程序设计范型 19 2.3 过程式程序设计 20 2.3.1 变量和算术 21 2.3.2 检测和循环 22 2.3.3 指针和数组 23 2.4 模块程序设计 23 2.4.1 分别编译 24 2.4.2 异常处理 25 2.5 数据抽象 ...
  • 2.1 为什么是c++ 19 2.2 程序设计范型 19 2.3 过程式程序设计 20 2.3.1 变量和算术 21 2.3.2 检测和循环 22 2.3.3 指针和数组 23 2.4 模块程序设计 23 2.4.1 分别编译 24 2.4.2 异常处理 25 2.5 数据抽象 ...
  • C++程序设计语言(特别版)--源代码

    热门讨论 2012-04-23 07:33:51
    2.1 为什么是c++ 19 2.2 程序设计范型 19 2.3 过程式程序设计 20 2.3.1 变量和算术 21 2.3.2 检测和循环 22 2.3.3 指针和数组 23 2.4 模块程序设计 23 2.4.1 分别编译 24 2.4.2 异常处理 25 2.5 数据抽象 ...
  • 传递给函数值一般 "this" 值,如果这个参数为空, "undefined" 会传递给 "this" 值。 </li><li> <p>every(fn(currentValue, index, arr), thisValue) <p><strong>every方法...
  • 双击摄像机节点自动播放视频,双击节点自动依次添加视频,会自动跳到下一个,双击节点自动添加该节点下所有视频。 摄像机节点拖曳到对应窗体播放视频,同时支持拖曳本地文件直接播放。 视频画面窗体支持拖曳交换...

空空如也

空空如也

1 2
收藏数 29
精华内容 11
关键字:

当前目录的父目录用什么表示