Elasticsearch:Index alias

现在让我们来谈谈 Elasticsearch 最简单和最有用的功能之一:别名 (alias)。为了区分这里 alias 和文章 “Elasticsearch : alias 数据类型”,这里的别名(alias)指的是 index 的别名。 别名正是他们听起来的样子; 它们是你可以使用的指针或名称,对应于一个或多个具体索引。 事实证明这非常有用,因为它在扩展集群和管理数据在索引中的布局方式时提供了灵活性。 即使使用 Elasticsearch 只有一个索引的集群,使用别名。 

别名到底是什么?

你可能想知道别名究竟是什么,以及 Elasticsearch 在创建别名时涉及何种开销。 别名将其生命置于群集状态内,由主节点(master node) 管理; 这意味着如果你有一个名为 idaho 的别名指向一个名为 potato 的索引,那么开销就是群集状态映射中的一个额外键,它将名称 idaho 映射到具体的索引字符串。 这意味着与其他指数相比,别名的重量要轻得多; 可以维护数千个而不会对集群产生负面影响。 也就是说,我们会警告不要创建数十万或数百万个别名,因为在这一点上,即使映射中单个条目的最小开销也会导致集群状态增长到大小。 这意味着创建新群集状态的操作将花费更长时间,因为每次更改时都会将整个群集状态发送到每个节点。

为什么别名是有用的?

我们建议每个人都为他们的 Elasticsearch 索引使用别名,因为在重新索引时,它将在未来提供更大的灵活性。 假设你首先创建一个包含单个主分片的索引,然后再决定是否需要更多索引容量。 如果你使用原始别名 index,你现在可以将该别名更改为指向另外创建的索引,而无需更改你正在搜索的索引的名称(假设你从头开始使用别名进行搜索)。 另一个有用的功能是可以创建不同索引的窗口; 例如,如果你为数据创建每日索引,则可能需要创建一个名为 last-7-days 的别名的上周数据的滑动窗口; 然后每天创建新的每日索引时,可以将其添加到别名中,同时删除8天的索引。

另外的一种场景是,当我们修改了我们的 index 的 mapping,让后通过 reindex API 来把我们的现有的 index 转移到新的 index 上,那么如果在我们的应用中,我们利用 alias 就可以很方便地做这件事。在我们成功转移到新的 index 之后,我们只需要重新定义我们的 alias 指向新的 index,而在我们的客户端代码中,我们一直使用 alias 来访问我们的 index,这样我们的代码不需要任何的改动。

如上所示,我们可以使用 orders 这个别名来访问上图下面所示的所有索引。

建立 index

为了验证我们的 API,我们先建立一些数据:

PUT twitter/_doc/1
{"user" : "双榆树-张三","message" : "今儿天气不错啊,出去转转去","uid" : 2,"age" : 20,"city" : "北京","province" : "北京","country" : "中国","address" : "中国北京市海淀区","location" : {"lat" : "39.970718","lon" : "116.325747"}
}PUT twitter/_doc/2
{"user" : "东城区-老刘","message" : "出发,下一站云南!","uid" : 3,"age" : 30,"city" : "北京","province" : "北京","country" : "中国","address" : "中国北京市东城区台基厂三条3号","location" : {"lat" : "39.904313","lon" : "116.412754"}
}PUT twitter/_doc/3
{"user" : "虹桥-老吴","message" : "好友来了都今天我生日,好友来了,什么 birthday happy 就成!","uid" : 7,"age" : 90,"city" : "上海","province" : "上海","country" : "中国","address" : "中国上海市闵行区","location" : {"lat" : "31.175927","lon" : "121.383328"}
}

这样,我们建立了三个文档的 twitter 索引。

管理别名

添加一个 index alias

一个 index 别名就是一个用来引用一个或多个已经存在的索引的另外一个名字,我们可以用如下的方法来创建

PUT /twitter/_alias/alias1

请求的格式:

PUT /<index>/_alias/<alias>
POST /<index>/_alias/<alias>
PUT /<index>/_aliases/<alias>
POST /<index>/_aliases/<alias>

路径参数:

<index> : 要添加到别名的索引名称的逗号分隔列表或通配符表达式。
                要将群集中的所有索引添加到别名,请使用_all值。

<alias>:  (必需,字符串)要创建或更新的索引别名的名称。

比如经过上面的 REST 请求,我们为 twitter 创建了另外一个别名 alias1。我们以后可以通过 alias1 来访问这个 index:

GET alias1/_search

显示的结果:

{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 3,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "twitter","_type" : "_doc","_id" : "4","_score" : 1.0,"_source" : {"user" : "朝阳区-老贾","message" : "123,gogogo","uid" : 5,"age" : 35,"city" : "北京","province" : "北京","country" : "中国","address" : "中国北京市朝阳区建国门","location" : {"lat" : "39.718256","lon" : "116.367910"}}},{"_index" : "twitter","_type" : "_doc","_id" : "5","_score" : 1.0,"_source" : {"user" : "朝阳区-老王","message" : "Happy BirthDay My Friend!","uid" : 6,"age" : 50,"city" : "北京","province" : "北京","country" : "中国","address" : "中国北京市朝阳区国贸","location" : {"lat" : "39.918256","lon" : "116.467910"}}},{"_index" : "twitter","_type" : "_doc","_id" : "6","_score" : 1.0,"_source" : {"user" : "虹桥-老吴","message" : "好友来了都今天我生日,好友来了,什么 birthday happy 就成!","uid" : 7,"age" : 90,"city" : "上海","province" : "上海","country" : "中国","address" : "中国上海市闵行区","location" : {"lat" : "31.175927","lon" : "121.383328"}}},...

显然这样做的好处是非常明显的,我们可以把我们想要的进行搜索的 index 取一个和我们搜索方法里一样的别名就可以了,这样我们可以不修改我们的搜索方法,就可以分别对不同的 index 进行搜索。比如我们可以用同样的搜索方法对每天的 log 进行分析。只有把每天的 log 的 index 的名字都改成一样的 alias 就可以了。

创建一个基于城市的alias:

PUT twitter/_alias/city_beijing
{"filter": {"term": {"city": "北京"}}
}

在这里,我们创建了一个名称为 city_beijing 的 alias。如果我们运行如下的搜索:

GET city_beijing/_search

它将返回所有关于城市为北京的搜索结果:

{"took" : 1,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 4,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "twitter","_type" : "_doc","_id" : "4","_score" : 1.0,"_source" : {"user" : "朝阳区-老贾","message" : "123,gogogo","uid" : 5,"age" : 35,"city" : "北京","province" : "北京","country" : "中国","address" : "中国北京市朝阳区建国门","location" : {"lat" : "39.718256","lon" : "116.367910"}}},{"_index" : "twitter","_type" : "_doc","_id" : "5","_score" : 1.0,"_source" : {"user" : "朝阳区-老王","message" : "Happy BirthDay My Friend!","uid" : 6,"age" : 50,"city" : "北京","province" : "北京","country" : "中国","address" : "中国北京市朝阳区国贸","location" : {"lat" : "39.918256","lon" : "116.467910"}
...

在上面,filter 甚至是可以多个查询,比如:

PUT twitter/_alias/city_beijing
{"filter": [{"term": {"city": "北京"}},{"range": {"age": {"lte": 25}}}]
}

当我们做如下查询时:

GET city_beijing/_search

显示的结果为:

{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "twitter","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"user" : "双榆树-张三","message" : "今儿天气不错啊,出去转转去","uid" : 2,"age" : 20,"city" : "北京","province" : "北京","country" : "中国","address" : "中国北京市海淀区","location" : {"lat" : "39.970718","lon" : "116.325747"}}}]}
}

上面显示的结果是 city 为北京,同事 age 小于 25 岁。

alias 也可以在创建 index 时被创建,比如:

DELETE twitterPUT twitter
{"mappings" : {"properties" : {"address" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}},"age" : {"type" : "long"},"city" : {"type" : "keyword","copy_to" : ["region"]},"country" : {"type" : "keyword","copy_to" : ["region"]},"explain" : {"type" : "boolean"},"location" : {"type" : "geo_point"},"message" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}},"province" : {"type" : "keyword","copy_to" : ["region"]},"region" : {"type" : "text"},"uid" : {"type" : "long"},"user" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}}}},"aliases": {"city_beijing": {"filter": {"term": {"city": "北京"}}}}
}

在这里,我们删除了 twitter 索引,同时我们重新定义 twitter 索引的 mapping,并同时定义了 city_beijing 你别名。重新 index 我们上面的三个文档,那么我们再次搜索我们的数据:

GET city_beijing/_search

我们可以看到两个城市为北京的搜索结果:

{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 2,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "twitter","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"user" : "双榆树-张三","message" : "今儿天气不错啊,出去转转去","uid" : 2,"age" : 20,"city" : "北京","province" : "北京","country" : "中国","address" : "中国北京市海淀区","location" : {"lat" : "39.970718","lon" : "116.325747"}}},{"_index" : "twitter","_type" : "_doc","_id" : "2","_score" : 1.0,"_source" : {"user" : "东城区-老刘","message" : "出发,下一站云南!","uid" : 3,"age" : 30,"city" : "北京","province" : "北京","country" : "中国","address" : "中国北京市东城区台基厂三条3号","location" : {"lat" : "39.904313","lon" : "116.412754"}}}]}
}

我们还可以创建一个指向多个索引的别名,如下图图所示,包括使用通配符提供的索引。

以下代码显示了创建别名 (multi_cars_alias) 的代码。 它指向多个索引(cars1、cars2、cars3)。

PUT cars1,cars2,cars3/_alias/multi_cars_alias

上面的索引名称是以逗号分开的列表。

同样,我们也可以使用通配符创建指向多个索引的别名,比如:

PUT cars*/_alias/wildcard_cars_alias

一旦我们为一个索引创建了别名,我们可以直接通过如下的接口来获取它的别名,映射及设置:

GET twitter

获取 alias

我们可以通过如下的 API 来获取当前以及定义好的 alias:

GET /_alias
GET /_alias/<alias>
GET /<index>/_alias/<alias>

比如:

GET /twitter/_alias/alias1

这里获取在 twitter 下的名字叫做 alias1 的别名。针对我们的情况,我们使用如下的接口:

GET /twitter/_alias/city_beijing

我们获取我们之前得到的city_beijing的alias。显示的结果如下:

{"twitter" : {"aliases" : {"city_beijing" : {"filter" : {"term" : {"city" : "北京"}}}}}
}

你也可以通过如下的 wild card 方式来获取所有的 alias:

GET /twitter/_alias/*

比如,我们新增加一个 alias1 的别名:

PUT /twitter/_alias/alias1

上面的 wild card 方式返回来得结果为:

{"twitter" : {"aliases" : {"alias1" : { },"city_beijing" : {"filter" : {"term" : {"city" : "北京"}}}}}
}

显然这里有两个别名:alias1 及 city_beijing。

你可以通过如下的方式来搜寻你的alias:

GET /_alias/city_*

它将显示名字以 city 开始的所有的 alias。

检查一个 alias 是否存在

我们可以通过如下的方式来检查一个alias是否存在:

HEAD /_alias/<alias>
HEAD /<index>/_alias/<alias>

比如:

HEAD /_alias/alias1

它显示的结果是:

200 - OK

同样你也可通过wild card方式来查询:

HEAD /_alias/city*

这个用来检查所有以 city 为开头的 alias。

更新 alias

我们这里所说的更新包括:添加删除

接口为:

POST /_aliases

比如:

POST /_aliases
{"actions" : [{ "add" : { "index" : "twitter", "alias" : "alias2" } }]
}

在这里,我们为 twitter 索引添加了一个叫做 alias2 的别名。运行后,我们可以通过 alias2 来重新搜索我们的 twitter

GET /alias2/_search

我们可以看到我们想要的结果:

{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 3,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "twitter","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"user" : "双榆树-张三","message" : "今儿天气不错啊,出去转转去","uid" : 2,"age" : 20,"city" : "北京","province" : "北京","country" : "中国","address" : "中国北京市海淀区","location" : {"lat" : "39.970718","lon" : "116.325747"}}},...

在 action 里,我们可以有如下的几种:

  • add: 添加一个别名
  • remove: 删除一个别名
  • remove_index: 删除一个index或它的别名

比如我们可以通过如下的方法来删除一个 alias

POST /_aliases
{"actions" : [{ "remove": { "index" : "twitter", "alias" : "alias2" } }]
}

一旦删除后,之前的定义的 alias2 就不可以用了。

重新命名一个 alias

重命名别名是一个简单的删除然后在同一 API 中添加操作。 此操作是原子操作,无需担心别名未指向索引的短时间段:
 

POST /_aliases
{"actions" : [{ "remove" : { "index" : "twitter", "alias" : "alias1" } },{ "add" : { "index" : "twitter", "alias" : "alias2" } }]
}

上面的操作,删除 alias1,同时创建一个新的叫做 alias2 的别名。

我们也可以把同一个 alias 在指向不同时期的 index,比如我们的 log index 滚动下一个月,我们可以修改我们的 alias 总是指向最新的index。

POST _aliases
{"actions": [{"add": {"index": "blogs_v2","alias": "blogs"}},{"remove": {"index": "blogs_v1","alias": "blogs"}}]
}

经过上面的命令 blogs 是一个执行 blogs_v2 的别名。

为多个索引添加同样一个 alias

将别名与多个索引相关联只需几个添加操作:

POST /_aliases
{"actions" : [{ "add" : { "index" : "test1", "alias" : "alias1" } },{ "add" : { "index" : "test2", "alias" : "alias1" } }]
}

你也可以通过如下的方式,通过一个add命令来完成:

POST /_aliases
{"actions" : [{ "add" : { "indices" : ["test1", "test2"], "alias" : "alias1" } }]
}

甚至:

POST /_aliases
{"actions" : [{ "add" : { "index" : "test*", "alias" : "all_test_indices" } }]
}

这样所有以 test* 为开头的索引都共同一个别名。

当我们 index 我们的文档时,对一个指向多个 index 的别名进行索引是错误的。

也可以在一个操作中使用别名交换索引:

PUT test     
PUT test_2PUT test_2/_doc/1
{"text": "nice"
}POST /_aliases
{"actions" : [{ "add":  { "index": "test_2", "alias": "test" } },{ "remove_index": { "index": "test" } }  ]
}

在上面的例子中,假如我们地添加了一个叫做 test 的 index。test 是我们对外的 API 接口需要而设置的索引名称。test_2 里的内容是我们想要的。我们直接可以通过上面的方法吧 test 中的数据交换到 test_2 中,并同时把 test 索引删除。这样当我们访问 test 的时候,其实它访问的是 test_2 里的内容。

GET test/_search

上面对 test 的搜索将返回 test_2 中的数据。

Filtered alias

带有过滤器的别名提供了一种创建同一索引的不同“视图”的简便方法。 可以使用 Query DSL 定义过滤器,并使用此别名将其应用于所有“搜索”,“计数”,“按查询删除”和“更多此类操作”。

要创建过滤后的别名,首先我们需要确保映射中已存在这些字段:

PUT /test1
{"mappings": {"properties": {"user" : {"type": "keyword"}}}
}

现在我们可以利用 filter 来创建一个alias,是基于 user 字段

POST /_aliases
{"actions" : [{"add" : {"index" : "test1","alias" : "alias2","filter" : { "term" : { "user" : "kimchy" } }}}]
}

上面的 alias2 创建了一个 test1 索引上的一个 filter,包含所有的 user 为 kimchy 的文档。

Write index

可以将别名指向的索引关联为 write 索引。 指定后,针对指向多个索引的别名的所有索引和更新请求将尝试解析为 write 索引的一个索引。 每个别名只能将一个索引分配为一次 write 索引。 如果未指定 write 索引且别名引用了多个索引,则不允许写入。

可以使用别名API和索引创建API将与别名关联的索引指定为write索引。

POST /_aliases
{"actions" : [{"add" : {"index" : "test","alias" : "alias1","is_write_index" : true}},{"add" : {"index" : "test2","alias" : "alias1"}}]
}

在这里,我们定义了 alias1 同时指向 test 及 test2 两个索引。其中 test 中,注明了 is_write_index,那么,如下的操作:

PUT /alias1/_doc/1
{"foo": "bar"
}

相当于如下的操作:

PUT /test/_doc/1

也就是写入到 test 索引中,而不会写入到 test2 中。

要交换哪个索引是别名的写入索引,可以利用别名 API 进行原子交换。 交换不依赖于操作的顺序。

POST /_aliases
{"actions" : [{"add" : {"index" : "test","alias" : "alias1","is_write_index" : false}}, {"add" : {"index" : "test2","alias" : "alias1","is_write_index" : true}}]
}

在创建索引的时候创建 alias

在上面,我们看到使用 _alias 终点来创建 alias。在实际的使用中,我们甚至可以在创建一个索引的时候就同时把 alias 创建好。比如:

PUT products
{"aliases": {"prod": {"is_write_index":  true},"prod1": {      }}
}

在上面,我们创建一个叫做 products 的索引,并且它是一个可以写入的索引。在创建这个 products 索引的同事,我们也创建了一个叫做 prod1 的 alias。我们导入第一个文档:

PUT products/_doc/1
{"color": "red","weight": 10
}

我们可以使用如下的方法来对这个索引进行搜索:

GET prod/_search

上面的搜索将返回 products 索引里的文档。我们也可以使用 prod1 这个 alias 来访问:

GET prod1/_search

使用别名以零停机时间迁移数据

生产中索引的配置设置有时可能必须使用更新的属性进行更新,这可能是由于新的业务需求或技术增强(或修复错误)。新属性可能与该索引中存在的现有数据不兼容;在这种情况下,我们可以创建一个具有新设置的索引,并将数据从旧索引迁移到全新的索引中。

这听起来不错,但一个潜在的问题是针对旧索引编写的查询(例如,GET cars/_search { ..})需要更新,因为它们现在需要针对新索引运行(car_new)。如果这些查询在应用程序代码中是硬编码的,那么你可能需要将修补程序发布到生产环境中。

假设你有一个名为 vintage_cars 的索引,其中包含古代和老式汽车的所有信息,你现在需要更新索引。这是我们可以依靠别名的地方;我们可以在考虑别名的情况下制定策略。如果你执行以下步骤,迁移最有可能实现零停机时间。

  1. 创建一个名为 vintage_cars_alias 的别名来引用当前索引 vintage_cars。 
  2. 由于新属性与现有索引不兼容,请创建一个新索引,例如使用新设置的 vintage_cars_new。
  3. 将旧索引 (vintage_cars) 中的数据复制(即重新索引 reindex)到新索引 (vintage_cars_new)。
  4. 重新创建指向旧索引的现有别名 (vintage_cars_alias) 以引用新索引。 因此,vintage_cars_alias 现在将指向 vintage_cars_new。
  5. 现在针对vintage_cars_alias 执行的所有查询都在新索引上执行。

对别名执行的查询现在将从新索引中获取数据,而不会退回应用程序。 因此,你实现了零停机时间。

参考:

【1】Update index alias API | Elasticsearch Guide [7.3] | Elastic

【2】Get index alias API | Elasticsearch Guide [7.3] | Elastic

【3】Add index alias API | Elasticsearch Guide [7.3] | Elastic

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1619676.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Linux alias 的用法

Linux alias 的用法 作者: Sway 1. 啥是alias alias的英文意思是别名. 通俗来说 alias 的概念是让方便你写一段非常非常小的小程序 如 : sway:~$ alias alias lsls --colorauto这里的意思是当你输入 ls 的时候就等同输入 ls --colorauto 但是当我们切换用户的时候 alias …

Nginx中alias与root的区别

目录&#xff1a; 一、区别二、举例说明1三、举例说明2 一、区别 Nginx指定文件路径有两种方式root和alias&#xff0c;这两者的用法区别在于对URI的处理方法不同。 二、举例说明1 alias&#xff1a; location /i/{ alias /usr/local/nginx/html/admin/&#xff1b;} #若…

详解nginx的root与alias

文章目录 1. 结论2. 详解root2.1 基本用法2.2 location的最左匹配原则2.3 index2.4 nginx location解析url工作流程2.5 末尾/ 3. 详解alias3.1 基本用法 4. 特殊情况4.1 alias指定文件4.2 root指定文件 nginx版本: 1.18.0 1. 结论 location命中后 如果是root&#xff0c;会把…

Linux命令之alias

在Linux中&#xff0c;alias命令的功能是设置命令的别名&#xff0c;用以简写命令&#xff0c;提高操作效率。根据参数的不同&#xff0c;该命令可查看已设定的别名&#xff0c;或为命令设置新的别名。对于用户自定义别名&#xff0c;仅当前登录期内有效&#xff1b;也可修改配…

Linux之alias命令

回复【1001】获取 linux常用命令速查手册 Linux alias命令用来设置指令的别名&#xff0c;对一些较长的命令进行简化。使用alias时&#xff0c;必须使用单引号将原来的命令包含&#xff0c;防止特殊字符导致错误。 命令格式 alias [-p] [name[value] ...] 命令功能 简化较长…

别名机制alias详解——一个让你少敲键盘的偷懒方式

别名机制alias——让你少敲键盘的偷懒方式 目录 别名机制alias——让你少敲键盘的偷懒方式样例环境1.从一个例子开始&#xff1a;2.别名机制alias&#xff1a;2.1 什么是alias&#xff1a;2.2 alias怎么用&#xff1a;2.3 alias的注意事项&#xff1a; 参考文献&#xff1a; 样…

Linux基础——别名(alias)

一、啥是别名? 别名&#xff08;alias&#xff09;是某个命令或者某一组命令的代称&#xff0c;和我们的小名或者外号一样&#xff0c;比如一些少数民族或者复姓的同学名字可能比较长&#xff0c;那我们一般不会每次都喊全名&#xff0c;而是用一个能特指他的另外一个名字称呼…

Linux——alias命令(设置命令别名)

Linux——alias命令&#xff08;设置命令别名&#xff09; alias 是shell内建命令&#xff08;即shell中自带的命令&#xff09;&#xff0c;它可以将常用的命令以及它的参数创建一个别名&#xff0c;来减少命令的输入量 我们常用的一些命令就是别名 eg&#xff1a;ls 、ll 1…

GIthub 无法访问使用Watt Toolkit加速

一、使用 Watt Toolkit Watt Toolkit 是一款加速软件&#xff0c;原名是 Steam&#xff0c;后来改名为 Watt Toolkit&#xff0c;其可以让原本无法访问的 Steam 游戏社区、 GitHub 、谷歌验证码等国内难以访问的网页正常访问。 三种下载方式&#xff1a; Watt Toolkit 官网下…

【JavaEE】Spring事务-@Transactional参数介绍-事务的隔离级别以及传播机制

【JavaEE】Spring事务&#xff08;2&#xff09; 文章目录 【JavaEE】Spring事务&#xff08;2&#xff09;1. Transactional 参数介绍1.1 value 和 transactionManager1.2 timeout1.3 readOnly1.4 后面四个1.5 isolation 与 propagation 2. Spring 事务隔离级别 - isolation2.…

房屋中介费怎么收取才合理?快看看别再花冤枉钱了

[摘要]本文讲述了什么是房屋中介&#xff0c;房屋中介费是如何收取的&#xff0c;房屋中介费的收取标准是什么。希望可以对即将用到房屋中介的网友们有所帮助。 买房的朋友都应该知道有房产中介这回事&#xff0c;甚至有的是通过房产中介的服务来买的房&#xff0c;当然&#x…

基于C#的房屋租赁管理系统设计与实现

目录 第一章 引言 3 第二章 系统分析与设计 4 2.1 需求分析 4 设计流程图&#xff1a; 4 2.2数据库概念结构设计 5 E-R图 5 2.3数据库的创建 6 管理员表&#xff1a; 6 房屋表&#xff1a; 7 用户信息表&#xff1a; 7 房屋租贷表&#xff1a; 7 财务报表&#xff1a; 7 收费标…

设计模式.中介者模式Mediator

定义 中介者模式(Mediator pattern) : 使用中介者模式来集中相关对象之间复杂的沟通和控制方式&#xff0c;使得这些对象不必相互明显引用。从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发生改变时&#xff0c;不会立即影响到其他的一些对象之间的相互作…

C++课程设计 房产中介管理系统(代码全)

目录表 1 需求分析**主函数&#xff1a;调用创建的各种类和方法**交易类&#xff1a;交易的实现房屋类&#xff1a;主要管理房屋信息房主信息&#xff1a;管理房屋主人的信息房主的实现&#xff1a;看房信息&#xff1a;存储有人想去实地看房的信息&#xff0c;预约等看房信息的…

房屋中介费收取标准有?详细的房屋中介费收取标准。

[摘要]如果购房者在买房的一定过程中&#xff0c;你选择找了中介&#xff0c;对购房会有便利的一方面&#xff0c;但是房屋中介费收取标准是什么呢&#xff1f;你了解房屋中介费收取标准吗&#xff1f;来了解房屋中介费收取标准吧。如果你选择了中介公司&#xff0c;可以参考条…

基于Linux操作系统的keepalived双机热备和keepalived+lvs(DR)基本配置操作

目录 keepalived双机热备 一、概述 &#xff08;一&#xff09;具体工作原理如下&#xff1a; &#xff08;二&#xff09;实验拓补 二、安装NFS、配置 1、第一台机器配置&#xff1a;NFS &#xff1a;192.168.11.101 2、更改配置文件 3、安装NFS进行目录共享 4、编辑…

应不应该收取房屋中介费用?房屋中介费用收取合理吗

[摘要]近年来不少人选择通过中介机构完成房屋买卖,那房屋中介费用是怎么收取的?房屋中介费用收取的标准是什么?交了房屋中介费用就可以安枕无忧了吗?但实际中,有一些中介机构的服务质量和效果良莠不齐,购房的情况也是千变万化,导致纠纷不断。 近年来不少人选择通过中介机构完…

基于NodeJS+VUE房屋中介管理系统的设计与实现

当今社会房屋租赁买卖是必不可少的&#xff0c;人们不管走到哪里都需要有一个温馨的家&#xff0c;有一个落脚之地&#xff0c;所以房屋租赁市场也是非常火爆&#xff01;不管是房屋中介公司或者是个人都需要一套完整的管理系统来掌握整个市场信息。针对这一需求&#xff0c;本…

【全源码及文档】基于Java面向对象开发的房屋中介管理系统

摘 要 现代的房产市场愈加复杂化&#xff0c;用软件来管理房产中介管理系统的开发与设计及自动匹配等功能&#xff0c;在实际运用中起到极大的帮助作用。 随着房地产业的飞速发展&#xff0c;待交易房屋的数量大幅度提高&#xff0c;传统手工处理为主的房屋管理方式存在着工作…

[附源码]计算机毕业设计JAVA房屋中介管理系统

[附源码]计算机毕业设计JAVA房屋中介管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…