前言:毕设项目还要求加了这个做大数据搜索,正好自己也比较感兴趣,就一起来学习学习吧!

Elasticsearch 简介

Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。

查询

保持好奇心。从数据中探寻各种问题的答案。

通过 Elasticsearch,您能够执行及合并多种类型的搜索(结构化数据、非结构化数据、地理位置、指标),搜索方式随心而变。先从一个简单的问题出发,试试看能够从中发现些什么。

分析

大处着眼,全局在握。

找到与查询最匹配的十个文档是一回事。但如果面对的是十亿行日志,又该如何解读呢?Elasticsearch 聚合让您能够从大处着眼,探索数据的趋势和模式。

速度

可扩展性

弹性

灵活性

操作的乐趣

客户端库

使用您自己的编程语言与 Elasticsearch 进行交互

Elasticsearch 使用的是标准的 RESTful 风格的 API 和 JSON。此外,我们还构建和维护了很多其他语言的客户端,例如 Java、Python、.NET、SQL 和 PHP。与此同时,我们的社区也贡献了很多客户端。这些客户端使用起来简单自然,而且就像 Elasticsearch 一样,不会对您的使用方式进行限制。

Java:

  1. RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
  2. new HttpHost("localhost", 9200, "http")));
  3. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  4. searchSourceBuilder.query(QueryBuilders.matchAllQuery());
  5. searchSourceBuilder.aggregation(AggregationBuilders.terms("top_10_states").field("state").size(10));
  6. SearchRequest searchRequest = new SearchRequest();
  7. searchRequest.indices("social-*");
  8. searchRequest.source(searchSourceBuilder);
  9. SearchResponse searchResponse = client.search(searchRequest);

尽享强大功能

HADOOP 和 SPRAK

照例来说应该是去扒官网,结果一搜就惊了,这官网也忒得劲儿了吧,竟然提供中文版本而且还有中文版本的文档,友好友好,我看了好长一会儿才反应过来自己还有博客要写.咳咳,上面的内容都是摘自官网顺便附一个官网链接:https://www.elastic.co/cn/products/elasticsearch

另外还有一个关于 Elasticsearch 来源很有趣的故事在这里分享一下:

回忆时光

许多年前,一个刚结婚的名叫 Shay Banon 的失业开发者,跟着他的妻子去了伦敦,他的妻子在那里学习厨师。 在寻找一个赚钱的工作的时候,为了给他的妻子做一个食谱搜索引擎,他开始使用 Lucene 的一个早期版本。

直接使用 Lucene 是很难的,因此 Shay 开始做一个抽象层,Java 开发者使用它可以很简单的给他们的程序添加搜索功能。 他发布了他的第一个开源项目 Compass。

后来 Shay 获得了一份工作,主要是高性能,分布式环境下的内存数据网格。这个对于高性能,实时,分布式搜索引擎的需求尤为突出, 他决定重写 Compass,把它变为一个独立的服务并取名 Elasticsearch。

第一个公开版本在2010年2月发布,从此以后,Elasticsearch 已经成为了 Github 上最活跃的项目之一,他拥有超过300名 contributors(目前736名 contributors )。 一家公司已经开始围绕 Elasticsearch 提供商业服务,并开发新的特性,但是,Elasticsearch 将永远开源并对所有人可用。

据说,Shay 的妻子还在等着她的食谱搜索引擎…

安装 Elasticsearch

官网最新版本 Elasticsearch (6.5.4),但是由于自己的环境使用最新版本的有问题(配合下面的工具 Kibana 有问题..Kibana 启动不了),所以不得不换成更低版本的 6.2.2,下载外链:戳这里,当然你也可以试一下最新的版本:

顺带一提:在下载之前你应该确保你的 Java 版本保持在 1.8 及以上(就 1.8 吧..),这是 Elasticsearch 的硬性要求,可以自行打开命令行输入 java -version 来查看 Java 的版本

下载完成后,可以看到是一个压缩包,我们直接解压在 D 盘上,然后打开 bin 目录下的 elasticsearch.bat 文件

等待一段时间后,可以看到小黑框输出一行 start ,就说明我们的 Elasticsearch 已经跑起来了,我们访问地址:http://127.0.0.1:9200/,看到返回一串 JSON 格式的代码就说明已经成功了:

安装 Kibana

这是一个官方推出的把 Elasticsearch 数据可视化的工具,官网在这里:【传送门】,不过我们现在暂时还用不到那些数据分析的东西,不过里面有一个 Dev Tools 的工具可以方便的和 Elasticsearch 服务进行交互,去官网下载了最新版本的 Kibana(6.5.4) 结果不知道为什么总是启动不起来,所以换一了一个低版本的(6.2.2)正常,给个下载外链:下载点这里,你们也可以去官网试试能不能把最新的跑起来:

解压到 D 盘(意外的有点慢..),同样打开目录下的bin\kibana.bat

等待一段时间后就可以看到提示信息,运行在 5601 端口,我们访问地址 http://localhost:5601/app/kibana#/dev_tools/console?_g=() 可以成功进入到 Dev-tools 界面:

点击 【Get to work】,然后在控制台输入 GET /_cat/health?v 查看服务器状态,可以在右侧返回的结果中看到 green 即表示服务器状态目前是健康的:


快速入门

一、基础概念-快速入门

节点 Node、集群 Cluster 和分片 Shards

ElasticSearch 是分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个实例。单个实例称为一个节点(node),一组节点构成一个集群(cluster)。分片是底层的工作单元,文档保存在分片内,分片又被分配到集群内的各个节点里,每个分片仅保存全部数据的一部分。

索引 Index、类型 Type 和文档 Document

对比我们比较熟悉的 MySQL 数据库:

index → db

type → table

document → row

如果我们要访问一个文档元数据应该包括囊括 index/type/id 这三种类型,很好理解。

二、使用 RESTful API 与 Elasticsearch 进行交互

所有其他语言可以使用 RESTful API 通过端口 9200 和 Elasticsearch 进行通信,你可以用你最喜爱的 web 客户端访问 Elasticsearch 。一个 Elasticsearch 请求和任何 HTTP 请求一样由若干相同的部件组成:

curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

< > 标记的部件:

部件名 作用
VERB 适当的 HTTP 方法 或 谓词 : GETPOSTPUTHEAD 或者 DELETE
PROTOCOL http 或者 https(如果你在 Elasticsearch 前面有一个 https 代理)
HOST Elasticsearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。
PORT 运行 Elasticsearch HTTP 服务的端口号,默认是 9200
PATH API 的终端路径(例如 _count 将返回集群中文档数量)。Path 可能包含多个组件,例如:_cluster/stats_nodes/stats/jvm
QUERY_STRING 任意可选的查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读)
BODY 一个 JSON 格式的请求体 (如果请求需要的话)

就比如计算集群中文档的数量,我们可以用这个:

  1. curl -XGET 'http://localhost:9200/_count?pretty' -d '
  2. {
  3. "query": {
  4. "match_all": {}
  5. }
  6. }
  7. '

不过对于安装了 Kibana 的我们,可以直接在 Kibana 的控制台输出以下语句,也是同样的效果:

  1. GET /_count?pretty
  2. {
  3. "query": {
  4. "match_all": {}
  5. }
  6. }

文档管理(CRUD)

如果对于 RESTful 不太熟悉的童鞋请右转:【传送门】

增加:

  1. POST /db/user/1
  2. {
  3. "username": "wmyskxz1",
  4. "password": "123456",
  5. "age": "22"
  6. }
  7. POST /db/user/2
  8. {
  9. "username": "wmyskxz2",
  10. "password": "123456",
  11. "age": "22"
  12. }

这一段代码稍微解释一下,这其实就往索引为 db 类型为 user 的数据库中插入一条 id 为 1 的一条数据,这条数据其实就相当于一个拥有 username/password/age 三个属性的一个实体,就是 JSON 数据

执行命令后,Elasticsearch 返回如下数据:

  1. # POST /db/user/1
  2. {
  3. "_index": "db",
  4. "_type": "user",
  5. "_id": "1",
  6. "_version": 1,
  7. "result": "created",
  8. "_shards": {
  9. "total": 2,
  10. "successful": 1,
  11. "failed": 0
  12. },
  13. "_seq_no": 2,
  14. "_primary_term": 1
  15. }
  16. # POST /db/user/2
  17. {
  18. "_index": "db",
  19. "_type": "user",
  20. "_id": "2",
  21. "_version": 1,
  22. "result": "created",
  23. "_shards": {
  24. "total": 2,
  25. "successful": 1,
  26. "failed": 0
  27. },
  28. "_seq_no": 1,
  29. "_primary_term": 1
  30. }

version 是版本号的意思,当我们执行操作会自动加 1

删除:

  1. DELETE /db/user/1

Elasticsearch 返回数据如下:

  1. {
  2. "_index": "db",
  3. "_type": "user",
  4. "_id": "1",
  5. "_version": 2,
  6. "result": "deleted",
  7. "_shards": {
  8. "total": 2,
  9. "successful": 1,
  10. "failed": 0
  11. },
  12. "_seq_no": 1,
  13. "_primary_term": 1
  14. }

这里就可以看到 version 变成了 2

修改:

  1. PUT /db/user/2
  2. {
  3. "username": "wmyskxz3",
  4. "password": "123456",
  5. "age": "22"
  6. }

Elasticsearch 返回数据如下:

  1. {
  2. "_index": "db",
  3. "_type": "user",
  4. "_id": "2",
  5. "_version": 2,
  6. "result": "updated",
  7. "_shards": {
  8. "total": 2,
  9. "successful": 1,
  10. "failed": 0
  11. },
  12. "_seq_no": 2,
  13. "_primary_term": 1
  14. }

查询:

  1. GET /db/user/2

返回数据如下:

  1. {
  2. "_index": "db",
  3. "_type": "user",
  4. "_id": "2",
  5. "_version": 2,
  6. "found": true,
  7. "_source": {
  8. "username": "wmyskxz3",
  9. "password": "123456",
  10. "age": "22"
  11. }
  12. }

搜索

上面我们已经演示了基本的文档 CRUD 功能,然而 Elasticsearch 的核心功能是搜索,所以在学习之前,为更好的演示这个功能,我们先往 Elasticsearch 中插入一些数据:

  1. PUT /movies/movie/1
  2. {
  3. "title": "The Godfather",
  4. "director": "Francis Ford Coppola",
  5. "year": 1972,
  6. "genres": [
  7. "Crime",
  8. "Drama"
  9. ]
  10. }
  11. PUT /movies/movie/2
  12. {
  13. "title": "Lawrence of Arabia",
  14. "director": "David Lean",
  15. "year": 1962,
  16. "genres": [
  17. "Adventure",
  18. "Biography",
  19. "Drama"
  20. ]
  21. }
  22. PUT /movies/movie/3
  23. {
  24. "title": "To Kill a Mockingbird",
  25. "director": "Robert Mulligan",
  26. "year": 1962,
  27. "genres": [
  28. "Crime",
  29. "Drama",
  30. "Mystery"
  31. ]
  32. }
  33. PUT /movies/movie/4
  34. {
  35. "title": "Apocalypse Now",
  36. "director": "Francis Ford Coppola",
  37. "year": 1979,
  38. "genres": [
  39. "Drama",
  40. "War"
  41. ]
  42. }
  43. PUT /movies/movie/5
  44. {
  45. "title": "Kill Bill: Vol. 1",
  46. "director": "Quentin Tarantino",
  47. "year": 2003,
  48. "genres": [
  49. "Action",
  50. "Crime",
  51. "Thriller"
  52. ]
  53. }
  54. PUT /movies/movie/6
  55. {
  56. "title": "The Assassination of Jesse James by the Coward Robert Ford",
  57. "director": "Andrew Dominik",
  58. "year": 2007,
  59. "genres": [
  60. "Biography",
  61. "Crime",
  62. "Drama"
  63. ]
  64. }

_search端点

现在已经把一些电影信息放入了索引,可以通过搜索看看是否可找到它们。 为了使用 ElasticSearch 进行搜索,我们使用 _search 端点,可选择使用索引和类型。也就是说,按照以下模式向URL发出请求:<index>/<type>/_search。其中,indextype 都是可选的。

换句话说,为了搜索电影,可以对以下任一URL进行POST请求:

搜索请求正文和ElasticSearch查询DSL

如果只是发送一个请求到上面的URL,我们会得到所有的电影信息。为了创建更有用的搜索请求,还需要向请求正文中提供查询。 请求正文是一个JSON对象,除了其它属性以外,它还要包含一个名称为 “query” 的属性,这就可使用ElasticSearch的查询DSL。

  1. {
  2. "query": {
  3. //Query DSL here
  4. }
  5. }

你可能想知道查询DSL是什么。它是ElasticSearch自己基于JSON的域特定语言,可以在其中表达查询和过滤器。你可以把它简单同SQL对应起来,就相当于是条件语句吧。

基本自由文本搜索:

查询DSL具有一长列不同类型的查询可以使用。 对于“普通”自由文本搜索,最有可能想使用一个名称为“查询字符串查询”。

查询字符串查询是一个高级查询,有很多不同的选项,ElasticSearch将解析和转换为更简单的查询树。如果忽略了所有的可选参数,并且只需要给它一个字符串用于搜索,它可以很容易使用。

现在尝试在两部电影的标题中搜索有“kill”这个词的电影信息:

  1. GET /_search
  2. {
  3. "query": {
  4. "query_string": {
  5. "query": "kill"
  6. }
  7. }
  8. }

执行上面的请求并查看结果,如下所示 -

正如预期的,得到两个命中结果,每个电影的标题中都带有“kill”单词。再看看另一种情况,在特定字段中搜索。

指定搜索的字段

在前面的例子中,使用了一个非常简单的查询,一个只有一个属性 “query” 的查询字符串查询。 如前所述,查询字符串查询有一些可以指定设置,如果不使用,它将会使用默认的设置值。

这样的设置称为“fields”,可用于指定要搜索的字段列表。如果不使用“fields”字段,ElasticSearch查询将默认自动生成的名为 “_all” 的特殊字段,来基于所有文档中的各个字段匹配搜索。

为了做到这一点,修改以前的搜索请求正文,以便查询字符串查询有一个 fields 属性用来要搜索的字段数组:

  1. GET /_search
  2. {
  3. "query": {
  4. "query_string": {
  5. "query": "ford",
  6. "fields": [
  7. "title"
  8. ]
  9. }
  10. }
  11. }

执行上面查询它,看看会有什么结果(应该只匹配到 1 行数据):

正如预期的得到一个命中,电影的标题中的单词“ford”。现在,从查询中移除fields属性,应该能匹配到 3 行数据:

过滤

前面已经介绍了几个简单的自由文本搜索查询。现在来看看另一个示例,搜索 “drama”,不明确指定字段,如下查询 -

  1. GET /_search
  2. {
  3. "query": {
  4. "query_string": {
  5. "query": "drama"
  6. }
  7. }
  8. }

因为在索引中有五部电影在 _all 字段(从类别字段)中包含单词 “drama”,所以得到了上述查询的 5 个命中。 现在,想象一下,如果我们想限制这些命中为只是 1962 年发布的电影。要做到这点,需要应用一个过滤器,要求 “year” 字段等于 1962。要添加过滤器,修改搜索请求正文,以便当前的顶级查询(查询字符串查询)包含在过滤的查询中:

  1. {
  2. "query": {
  3. "filtered": {
  4. "query": {
  5. "query_string": {
  6. "query": "drama"
  7. }
  8. },
  9. "filter": {
  10. //Filter to apply to the query
  11. }
  12. }
  13. }
  14. }

过滤的查询是具有两个属性(queryfilter)的查询。执行时,它使用过滤器过滤查询的结果。要完成这样的查询还需要添加一个过滤器,要求year字段的值为1962

ElasticSearch查询DSL有各种各样的过滤器可供选择。对于这个简单的情况,某个字段应该匹配一个特定的值,一个条件过滤器就能很好地完成工作。

  1. "filter": {
  2. "term": { "year": 1962 }
  3. }

完整的搜索请求如下所示:

  1. GET /_search
  2. {
  3. "query": {
  4. "filtered": {
  5. "query": {
  6. "query_string": {
  7. "query": "drama"
  8. }
  9. },
  10. "filter": {
  11. "term": {
  12. "year": 1962
  13. }
  14. }
  15. }
  16. }
  17. }

当执行上面请求,只得到两个命中,这个两个命中的数据的 year 字段的值都是等于 1962

无需查询即可进行过滤

在上面的示例中,使用过滤器限制查询字符串查询的结果。如果想要做的是应用一个过滤器呢? 也就是说,我们希望所有电影符合一定的标准。

在这种情况下,我们仍然在搜索请求正文中使用 “query” 属性。但是,我们不能只是添加一个过滤器,需要将它包装在某种查询中。

一个解决方案是修改当前的搜索请求,替换查询字符串 query 过滤查询中的 match_all 查询,这是一个查询,只是匹配一切。类似下面这个:

  1. GET /_search
  2. {
  3. "query": {
  4. "filtered": {
  5. "query": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "term": {
  10. "year": 1962
  11. }
  12. }
  13. }
  14. }
  15. }

另一个更简单的方法是使用常数分数查询:

  1. GET /_search
  2. {
  3. "query": {
  4. "constant_score": {
  5. "filter": {
  6. "term": {
  7. "year": 1962
  8. }
  9. }
  10. }
  11. }
  12. }

参考文章:Elasticsearch入门教程Elasticsearch官方文档ElasticSearch 快速上手学习入门教程

三、集成 SpringBoot 简单示例

第一步:新建 SpringBoot 项目

pom包依赖:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-starter-test</artifactId>
  12. <scope>test</scope>
  13. </dependency>
  14. <!-- Elasticsearch支持 -->
  15. <dependency>
  16. <groupId>org.springframework.boot</groupId>
  17. <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  18. </dependency>

application.properties:

  1. spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300

第二步:新建实体类

User类:

  1. @Document(indexName = "users", type = "user")
  2. public class User {
  3. private int id;
  4. private String username;
  5. private String password;
  6. private int age;
  7. /** getter and setter */
  8. }

第三步:Dao 层

UserDao:

  1. import com.wmyskxz.demo.domain.User;
  2. import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
  3. public interface UserDao extends ElasticsearchRepository<User, Integer> {
  4. }

第四步:Controller 层

这里紧紧是为了演示,所以就省略 service 层,当然 CRUD 不能少:

  1. @RestController
  2. public class UserController {
  3. @Autowired
  4. UserDao userDao;
  5. @PostMapping("/addUser")
  6. public String addUser(String username, String password, Integer age) {
  7. User user = new User();
  8. user.setUsername(username);
  9. user.setPassword(password);
  10. user.setAge(age);
  11. return String.valueOf(userDao.save(user).getId());// 返回id做验证
  12. }
  13. @DeleteMapping("/deleteUser")
  14. public String deleteUser(Integer id) {
  15. userDao.deleteById(id);
  16. return "Success!";
  17. }
  18. @PutMapping("/updateUser")
  19. public String updateUser(Integer id, String username, String password, Integer age) {
  20. User user = new User();
  21. user.setId(id);
  22. user.setUsername(username);
  23. user.setPassword(password);
  24. user.setAge(age);
  25. return String.valueOf(userDao.save(user).getId());// 返回id做验证
  26. }
  27. @GetMapping("/getUser")
  28. public User getUser(Integer id) {
  29. return userDao.findById(id).get();
  30. }
  31. @GetMapping("/getAllUsers")
  32. public Iterable<User> getAllUsers() {
  33. return userDao.findAll();
  34. }
  35. }

第五步:测试

使用 REST 测试工具测试没有问题,过程我就不给了..bingo!

总结

其实使用 SpringBoot 来操作 Elasticsearch 的话使用方法有点类似 JPA 了,而且完全可以把 Elasticsearch 当做 SQL 服务器来用,也没有问题...在各种地方看到了各个大大特别是官方,都快把 Elasticsearch 这款工具吹上天了,对于它方便的集成这一点我倒是有感受,关于速度这方面还没有很深的感受,慢慢来吧...


按照惯例黏一个尾巴:

欢迎转载,转载请注明出处!

简书ID:@我没有三颗心脏

github:wmyskxz

欢迎关注公众微信号:wmyskxz

分享自己的学习 & 学习资料 & 生活

想要交流的朋友也可以加qq群:3382693

Elasticsearch【快速入门】的更多相关文章

  1. Elasticsearch快速入门案例

    写在前面的话:读书破万卷,编码如有神-------------------------------------------------------------------- 参考内容: <Ela ...

  2. Elasticsearch快速入门和环境搭建

    内容概述 什么是Elasticsearch,为什么要使用它? 基础概念简介 节点(node) 索引(index) 类型映射(mapping) 文档(doc) 本地环境搭建,创建第一个index 常用R ...

  3. ElasticSearch快速入门

    知识储备 学习ElasticSearch之前可以先了解一下lucene,这里是我整理的一篇关于lucene的笔记(传送门),对搜索框架有兴趣的还可以了解一下另一款企业级搜索应用服务器---solr(传 ...

  4. Elasticsearch - 快速入门

    Elasticsearch是基于Apache 2.0开源的实时.分布式.分析搜索引擎,相比Lucene,Elasticsearch的上手比较容易,这篇文章主要纪录Elasticsearch的基本概念和 ...

  5. Elasticsearch 快速入门教程

    面向文档 应用中的对象很少只是简单的键值列表,更多时候它拥有复杂的数据结构,比如包含日期.地理位置.另一个对象或者数组. 总有一天你会想到把这些对象存储到数据库中.将这些数据保存到由行和列组成的关系数 ...

  6. 3.1_springboot2.x检索之elasticsearch安装&快速入门

    1.elasticsearch简介&安装 1.1.1.elasticsearch介绍 ​ 我们的应用经常需要添加检索功能,开源的 ElasticSearch 是目前全文搜索引擎的首选.他可以快 ...

  7. elasticsearch系列二:索引详解(快速入门、索引管理、映射详解、索引别名)

    一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 ...

  8. ELK系列(1) - Elasticsearch + Logstash + Kibana + Log4j2快速入门与搭建用例

    前言 最近公司分了个ELK相关的任务给我,在一边学习一边工作之余,总结下这些天来的学习历程和踩坑记录. 首先介绍下使用ELK的项目背景:在项目的数据库里有个表用来存储消息队列的消费日志,这些日志用于开 ...

  9. ElasticSearch实战系列六: Logstash快速入门和实战

    前言 本文主要介绍的是ELK日志系统中的Logstash快速入门和实战 ELK介绍 ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是 ...

随机推荐

  1. windows和centos下安装ActiveMQ

    版本:apache-activemq-5.10.2-bin.zip         (版本5.11+需要jdk7+) 官网: http://activemq.apache.org/download.h ...

  2. Servlet知识点总结

    一, ServletAPI中有4个Java包: 1.javax.servlet:其中包含定义Servlet和Servlet容器之间契约的类和接口 2.javax.servlet.http:其中包含定义 ...

  3. Maven install命令理解

    每一个构建都需要唯一的坐标来标识位置,我们根据坐标位置就能够下载构建至本地仓库.那么如果我们是内部项目,自定义的构建并不公开至网络上,项目成员又想依赖他怎么办呢?想想maven找寻构建的步骤. 先找寻 ...

  4. Linux网络简介

    Linux的网络简介 1.TCP/IP协议簇  (通俗的解释就是为了网路传输指定的一种标准),它将网络划分为四层:应用层 .传输层.互联层 .网络接口层 . 基础层是网络接口层(说白了就是把帧格式的数 ...

  5. c#Socket客户端和服务端的信息发送

    这是我制作的界面信息,c# Socket通信的简单使用,刚开始学习,不对的地方请大家指教,目前是可以运行的,之后自己在慢慢添加新的东西.同时了解Tcp协议的三次握手.希望对跟我一样的初学者有所帮助. ...

  6. Spring-cloud (八) Hystrix 请求缓存的使用

    前言: 最近忙着微服务项目的开发,脱更了半个月多,今天项目的初版已经完成,所以打算继续我们的微服务学习,由于Hystrix这一块东西好多,只好多拆分几篇文章写,对于一般对性能要求不是很高的项目中,可以 ...

  7. app后端设计(6)-- LBS

    在LBS的应用中,一个基本的需求是查找附近的用户,现在有两种做法: 1. 使用mysql的空间数据库,具体做法参考:http://blog.sina.com.cn/s/blog_a48af8c0010 ...

  8. 如何把Python脚本导出为exe程序

    一.pyinstaller简介 pyinstaller将Python脚本打包成可执行程序,使在没有Python环境的机器上运行 最新版是pyinstaller 3.1.1.支持python2.7和py ...

  9. 基于Nginx和Zookeeper实现Dubbo的分布式服务

    一.前言 公司的项目基于阿里的Dubbo 微服务框架开发.为了符合相关监管部门的安全要求,公司购买了华东1.华东2两套异地服务器,一套是业务服务器,一套是灾备服务器.准备在这两套服务器上实现 Dubb ...

  10. Java 读书笔记 (一) 基本知识

    1. 基本概念 对象 对象是类的一个实例,有状态和行为. 例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有: 摇尾.叫.吃等. 类 类是一个模板,它描述一类对象的行为和状态. 方法 方法就 ...