背景知识

为了更好说明neo4j集群中的读写及其一致性行为,有必要先对neo4j的部署模式,驱动,会话,事务等概念做下基本介绍。

neo4j部署模式

neo4j有3种部署模式,分别叫stand-alone instance(单机模式),HA cluster(高可用模式)和causal cluster(因果集群模式,本文简称为集群模式)。单机模式用于neo4j开源版本,后2种模式仅在neo4j企业版能够使用,高可用模式在neo4j早期版本上使用,新的neo4j企业版采用更加强大的集群模式。通过neo4j的配置项dbms.mode可以设置节点的角色:

  • 单机模式:节点角色为SINGLE
  • 高可用模式:节点角色可为HA或ARBITER,ARBITER表示没有数据的节点;
  • 集群模式:节点角色可为CORE或READ_REPLICA。

集群模式

causal cluster集群的示意图如下所示:

图中间是由3个CORE节点构成的核心读写集群,使用raft协议进行数据一致性保障,会自动选择一个节点作为LEADER提供读写服务,其余节点作为FOLLOWER节点复制LEADER推送的raft日志;如果LEADER节点由于网络隔离或crash而无法正常服务,FOLLOWER节点会进行重新选择一个新的LEADER节点。为了提高集群稳定性,减少不必要的选主操作,选主会分为2个阶段:预选和正式选举。如果在预选时没有得到足够多的节点回复,就不会发起正式选举(与MongoDB类似)。

外围一圈为只读集群,节点角色均为READ_REPLICA,提供查询、报表和分析等只读服务。只读节点异步复制CORE节点的事务日志进行数据catchup。

BOLT驱动

neo4j提供了强大的客户端驱动,能够自动处理LEADER节点变更,基于负载进行请求路由,用户还可以根据业务需求来自定义路由策略,非常灵活。

BOLT驱动有2种使用模式,分别是bolt和bolt+routing。前者一般用于单机部署模式,或者想直连集群下的某个特定节点;后者是连接到整个集群上。连接URI如下所示:

jdbc:neo4j:bolt://host:port/?username=neo4j,password=xxxx
jdbc:neo4j:bolt+routing://host1:port1,host2:port2,…,hostN:portN/?username=neo4j,password=xxxx

host1:port1,host2:port2,…,hostN:portN为需要连接的集群的成员列表,可包括CORE和READ_REPLICA节点。 在集群模式下,建议使用bolt+routing连接方式。通过自动切换到新的LEADER节点来提高业务的服务可用性,通过将请求路由到不同的节点实现集群的负载均衡。需要注意的是,如果没有设置读写模式(Access Mode)为read,请求会默认路由到CORE节点。 bolt+routing另一个强大的功能是支持自定义policy,也就是说业务端可以自定义路由规则,可以做到某个请求发送到集群的特定节点上执行。在此不展开描述,可点击了解更多信息。

会话与事务

在neo4j中,会话(Session)可以理解为连接,在会话中执行一个或多个事务。会话从驱动的连接池中获取连接,在关闭时将连接返给连接池。 neo4j中的事务有3种表现形式:

  1. 自动提交事务
  2. 事务函数
  3. 显式事务

自动提交事务(Auto-commit Transactions)

与MySQL等关系型数据库类似,该类型事务仅有一条cypher语句组成,无法自动重试。直接执行方式是session.run(),没有创建事务对象。如下所示:

public void addPerson( String name )
{try ( Session session = driver.session() ){session.run( "CREATE (a:Person {name: $name})", parameters( "name", name ) );}
}

neo4j不推荐在生产环境中使用自动提交事务,理由是非性能最佳的事务执行方式,主要是从网络数据包交互角度出发的。笔者认为,自动提交事务还是有特定的应用场景的。

事务函数

这是neo4j特有的事务形式,形如:

public void addPerson( final String name )
{try ( Session session = driver.session() ){session.writeTransaction( new TransactionWork<Integer>(){@Overridepublic Integer execute( Transaction tx ){return createPersonNode( tx, name );}} );}
}private static int createPersonNode( Transaction tx, String name )
{tx.run( "CREATE (a:Person {name: $name})", parameters( "name", name ) );return 1;
}

在函数中创建session,然后基于该session产生一个事务对象,再重载事务的execute方法,通过调用Transaction.run方式来执行cypher语句。

这是neo4j推荐的事务执行方式,用尽可能少的框架代码来将数据库事务和其他业务逻辑相隔离,具备事务重试能力。

显式事务

显然,该事务类型就是显式调用BEGIN、COMMIT/ROLLBACK来开始、提交或回滚事务。具体例子在下节给出。

读写模式(Access Mode)

类似于MySQL中的只读事务和读写事务。但不同的是,neo4j中可以在会话/连接级别进行设置。

try  (Connection connection = DriverManager.getConnection(connectionUrl, "neo4j", password)) {connection.setAutoCommit(false);// Access to CORE nodes, as the connection is opened by default in write modetry (Statement statement = connection.createStatement()) {statement.execute("create (:Neo4JTest { protocol: 'BOLT+ROUTING' })");}// closing transaction before changing access modeconnection.commit();// Switching to read-only mode to access READ REPLICA nodesconnection.setReadOnly(true);try (Statement statement = connection.createStatement()) {try (ResultSet resultSet = statement.executeQuery("match (t:Neo4JTest) return count(t) as tot")) {if (resultSet.next()) {Long tot = resultSet.getLong("tot");}}}connection.commit();
}

上面的例子中涉及到了显式事务和读写设置。通过connection.setAutoCommit(false)开始了显式事务,connection.commit()进行事务提交。connection.setReadOnly(true)将事务设置为只读模式。 下面的例子是在事务函数中进行读写事务设置:

public long addPerson( final String name )
{try ( Session session = driver.session() ){session.writeTransaction( new TransactionWork<Void>(){@Overridepublic Void execute( Transaction tx ){return createPersonNode( tx, name );}} );return session.readTransaction( new TransactionWork<Long>(){@Overridepublic Long execute( Transaction tx ){return matchPersonNode( tx, name );}} );}
}private static Void createPersonNode( Transaction tx, String name )
{tx.run( "CREATE (a:Person {name: $name})", parameters( "name", name ) );return null;
}private static long matchPersonNode( Transaction tx, String name )
{StatementResult result = tx.run( "MATCH (a:Person {name: $name}) RETURN id(a)", parameters( "name", name ) );return result.single().get( 0 ).asLong();
}

在addPerson的事务函数中,分别包括一个写和读事务:创建一条标签为Person的节点,其name属性为输入的name字符串;然后使用读事务获取其id。

因果关系链(Causal chaining)

所谓因果关系链,指的是因果一致性,即用户应该能够读取到其之前写入数据库的数据。对于单机模式的数据库,因果一致性总能保证的,只需要确保写入数据的事务已提交,使用当前读(与快照读相对应)。但在集群模式下,因果一致性就不是自然而然的事情了。比如,用户在LEADER节点插入了一个节点,是否可以在某一只读节点读到该边呢?由于读写操作跨了neo4j进程,而且只读节点与核心节点的复制是异步的,显然可能存在数据延迟情况。

那么neo4j的集群模式是否能够保证因果一致性呢,以及如何保证的呢?答案是肯定的。neo4j能够实现任意2个事务的因果一致性,即使事务执行时跨节点的。

When working with a Causal Cluster, transactions can be chained to ensure causal consistency. This means that for any two transactions, it is guaranteed that the second transaction will begin only after the first has been successfully committed. This is true even if the transactions are carried out on different physical cluster members.

neo4j中的因果关系链包括2个层面,在一个会话中的多个事务,neo4j自动保证了因果一致性,无需用户额外编程保障。因此,如果用户执行多个相互间没有关联的事务,可以将这些事务放在不同的会话中以减小不必要的延迟;对于会话间的事务,需要在代码中增加对应的处理。

基于书签(bookmarks)的因果一致性实现

在这里,书签是什么意思呢,从字面理解,书签应该是标记了书中的某个位置。对应到数据库中,书签的意思有点像MySQL中的gtid_executed,即下图的Executed_Gtid_Set。

MySQL [performance_schema]> show master status\G
*************************** 1. row ***************************File: mysql-bin.000117Position: 422155199Binlog_Do_DB: Binlog_Ignore_DB: 
Executed_Gtid_Set: 03a6a5c8-7ebc-11e8-ba8e-fa163e132314:1-208233098
1 row in set (0.00 sec)MySQL [performance_schema]>

在MySQL中,每个事务有个gtid,由server_uuid和transaction_id组成,形式上为server_uuid:transaction_id,本例中server_uuid为03a6a5c8-7ebc-11e8-ba8e-fa163e132314,该mysql实例已经执行的transaction_id从1开始连续到208233098。可以用gtid_executed来唯一确定一个事务在该MySQL实例中的次序。显然,如果A的事务执行后对应的gtid_executed为03a6a5c8-7ebc-11e8-ba8e-fa163e132314:1-100,那么后续执行的B事务,如果想读取到A事务提交的数据,那么只需要等待执行B事务对应的MySQL实例的Executed_Gtid_Set是03a6a5c8-7ebc-11e8-ba8e-fa163e132314:1-100的超集就行了。 在neo4j中,书签的意思正式如此,下面用具体的例子来进行说明。我们先看一个图:

该图比较直观得说明了书签在会话中和会话间的作用方式。在图中3个会话中,每个会话都有2个事务,书签在事务间自动传递。而如果要将会话A和B的书签传递给C,那么就需要在代码中显式获取并作为输入参数传递给C。下面的例子与上图相对应:

// Create a company node
private StatementResult addCompany( final Transaction tx, final String name )
{return tx.run( "CREATE (:Company {name: $name})", parameters( "name", name ) );
}// Create a person node
private StatementResult addPerson( final Transaction tx, final String name )
{return tx.run( "CREATE (:Person {name: $name})", parameters( "name", name ) );
}// Create an employment relationship to a pre-existing company node.
// This relies on the person first having been created.
private StatementResult employ( final Transaction tx, final String person, final String company )
{return tx.run( "MATCH (person:Person {name: $person_name}) " +"MATCH (company:Company {name: $company_name}) " +"CREATE (person)-[:WORKS_FOR]->(company)",parameters( "person_name", person, "company_name", company ) );
}// Create a friendship between two people.
private StatementResult makeFriends( final Transaction tx, final String person1, final String person2 )
{return tx.run( "MATCH (a:Person {name: $person_1}) " +"MATCH (b:Person {name: $person_2}) " +"MERGE (a)-[:KNOWS]->(b)",parameters( "person_1", person1, "person_2", person2 ) );
}// Match and display all friendships.
private StatementResult printFriends( final Transaction tx )
{StatementResult result = tx.run( "MATCH (a)-[:KNOWS]->(b) RETURN a.name, b.name" );while ( result.hasNext() ){Record record = result.next();System.out.println( String.format( "%s knows %s", record.get( "a.name" ).asString(), record.get( "b.name" ).toString() ) );}return result;
}public void addEmployAndMakeFriends()
{// To collect the session bookmarksList<String> savedBookmarks = new ArrayList<>();// Create the first person and employment relationship.try ( Session session1 = driver.session( AccessMode.WRITE ) ){session1.writeTransaction( tx -> addCompany( tx, "Wayne Enterprises" ) );session1.writeTransaction( tx -> addPerson( tx, "Alice" ) );session1.writeTransaction( tx -> employ( tx, "Alice", "Wayne Enterprises" ) );savedBookmarks.add( session1.lastBookmark() );}// Create the second person and employment relationship.try ( Session session2 = driver.session( AccessMode.WRITE ) ){session2.writeTransaction( tx -> addCompany( tx, "LexCorp" ) );session2.writeTransaction( tx -> addPerson( tx, "Bob" ) );session2.writeTransaction( tx -> employ( tx, "Bob", "LexCorp" ) );savedBookmarks.add( session2.lastBookmark() );}// Create a friendship between the two people created above.try ( Session session3 = driver.session( AccessMode.WRITE, savedBookmarks ) ){session3.writeTransaction( tx -> makeFriends( tx, "Alice", "Bob" ) );session3.readTransaction( this::printFriends );}
}

该例子仍使用事务函数。主函数为addEmployAndMakeFriends(),在函数中创建了3个session,分别为session1,session2和session3,3个会话均设置读写模式为AccessMode.WRITE。session1和session2分别通过3个事务建立一对员工和公司的雇佣关系(Alice受雇于Wayne Enterprises,Bob受雇于LexCorp);可以看到在创建员工和公司的事务后,建立雇佣关系的事务没有书签相关代码,这是因为在会话内部自动传递了事务书签,在建立雇佣关系时会自动等到对应neo4j节点执行完员工和公司2个事务后才开始。 而在另一个会话session3对session1和session2创建的Alice和Bob建立朋友关系时,处理就不一样了。这是由于跨了会话,事务书签无法自动传递,需要在session3会话产生是显式传入所需的书签参数,即下例中的savedBookmarks:

Session session3 = driver.session( AccessMode.WRITE, savedBookmarks )

savedBookmarks保存了session1和session2的3个事务执行后的书签:

savedBookmarks.add( session1.lastBookmark() );
savedBookmarks.add( session2.lastBookmark() );

因此,可以确保session3在创建2个人的朋友关系前会等待session1和session2中的事务均已在对应的neo4j节点上成功提交。

小结

本文简要介绍了neo4j集群中与读写相关的事务,会话和用于请求路由的驱动等基础,在此基础上提出了有依赖关系的事务之间因果一致性问题,最后分析neo4j集群如何在跨物理节点的场景下实现因果一致性。并用实例进行了说明。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 【Redis】Linux 配置 Redis 自用整理

    redis 设置外网可访问/sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT/etc/rc.d/init.d/iptables save更改redis.conf 文件bind 127.0.0.1protected-mode yes 更改为# bind 127.0.0.1protected-mode no设置密码requirepass yourpassword重启redis...

    2024/5/2 9:12:24
  2. 不枯燥,绝对一看就懂的神经网络入门文章,强烈推荐

    神经网络是一门重要的机器学习技术。它是目前最为火热的研究方向--深度学习的基础。学习神经网络不仅可以让你掌握一门强大的机器学习方法,同时也可以更好地帮助你理解深度学习技术。本文以一种简单的,循序的方式讲解神经网络。适合对神经网络了解不多的同学。本文对阅读没有…...

    2024/4/30 14:10:38
  3. Spring5.3.x源码编译

    Spring源码编译 工具版本Idea 2020.1.1 JDK1.8_201 Gradle5.3Spring版本Spring 5.3.0-SNAPSHOTGradle下载Gradle官方下载地址Spring官网Spring官方文档Spring源码下载GitHub同性交友平台下载: 仓库地址 Spring官方编译文档:文档地址配置GradleGradle user home: 选择Gradle的…...

    2024/4/9 19:04:06
  4. 直播软件源码小程序循环列表,点击展开收起/关闭效果

    循环列表,点击展开,再次点击关闭 html部分 <view class="listMain"><view class="list" wx:for="{{list}}" wx:key="index"><view class="title">{{item.title}}</view><view class="des…...

    2024/4/26 16:42:48
  5. 秋招面试总结:Java+并发+Spring+MySQL+分布式+Redis+算法+JVM等,太香了~

    轰轰烈烈的“金九银十”秋招季已经落幕,有人欢喜有人愁,不管你是喜是忧,学习总归是好的。这不,小编特地整理了一下秋招面试知识点+答案(JAVA岗),一起分享出来给大家看看~第一部分 Java相关1.1 JAVA基础面向对象和面向过程的区别Java 语言有哪些特点关于 JVM JDK 和 JRE …...

    2024/4/26 16:42:46
  6. Git基础学习

    Git与Github基础学习笔记 1.基础操作 1.1、基础命令git init //初始化本地git仓库 git add //添加文件 git status //查看状态 git commit //提交 git push //推送到仓库 git pull //从远程仓库拉取数据 git clone //从远程仓库拷贝数据1.2、操作 1.2.1、当然…...

    2024/4/30 18:00:12
  7. Fabric1.4.1单机版环境搭建(first-network)

    安装软件更新源sudo apt-get update安装Gocd /usr/local上传go的压缩包sudo rz解压压缩包sudo tar -zxf go1.14.4.linux-amd64.tar.gz配置环境vim ~/.bashrcexport GOROOT=/usr/local/goexport GOPATH=/opt/gopathexport PATH=$PATH:$GOROOT/bin/:$GOPATH/binsource ~/.bashrc…...

    2024/4/26 4:49:45
  8. 织梦网站发布方法(个人经历)

    基于织梦进行网站发布 ** 第一步: 去网站所在的空间(服务器)把要发布网站的模板打包下来,然后复制到新解析的域名下 第二步: 把要发布网站的数据库导出(在导出的sql语句里找到数据库的名字全部提换成新数据库的名字),然后导入到新域名下的数据库 第三步: 在服务器下的…...

    2024/4/9 19:04:00
  9. HBASE 链接工具类,以及基本table操作和实体cover工具类

    HBASE 链接工具类,以及基本table操作和实体cover工具类 hbaseUtils package com.feifan.data.utils;import com.feifan.data.model.CrawlerHbase; import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbas…...

    2024/4/26 19:35:19
  10. 常见的Java性能问题,手把手教你定位!

    概述性能优化一向是后端服务优化的重点,但是线上性能故障问题不是经常出现,或者受限于业务产品,根本就没办法出现性能问题,包括笔者自己遇到的性能问题也不多,所以为了提前储备知识,当出现问题的时候不会手忙脚乱,我们本篇文章来模拟下常见的几个Java性能故障,来学习怎…...

    2024/4/16 22:01:47
  11. Snake-in-a-Plane 代码解析实现;Snake(activate contour model) 边界分割python实现

    snake_demo.py 定义 def mask_to_boundary_pts(mask, pt_spacing=10): 函数,用来从mask图片中提取边界点 def mask_to_boundary_pts(mask, pt_spacing=10):boundary_pts = measure.find_contours(mask, 0)[0]tck, u = splprep(boundary_pts.T, u=None, s=0.0, per=1)u_new = n…...

    2024/4/23 9:12:31
  12. Android studio 签名 报错:Could not download groovy-all.jar (org.codehaus.groovy:groovy-all:2.4.12)

    在app的build.gradle中的android部分添加如下代码块即可 lintOptions {checkReleaseBuilds falseabortOnError false}...

    2024/4/20 23:52:43
  13. Educational Codeforces Round 91 (Rated for Div. 2)题解

    A. Three Indices 题目链接https://codeforces.com/contest/1380/problem/A思路直接遍历数组找到一个值比它左右的值都大的即可 原因:如果该值存在,则该点必定为最大值,左右的值至少有一个比它小代码 #include<cstdio> #include<iostream> #include<math.h&g…...

    2024/4/29 8:23:32
  14. 批量!使用ArcGIS python 批量修改遥感影像名

    正所谓“名不正言不顺”,名字是一个数据和一个传感器的标记,始终和数据、传感器荣辱与共,伴随着着它短暂的一生。起名字本来是很开心的一件事情,比如翠花、二狗等耳熟能详的名字为我们生活平添了几分乐趣。但也有一些大佬为了显示自己有文化,把很多的信息放入文件名中完全…...

    2024/4/28 20:34:22
  15. SetWindowPos - 改变窗口的位置与状态

    //声明: SetWindowPos(hWnd: HWND; {窗口句柄}hWndInsertAfter: HWND; {窗口的 Z 顺序}X, Y: Integer; {位置}cx, cy: Integer; {大小}uFlags: UINT {选项} ): BOOL;//hWndInsertAfter 参数可选值: HWND_TOP = 0; {在前面} HW…...

    2024/4/26 14:52:02
  16. 数组方法

    数组Arr的增,删,改,截,拼,复,排,转//1.arr.splice(start,length,元素1,元素2,元素3...)改变原数组,第二个长度代表返回数组的长度,截取从start开始length个元素从arr中提出。var arr = [1,2,3,4];var a=arr.splice(1,2,[1,2,3,4],5)console.log(a);//2,3console.log(…...

    2024/4/27 22:45:40
  17. 企业何如选择固定资产管理系统

    2020年已经过半,今年对于大多数企业来说都是不平常的一年。有许多企业的业务受阻,甚至生存都出现危机。今年,企业主正好可以放慢前行的脚步去完善今后的战略规划,以寻求内在发展动力。 此次疫情催化了行业的重新洗牌。企业在成长过程中,危机和机遇其实一直都并存。无论能否…...

    2024/4/9 18:52:22
  18. 软件公司与非软件公司区别(纯个人看法)

    工作八年多了,走过好多公司,现在已经过了三十,不想再这么奔波,这几天由于领导对我的评价,对自己产生了一系列怀疑,是自己能力不行?还是自己态度不行?还是自己工作方式不对?等等很多。这个年纪已经不再是年少轻狂的年纪了。 (技术公司) 再此之前一直在软件公司工作,…...

    2024/4/27 3:31:19
  19. web安全攻防笔记三:sqlmap工具

    文章目录sqlmap工具一、sqlmap的介绍二、sqlmap的特点三、测试环境配置和下载四、常用指令 sqlmap工具 一、sqlmap的介绍sqlmap是一个工具,一个用来做sql注入攻击的工具,它是一个开源的渗透工具 它可以自动化检测和利用SQL注入缺陷以及接管数据库服务器的过程 所谓的SQL注入,…...

    2024/4/25 7:49:11
  20. 软考必须从初级开始考吗?

    有去了解过软考的应该都知道,软考是分为5个专业,3个层次级别共20个资格考试。3个层次级别就是初级、中级和高级。 那么问题来了,软考必须得从初级开始考吗? 这里告诉大家,不是必须的。软考的报考是没有学历,年龄等等限制,并且报考资格考试时,是可以任意选择一个报考。 …...

    2024/4/25 9:44:21

最新文章

  1. aardio封装库) 微软开源的js引擎(ChakraCore)

    前言 做爬虫肯定少不了JavaScript引擎的使用&#xff0c;比如在Python中现在一般用pyexecjs2来执行JavaScript代码&#xff0c;另外还有一些其他执行JavaScript的库&#xff1a; https://github.com/eight04/node_vm2: rpc调用nodejs&#xff0c;需要安装nodehttps://github.…...

    2024/5/2 9:28:40
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 从头开发一个RISC-V的操作系统(二)RISC-V 指令集架构介绍

    文章目录 前提ISA的基本介绍ISA是什么CISC vs RISCISA的宽度 RISC-V指令集RISC-V ISA的命名规范模块化的ISA通用寄存器Hart特权级别内存管理与保护异常和中断 目标&#xff1a;通过这一个系列课程的学习&#xff0c;开发出一个简易的在RISC-V指令集架构上运行的操作系统。 前提…...

    2024/5/1 12:59:53
  4. 第十一届蓝桥杯物联网试题(省赛)

    对于通信方面&#xff0c;还是终端A、B都保持接收状态&#xff0c;当要发送的数组不为空再发送数据&#xff0c;发送完后立即清除&#xff0c;接收数据的数组不为空则处理&#xff0c;处理完后立即清除&#xff0c;分工明确 继电器不亮一般可能是电压不够 将数据加空格再加\r…...

    2024/5/1 13:34:09
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/1 10:25:26
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/1 13:20:04
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/1 21:18:12
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/1 4:07:45
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/4/30 23:32:22
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/2 6:03:07
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/1 6:35:25
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/1 11:24:00
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/2 5:31:39
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/1 20:22:59
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/4/30 22:14:26
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/1 6:34:45
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/2 0:07:22
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/2 8:37:00
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/1 4:45:02
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/1 8:32:56
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/1 14:33:22
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/1 11:51:23
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/2 7:30:11
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/1 20:56:20
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57