准备工作

0、什么是ElasticSearch?它和Lucene以及solr的关系是什么?

这些是自己的知识获取能力,自行百度百科

1、下载ElasticSearch的window版,linux版后续说明

自行百度Elastic,然后进到官网进行下载,我的版本是:7.8.0

2、下载postman

自行百度进行下载

3、ElasticSearch中的目录解读( 会tomcat,看到这些目录就不陌生 )

进到bin目录下,点击 elasticsearch.bat 文件即可启动 ES 服务

4、ELK技术是什么意思?

  • 就图中这三个

0、ES非关系型和关系型数据库对应关系

注意:ES 7.x之后,type已经被淘汰了,其他的没变

只要玩ES,那么这个图就要牢牢地记在自己脑海里,后续的名词解释不再过多说明,就是操作这幅图中的东西

1、索引

  • 这里需要解释一个东西:倒排索引

  • 解释之前先来对照关系型数据库看一下:正排索引

1.1、创建索引

语法:

http://ip:port/index_name 如:http://127.0.0.1:9200/create_index 请求方式:put

注:put请求具有幂等性

  • 指的是: 不管进行多少次重复操作,都是实现相同的结果。可以采用把下面的请求多执行几次,然后:观察返回的结果

还具有幂等性的有:put、delete、get

1.1、获取索引

语法:

http://ip:port/index_name 如:http://127.0.0.1:9200/create_index 请求方式:get

1.3、获取ES中的全部索引

http://ip:port/_cat/indices?v 如:http://127.0.0.1:9200/_cat/indices?v

1.4、删除索引

语法:

http://ip:port/index_name 如:http://127.0.0.1:9200/create_index 注意:请求方式为delete

2、文档_doc

2.1、使用post创建doc

这种方式:是采用ES随机生成id时使用的请求方式

**注:需要先创建索引,因为:这就类似于关系型数据库中在数据库的表中 创建数据 **

语法:

http://ip:port/index_name/_doc 如: http://127.0.0.1:9200/create_index/_doc 请求方式:post

2.2、使用put创建doc - 转幂等性 - 自定义id

在路径后面加一个要创建的id值即可

2.3、查询文档_doc - 重点

2.3.1、id查询单条_doc

语法:

http://ip:port/index_name/_doc/id 如: http://127.0.0.1:9200/create_index/_doc/100001 请求方式:get

2.3.2、查询ES中索引下的全部_doc

语法:

http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 请求方式:get

注意:别再body中携带数据了,不然就会报:

Unknown key for a VALUE_STRING in [title]

返回的结果:

点击查看代码
{
"took": 69, 查询花费的时间 毫秒值
"timed_out": false, 是否超时
"_shards": { 分片 还没学,先不看
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 1.0,
"hits": [ 查询出来的 当前索引下的所有_doc文档
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pdy1sX0B_g8Hput6sCw6",
"_score": 1.0,
"_source": {
"title": "这是第一次学习ES的表数据创建",
"author": "紫邪情",
"sex": "girl"
}
},
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pty5sX0B_g8Hput6eyzA",
"_score": 1.0,
"_source": {
"title": "这是第一次学习ES的表数据创建",
"author": "紫邪情",
"sex": "girl"
}
},
{
"_index": "create_index",
"_type": "_doc",
"_id": "100001",
"_score": 1.0,
"_source": {
"title": "这是第一次学习ES的表数据创建",
"author": "紫邪情",
"sex": "girl"
}
}
]
}
}

2.4、文档_doc的修改

2.4.1、全量修改

原理:利用内容覆盖,重新发一份文档罢了

语法:

http://ip:port/index_name/_doc/id 如: http://127.0.0.1:9200/create_index/_doc/100001 请求方式:post

获取_doc文档,检验一下

2.4.2、局部修改

语法:

http://ip:port/index_name/_update/id 如: http://127.0.0.1:9200/create_index/_update/100001 请求方式:post

检验一下:

2.5、文档_doc的删除

使用delete请求即可

2.6、条件查询 - 重点

2.6.1、url携带条件

语法:

http://ip:port/index_name/_search?q=条件字段:值 如: http://127.0.0.1:9200/create_index/_search?q=author:邪 请求方式:get

注:这种方式不建议用,了解即可吧

  • 返回的结果体:
点击查看代码
{
"took": 26,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 0.18232156,
"hits": [
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pdy1sX0B_g8Hput6sCw6",
"_score": 0.18232156,
"_source": {
"title": "这是第一次学习ES的表数据创建",
"author": "紫邪情",
"sex": "girl"
}
},
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pty5sX0B_g8Hput6eyzA",
"_score": 0.18232156,
"_source": {
"title": "这是第一次学习ES的表数据创建",
"author": "紫邪情",
"sex": "girl"
}
}
]
}
}

2.6.2、请求体携带条件 - 推荐使用的一种

语法:

http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 请求方式:get

请求体携带的数据:

点击查看代码
{
"query": {
"match":{ match 匹配、配对
"author": "邪" 条件
}
}
}

结果返回:

点击查看代码

{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 0.18232156,
"hits": [
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pdy1sX0B_g8Hput6sCw6",
"_score": 0.18232156,
"_source": {
"title": "这是第一次学习ES的表数据创建",
"author": "紫邪情",
"sex": "girl"
}
},
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pty5sX0B_g8Hput6eyzA",
"_score": 0.18232156,
"_source": {
"title": "这是第一次学习ES的表数据创建",
"author": "紫邪情",
"sex": "girl"
}
}
]
}
}

2.7、分页查询 - 重点

语法:

http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 请求方式:get

请求体内容:

点击查看代码

{
"query":{
"match_all":{} 注意:这里使用的是match_all
},
"from": 0, 相当于:startNum
"size": 1 相当于:pageSize
}

![image](https://img2020.cnblogs.com/blog/2421736/202112/2421736-20211213151619558-1129641068.png)

返回结果:

点击查看代码

{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pdy1sX0B_g8Hput6sCw6",
"_score": 1.0,
"_source": {
"title": "这是第一次学习ES的表数据创建",
"author": "紫邪情",
"sex": "girl"
}
}
]
}
}

2.8、排序查询 - 重点

语法:

http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 请求方式:get

请求体内容:

点击查看代码

{
"query":{
"match_all":{}
},
"sort":{ 排序
"_id":{ 根据什么字段排序
"order":"desc" 排序方式 desc降序 asc升序
}
}
}

返回结果:

点击查看代码

{
"took": 49,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": null,
"hits": [
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pty5sX0B_g8Hput6eyzA",
"_score": null,
"_source": {
"title": "这是第一次学习ES的表数据创建",
"author": "紫邪情",
"sex": "girl"
},
"sort": [
"Pty5sX0B_g8Hput6eyzA"
]
},
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pdy1sX0B_g8Hput6sCw6",
"_score": null,
"_source": {
"title": "这是第一次学习ES的表数据创建",
"author": "紫邪情",
"sex": "girl"
},
"sort": [
"Pdy1sX0B_g8Hput6sCw6"
]
}
]
}
}

2.9、多条件查询 - 重点

2.9.1、and查询

语法:

http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 请求方式:get

请求体内容:

点击查看代码
{
"query":{
"bool":{
"must":[ 就相当于是mysql中的 and拼接条件
{
"match":{ and条件1
"author":"邪"
}
},{
"match":{ and条件2
"_id":"Pdy1sX0B_g8Hput6sCw6"
}
}
]
}
}
}

返回结果:

点击查看代码
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.1823215,
"hits": [
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pdy1sX0B_g8Hput6sCw6",
"_score": 1.1823215,
"_source": {
"title": "这是第一次学习ES的表数据创建",
"author": "紫邪情",
"sex": "girl"
}
}
]
}
}

2.9.2、or查询

语法:

http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 请求方式:get

请求体内容:

点击查看代码

{
"query":{
"bool":{
"should":[ 对照must,改变的地方
{
"match":{
"author":"邪"
}
},{
"match":{
"_id":"Pdy1sX0B_g8Hput6sCw6"
}
}
]
}
}
}

返回的结果:

点击查看代码

{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1.1823215,
"hits": [
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pdy1sX0B_g8Hput6sCw6",
"_score": 1.1823215,
"_source": {
"title": "这是第一次学习ES的表数据创建",
"author": "紫邪情",
"sex": "girl"
}
},
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pty5sX0B_g8Hput6eyzA",
"_score": 0.18232156,
"_source": {
"title": "这是第一次学习ES的表数据创建",
"author": "紫邪情",
"sex": "girl"
}
}
]
}
}

2.10、范围查询 - 重点

语法:

http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 请求方式:get

请求体内容:

点击查看代码

{
"query":{
"bool":{
"should":[
{
"match":{
"author":"邪"
}
},{
"match":{
"title":"一"
}
}
],
"filter":{ 就多了这么一个filter range而已
"range":{
"id":{
"gt":1000 gt > lt < 在html中见过滴
}
}
}
}
}
}

返回结果:下面的两条数据是我重新加的

点击查看代码


{
"took": 34,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 0.0,
"hits": [
{
"_index": "create_index",
"_type": "_doc",
"_id": "Vtz2sn0B_g8Hput64ywM",
"_score": 0.0,
"_source": {
"id": 10001,
"title": "大王叫我来巡山",
"author": "王二麻子"
}
},
{
"_index": "create_index",
"_type": "_doc",
"_id": "V9z5sn0B_g8Hput6HyyQ",
"_score": 0.0,
"_source": {
"id": 10002,
"title": "论皮包龙是怎么形成的",
"author": "波多野结衣"
}
}
]
}
}

2.11、完全匹配 - 精准匹配 - 重点

  • 在玩这个之前可以回到前面看一下我前面例子中的:条件查询

  • 在那里,老衲做的有一个操作:只用了一个字符:邪,但是:最后得到了想要的结果

  • 上面这种:叫做全文检索,它是去:我创建的create_index索引下的找寻所有的内容,从而匹配出:author包含“邪”的内容,如果此时自己定的条件是:多个字符的话,那么:底层是把这些字符拆成单个字符了,从而匹配出来的

  • 而所谓的完全匹配:就是精准匹配到某条数据,它虽然也会拆成单个字符,但是:查询时,还是整串字符绑定在一起匹配的

    • 如:查询"紫邪情",用全文检索就是:紫、邪、情,单独匹配,从而判定,如果此时:使用"紫邪晴",那么:也会匹配到
    • 但是:如果使用的是完全匹配"紫邪晴",虽然也会拆分为:紫、邪、晴,可是:它最后去匹配结果时,是使用"紫邪晴"这整个字符串来比对的,所以:最后结果不会匹配到

语法:

http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 请求方式:get

全文检索和完全匹配对比

2.12、高亮查询

语法:

http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 请求方式:get

请求体内容:

点击查看代码

{
"query":{
"match":{
"author":"紫邪情"
}
},
"highlight":{ 高亮
"fields":{ 哪个字段需要高亮
"author":{}
}
}
}

返回结果:

点击查看代码

{
"took": 59,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 2.264738,
"hits": [
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pdy1sX0B_g8Hput6sCw6",
"_score": 2.264738,
"_source": {
"title": "这是第一次学习ES的表数据创建",
"author": "紫邪情",
"sex": "girl"
},
"highlight": {
"author": [
"<em>紫</em><em>邪</em><em>情</em>"
]
}
},
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pty5sX0B_g8Hput6eyzA",
"_score": 2.264738,
"_source": {
"title": "这是第一次学习ES的表数据创建",
"author": "紫邪情",
"sex": "girl"
},
"highlight": {
"author": [
"<em>紫</em><em>邪</em><em>情</em>"
]
}
}
]
}
}

2.13、组合查询

2.13.1、分组

语法:

http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 请求方式:get

请求体内容:

点击查看代码

{
"aggs": { // 组合操作标识
"author_group": { // 分组之后的名称 随便取
"terms": { // 分组标识
"field": "id" // 注意:这里分组别用字符串类型的字段,如:author
}
}
},
"size": 0 // 设定不显示原始数据,否则:"hits":{}这个原始数据也会暴露出来
}

加上size之后的返回结果:

点击查看代码

{
"took": 5,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4,
"relation": "eq"
},
"max_score": null,
"hits": [] // 这里的hits就被去掉了
},
"aggregations": {
"author_group": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 10001,
"doc_count": 1
},
{
"key": 10002,
"doc_count": 1
}
]
}
}
}

2.13.2、平均数

语法:

http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 请求方式:get

请求体内容:

点击查看代码

{
"aggs":{
"id_avg":{
"avg":{
"field":"id"
}
}
},
"size":0
}

返回结果:

点击查看代码

{
"took": 4,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"id_avg": {
"value": 10001.5
}
}
}

同样的道理:sum总和之类的也可以写的,把标识改为对应的函数名字、field字段即可

2.14、映射关系

  • 就相当于:在做mysql数据库中的表结构( 字段构建嘛:字段名、类型... )

2.14.1、建立索引

点击查看代码

http:127.0.0.1:9200/user // 请求类型:put

2.14.2、建立映射关系

点击查看代码

http://127.0.0.1:9200/user/_mapping // 请求方式:put // 请求体内容
{
"properties":{
"name":{
"type":"text",
"index":true
},
"age":{
"type":"keyword",
"index":false
},
"address":{
"type":"keyword",
"index":true
}
}
} // 2、查看映射关系
http://127.0.0.1:9200/user/_mapping // 请求方式:get // 3、添加数据
http://127.0.0.1:9200/user/_doc // 请求方式 post // 请求体内容
{
"name":"紫邪情",
"sex":"女滴",
"age":18,
"address":"地球村"
} // 4、查看数据
http://127.0.0.1:9200/user/_search // 请求方式 post

2.14.3、测试

点击查看代码

http://127.0.0.1:9200/user/_search // 请求方式 get // 请求体内容
{
"query":{
"bool":{
"must":[
{
"match":{
"name":"邪"
}
},{
"match":{
"age":18
}
},{
"match":{
"address":"地球村"
}
}
]
}
}
}

返回结果:

点击查看代码

{
"error": {
"root_cause": [
{
"type": "query_shard_exception",
"reason": "failed to create query: Cannot search on field [age] since it is not indexed.", // 重点信息在这里,但是:现在先不解答这个错误的原因,继续测试
"index_uuid": "To8O7VKkR3OM_drdWZQIIA",
"index": "user"
}
],
"type": "search_phase_execution_exception",
"reason": "all shards failed",
"phase": "query",
"grouped": true,
"failed_shards": [
{
"shard": 0,
"index": "user",
"node": "w6AVu2CHT6OEaXAJmqT8mw",
"reason": {
"type": "query_shard_exception",
"reason": "failed to create query: Cannot search on field [age] since it is not indexed.",
"index_uuid": "To8O7VKkR3OM_drdWZQIIA",
"index": "user",
"caused_by": {
"type": "illegal_argument_exception",
"reason": "Cannot search on field [age] since it is not indexed."
}
}
}
]
},
"status": 400
}

上面说:age不允许被index( 检索 ) , 那么删掉它,再看效果

请求体变为如下:

点击查看代码

{
"query":{
"bool":{
"must":[
{
"match":{
"name":"邪"
}
},{ // 去掉了age属性
"match":{
"address":"地球村"
}
}
]
}
}
}

发现能够获取到结果

再变一下:

现在回到前面报的错:failed to create query: Cannot search on field [age] since it is not indexed

  • 为什么报这个错?其实已经告知得很清楚了:field [age] since it is not indexed 属性age不支持被检索,原因:

为什么前面使用"地球村"可以查到数据,而使用"地球"就不可以查到?

2.15.5、text和keyword类型的区别

  • text类型支持全文检索和完全查询,即:我搜索时只用字符串中的一个字符照样得到结果

    • 原理:text使用了分词,就是把字符串拆分为单个字符串了
  • keyword类型支持完全查询,即:精确查询,前提:index不是false

    • 原理:keyword不支持分词,所以:查询时必须是完全查询( 所有字符匹配上才可以 )

1 - 基于ELK的ElasticSearch 7.8.x 技术整理 - 基础语法篇 - 更新完毕的更多相关文章

  1. 2 - 基于ELK的ElasticSearch 7.8.x技术整理 - java操作篇 - 更新完毕

    3.java操作ES篇 3.1.摸索java链接ES的流程 自行创建一个maven项目 3.1.1.依赖管理 点击查看代码 <properties> <ES-version>7 ...

  2. 3 - 基于ELK的ElasticSearch 7.8.x技术整理 - 高级篇( 偏理论 )

    4.ES高级篇 4.1.集群部署 集群的意思:就是将多个节点归为一体罢了( 这个整体就有一个指定的名字了 ) 4.1.1.window中部署集群 - 了解即可 把下载好的window版的ES中的dat ...

  3. 4 - 基于ELK的ElasticSearch 7.8.x技术整理 - 高级篇( 续 ) - 更新完毕

    0.前言 这里面一些理论和前面的知识点挂钩的,所以:建议看一下另外3篇知识内容 基础篇:https://www.cnblogs.com/xiegongzi/p/15684307.html java操作 ...

  4. 基于ELK5.1(ElasticSearch, Logstash, Kibana)的一次整合测试

    前言开源实时日志分析ELK平台(ElasticSearch, Logstash, Kibana组成),能很方便的帮我们收集日志,进行集中化的管理,并且能很方便的进行日志的统计和检索,下面基于ELK的最 ...

  5. 基于ELK5.1(ElasticSearch, Logstash, Kibana)的一次整合

    前言开源实时日志分析ELK平台(ElasticSearch, Logstash, Kibana组成),能很方便的帮我们收集日志,进行集中化的管理,并且能很方便的进行日志的统计和检索,下面基于ELK的最 ...

  6. 基于ELK的简单数据分析

    原文链接: http://www.open-open.com/lib/view/open1455673846058.html 环境 CentOS 6.5 64位 JDK 1.8.0_20 Elasti ...

  7. 基于ELK进行邮箱访问日志的分析

    公司希望能够搭建自己的日志分析系统.现在基于ELK的技术分析日志的公司越来越多,在此也记录一下我利用ELK搭建的日志分析系统. 系统搭建 系统主要是基于elasticsearch+logstash+f ...

  8. 从0搭建一个基于 ELK 的日志、指标收集与监控系统

    为了使得私有化部署的系统能更健壮,同时不增加额外的部署运维工作量,本文提出了一种基于 ELK 的开箱即用的日志和指标收集方案. 在当前的项目中,我们已经使用了 Elasticsearch 作为业务的数 ...

  9. ELK stack elasticsearch/logstash/kibana 关系和介绍

    ELK stack elasticsearch 后续简称ES logstack 简称LS kibana 简称K 日志分析利器 elasticsearch 是索引集群系统 logstash 是日志归集集 ...

随机推荐

  1. LINKERD 2.11 中文实战手册

    1. 将您的服务添加到 Linkerd. 为了让您的服务利用 Linkerd,它们还需要通过将 Linkerd 的数据平面代理注入到它们的 pod 中来进行 网格化 . 2. 自动化的金丝雀发布. 通 ...

  2. [cf1444D]Rectangular Polyline

    由于两种线段要交替出现,有解的必要条件即为$h=v$(以下均记为$n$) 进一步的,再假设两种线段依次对应于向量$(a_{i},0)$和$(0,b_{i})$,根据题意要求向量长度为给定值且和为0,那 ...

  3. [atAGC022D]Shopping

    称0到$L$的方向为左,同时为了方便,可以假设$0<t_{i}\le 2L$ 当我们确定是进入店中的方向,根据这个店的位置以及购物时间,不难确定出来时火车经过0或$L$的次数,由于$0<t ...

  4. 国内首家!腾讯云正式成为 FinOps 基金会顶级会员

    11月24日,腾讯云正式宣布加入FinOps基金会,作为国内首家FinOps基金会顶级会员,腾讯云将联合FinOps基金会,全面推进对FinOps标准和最佳实践的贡献,为企业提供云财务管理的最佳解决方 ...

  5. 学以致用 | Redis概念与简单实操

    Redis概念 Redis是一个由C语言编写.基于key-value存储结构的开源NoSQL数据库,其读写速度为10万次/秒,这个速度已经远远大于传统的关系型数据库. 使用场景 在高并发的情况下,可将 ...

  6. electron另一种运行方式

    编写helloword 全局安装软件  npm install -g electron 快速编写html  html:5 完整代码和流程: 1.index.html  <!DOCTYPE htm ...

  7. javaweb监听

    监听项目启动 package com.java7115.quartz; import javax.servlet.ServletContextEvent; import javax.servlet.S ...

  8. Docker之容器化学习之路v20.10.3

    Docker概述 **本人博客网站 **IT小神 www.itxiaoshen.com Docker文档官网 Docker是一个用于开发.发布和运行应用程序的开放平台.Docker使您能够将应用程序与 ...

  9. Redis 很屌,不懂使用规范就糟蹋了

    这可能是最中肯的 Redis 使用规范了 码哥,昨天我被公司 Leader 批评了. 我在单身红娘婚恋类型互联网公司工作,在双十一推出下单就送女朋友的活动. 谁曾想,凌晨 12 点之后,用户量暴增,出 ...

  10. intent.getSerializableExtra(转)

    Activity之间通过Intent传递值,支持基本数据类型和String对象及它们的数组对象byte.byte[].char.char[].boolean.boolean[].short.short ...