使用Docker部署ElasticSearch7+ELK(附带ES操作操作命令集)

ElasticSearch 7+ELK

  • 程序安装
    • Docker安装
      • 下载ES镜像
      • 提前创建挂载文件夹
      • 添加配置文件
      • 创建并启动容器
      • 可能出现的异常
      • 安装IK分词
      • 使用ElasticHD客户端工具(目前使用发现无法做增删改)
      • 安装Kibana
    • 软件包安装
      • 安装ElasticSearch(需要JDK1.8+)
      • 安装IK(下载和elasticsearch相同版本的IK)
      • 安装Kibana(下载和elasticsearch相同版本)
      • 安装Filebeat(可以理解为简化版的logstash)
  • 实操
    • ElasticSearch
      • 基础操作命令
        • 1. 查看节点状态
        • 2、查看索引
        • 3、查看节点列表
      • 操作分词器命令
        • 1、ES默认分词器
        • 2、IK最小切分
        • 3、IK最细粒度切分 全部词库的可能
        • 4、创建索引时设置默认分词器,如果不设置默认就是standard分词器
      • 操作索引命令
        • 1、增加索引
        • 2、创建带字段规则的索引 类似表字段类型
        • 3、创建带字段规则+默认分词器的索引
        • 4、删除索引
      • POST和PUT的区别
      • 操作document命令
        • 1、新增document
        • 2、搜索 type 全部数据
        • 3、查找指定 id 的 document 数据
        • 4、修改 document
        • 5、删除一个 document
        • 6、按条件查询(全部)
        • 7、按照字段的分词查询
        • 8、按照分词子属性查询
        • 9、按照短语查询
        • 10、模糊查询(如果分词器中没有对应分词可以使用)
        • 11、查询后过滤
        • 12、查询前过滤(推荐使用)
        • 13、按范围过滤
        • 14、排序
        • 15、分页查询
        • 16、指定查询的字段
        • 17、聚合
        • 18、高亮
      • 关于Mapping
        • 1、查看mapping
        • 2、手动指定Mapping
    • IK
      • IK分词器细粒度的拆分
      • 自定义ik词汇

程序安装

Docker安装

下载ES镜像

docker pull elasticsearch:7.6.1

提前创建挂载文件夹

mkdir -p /home/docker/elasticsearch/config
mkdir -p /home/docker/elasticsearch/data
mkdir -p /home/docker/elasticsearch/plugins# 创建好之后需要给/home/docker/elasticsearch目录赋予777权限 不然启动会失败
sudo chmod -R 777 /home/docker/elasticsearch/

添加配置文件

vi /home/docker/elasticsearch/config/elasticsearch.yml# 添加以下配置
# 集群名称
cluster.name: "docker-cluster" 
# 节点名称
node.name: node1
# http端口
http.port: 9200
# 访问权限
network.host: 0.0.0.0
http.host: 0.0.0.0

创建并启动容器

docker run --name elasticsearch -p 9200:9200  -p 9300:9300 \-e "discovery.type=single-node" \-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \-v /home/docker/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \-v /home/docker/elasticsearch/data:/usr/share/elasticsearch/data \-v /home/docker/elasticsearch/plugins:/usr/share/elasticsearch/plugins \--restart always-d elasticsearch:7.6.1

说明

  • -p 端口映射
  • -e discovery.type=single-node 单点模式启动
  • -e ES_JAVA_OPTS=“-Xms512m -Xmx512m”:设置启动占用的内存范围
  • -v 目录挂载
  • –restart always docker容器启动时自动启动
  • -d 后台运行

可能出现的异常

1、 因虚拟内存太少导致
处理:sudo sysctl -w vm.max_map_count=655360

安装IK分词

下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.6.1

# 创建目标文件夹,ES会自动读取plugins这个目录下的插件
mkdir -p /home/docker/elasticsearch/plugins/ik
# 将下载好的ik分词器放入/home/docker/elasticsearch/plugins/ik下
# 解压
unaip elasticsearch-analysis-ik-7.6.1.zip

使用ElasticHD客户端工具(目前使用发现无法做增删改)

ElasticHD轻量使用方便,在window环境下提供了一个exe程序
下载地址:https://github.com/qax-os/ElasticHD/tags

安装Kibana

1、下载镜像

docker pull kibana:7.6.1

2、创建挂载文件和目录

mkdir -p /home/docker/elasticsearch/kibana/config/
vi /home/docker/elasticsearch/kibana/config/kibana.yml
# 添加以下配置# Default Kibana configuration for docker target
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://172.16.2.109:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: "zh-CN" #汉化

3、启动

docker run -d \--name=kibana \--restart=always \-p 5601:5601 \-v /home/docker/elasticsearch/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml \kibana:7.6.1

软件包安装

百度网盘图灵资料中有

安装ElasticSearch(需要JDK1.8+)

1、Elasticsearch下载地址
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.1-linux-x86_64.tar.gz

2、解压elasticsearch-7.6.1-linux-x86_64.tar.gz到/usr/local/目录
tar -avxf elasticsearch-7.6.1-linux-x86_64.tar.gz -C /usr/local/

3、进入解压后的elasticsearch目录
(1)新建data目录:mkdir data
(2)修改config/elasticsearch.yml:vim config/elasticsearch.yml
取消下列项注释并修改:

cluster.name: my-application #集群名称
node.name: node-1 #节点名称
#数据和日志的存储目录
path.data: /usr/local/elasticsearch-7.6.1/data
path.logs: /usr/local/elasticsearch-7.6.1/logs
#设置绑定的ip,设置为0.0.0.0以后就可以让任何计算机节点访问到了
network.host: 0.0.0.0
http.port: 9200 #数据交互端口
#设置在集群中的所有节点名称,这个节点名称就是之前所修改的,当然你也可以采用默认的也行,目前是单机,放入一个节点即可
cluster.initial_master_nodes: ["node-1"]#开启跨域访问支持,默认为false  
http.cors.enabled: true  
#跨域访问允许的域名地址,(允许所有域名)以上使用正则  
http.cors.allow-origin: /.*/ 

(3)修改 ./config/jvm.options: vim config/jvm.options

-Xms200m
-Xmx200m

4、启动ES(ES不能使用root用户启动需要创建新用户)
(1)创建用户
adduser es
passwd es
(2)改一下es目录所属用户:
chown es /usr/local/elasticsearch-7.6.1/ -R
(3)vim 编辑 vim /etc/security/limits.conf,在末尾加上

es soft nofile 65536
es hard nofile 65536
es soft nproc 4096
es hard nproc 4096

(4)vim 编辑 vim /etc/security/limits.d/20-nproc.conf,将* 改为用户名(es):

es          soft    nproc     4096
root       soft    nproc     unlimited

(5)vim 编辑 vim /etc/sysctl.conf,在末尾加上:

vm.max_map_count = 655360

(6)执行: sysctl -p

(7)登录刚才新建的es用户,并启动elasticsearch
su es
./bin/elasticsearch (前台启动)
./bin/elasticsearch -d(后台启动)

(8)关闭elasticsearch
kill -9 pid 直接杀掉进程
//搜索es进程pid
ps aux | grep elasticsearch

安装IK(下载和elasticsearch相同版本的IK)

1、切换目录
cd /usr/local/elasticsearch-7.6.1/plugins/
2、创建ik文件夹
mkdir ik
3、切换到ik文件夹下进行文件上传
cd ik
4、没有unzip命令的同学输入如下命令安装unzip命令
yum install -y unzip
5、对zip进行解压
unzip elasticsearch-analysis-ik-7.6.1.zip

安装Kibana(下载和elasticsearch相同版本)

1、下载kibana
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.6.1-linux-x86_64.tar.gz

2、解压
tar -zxvf kibana-7.6.1-linux-x86_64.tar.gz kibana-7.6.1

3、修改kibana配置文件kibana.yml

vim config/kibana.yml# 放开注释,将默认配置改成如下:server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://127.0.0.1:9200"]
server.name: "one-server" #随意
i18n.locale: "zh-CN" #汉化

4、启动kibana
./kibana --allow-root
nohup ./kibana --allow-root & (后台启动)
5、关闭kibana
kill -9 pid 直接杀掉进程
//搜索es进程pid
netstat -tunlp|grep 5601

安装Filebeat(可以理解为简化版的logstash)

1、参考资料
https://www.cnblogs.com/zsql/p/13137833.html#_label2_0

2、filebeat和logstash的关系
因为logstash是jvm跑的,资源消耗比较大,所以后来作者又用golang写了一个功能较少但是资源消耗也小的轻量级的logstash-forwarder。不过作者只是一个人,加入http://elastic.co公司以后,因为es公司本身还收购了另一个开源项目packetbeat,而这个项目专门就是用golang的,有整个团队,所以es公司干脆把logstash-forwarder的开发工作也合并到同一个golang团队来搞,于是新的项目就叫filebeat了。

3、官网下载,选择和ES相同的二进制版本
https://www.elastic.co/cn/downloads/past-releases#filebeat

4、将下载好的压缩包放入需要收集日志的服务器中并且解压

tar -xzvf filebeat-7.6.1-linux-x86_64.tar.gz

在这里插入图片描述
5、编写配置

# 在filebeat-7.6.1-linux-x86_64目录内新建一个配置文件
touch filebeat_log.yml
# 编辑添加需要的配置文件夹信息
vi filebeat_log.yml
#添加以下信息
# filebeat.inputs.type :输入文件类型  log:日志类型
# enabled:是否开启
# paths:日志文件目录 可以写多个
# output.elasticsearch.hosts:ES服务地址
filebeat.inputs:
- type: logenabled: truepaths:- /var/mq/log/server.log.*output.elasticsearch:hosts: ["192.168.21.130:9200", "192.168.21.131:9200", "192.168.21.132:9200"]

6、Kibana中查看日志
1、先查看Filebeat创建索引的名称
Management->索引管理
在这里插入图片描述
2、配置查看这个日志
logs->设置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实操

  • 1、http://note.youdao.com/noteshare?id=83ea7925e0a1ae40e037f682b98d9874&sub=07E63083340A409683C3D8B26786C549
  • 2、https://note.youdao.com/ynoteshare/index.html?id=7fffae927f3bc06aab2fdc663ec5cad3&type=note&_time=1648026973975

ElasticSearch

text类型在存储数据的时候会默认进行分词,并生成索引。而keyword存储数据的时候,不会分词建立索引,显然,这样划分数据更加节省内存。
这样,我们映射了某一个字段为keyword类型之后,就不用设置任何有关分词器的事情了,该类型就是默认不分词的文本数据类型。而对于text类型,我们还可以设置它的分词类型。

基础操作命令

在这里插入图片描述

1. 查看节点状态
GET /_cat/health?v前两个是时间戳,其余含义如下:
1. cluster ,								集群名称
2. status,									集群状态 green代表健康;yellow代表分配了所有主分片,但至少缺少一个副本,此时集群数据仍旧完整;red代表部分主分片不可用,可能已经丢失数据。
3. node.total,								代表在线的节点总数量
4. node.data,								代表在线的数据节点的数量
5. shards, active_shards 					存活的分片数量
6. pri,active_primary_shards			    存活的主分片数量 正常情况下 shards的数量是pri的两倍。
7. relo, relocating_shards 				迁移中的分片数量,正常情况为 0
8. init, initializing_shards 				初始化中的分片数量 正常情况为 0
9. unassign, unassigned_shards 			未分配的分片 正常情况为 0
10. pending_tasks,							准备中的任务,任务指迁移分片等 正常情况为 0
11. max_task_wait_time,					任务最长等待时间
12. active_shards_percent,					正常分片百分比 正常情况为 100%
2、查看索引
GET /_cat/indices?v含义:
1. health						索引健康状态
2. status						索引的开启状态
3. index						索引名称
4. uuid							索引uuid
5. pri							索引主分片数
6. rep							索引副本分片数量
7. docs.count					索引中文档总数
8. docs.deleted					索引中删除状态的文档
9. store.size					主分片+副本分分片的大小
10. pri.store.size				主分片的大小
3、查看节点列表
GET /_cat/nodes?v

在这里插入图片描述

操作分词器命令

1、ES默认分词器
POST _analyze{"analyzer":"standard","text":"中国共产党"}
2、IK最小切分
GET _analyze
{"analyzer": "ik_smart","text": "中国共产党"
}
3、IK最细粒度切分 全部词库的可能
GET _analyze
{"analyzer": "ik_max_word","text": "中国共产党"
}
4、创建索引时设置默认分词器,如果不设置默认就是standard分词器
# 设置分词器
PUT /myindex
{"settings" : {"index" : {"analysis.analyzer.default.type": "ik_max_word"}}
}
# 查看分词器  如果自定义设置了分词器可以在索引信息中看到设置的分词器名称,如果没有使用的就是系统默认分词器
GET myindex

操作索引命令

1、增加索引
PUT /test01

在这里插入图片描述

2、创建带字段规则的索引 类似表字段类型
PUT /test02
{"mappings": {"properties": {"name":{"type": "text"},"age":{"type": "long"},"birthday":{"type": "date"},"info":{"type": "text","fields" : { # 添加一个类型 让info可以支持排序和聚合查询"keyword" : {"type" : "keyword","ignore_above" : 256}}}}}
}
3、创建带字段规则+默认分词器的索引
PUT /test03
{"mappings": {"properties": {"name":{"type": "text"},"age":{"type": "long"},"birthday":{"type": "date"}}},"settings" : {"index" : {"analysis.analyzer.default.type": "ik_max_word"}}
}
4、删除索引
DELETE /test01

在这里插入图片描述

POST和PUT的区别

  • 1、PUT、GET、DELETE是幂等的
  • 2、POST /uri 创建 PUT /uri/xxx 更新或创建
  • 3、POST不用加具体的id,它是作用在一个集合资源之上的(/uri),而PUT操作是作用在一个具体资源之上的(/uri/xxx)。在ES中,如果不确定document的ID(documents具体含义见下),那么直接POST对应uri( “POST /website/blog” ),ES可以自己生成不会发生碰撞的UUID;如果确定document的ID,比如 “PUT /website/blog/123”,那么执行创建或修改(修改时_version版本号提高1)

操作document命令

1、新增document

说明: 如果之前没建过 index 或者 type,es 会自动创建。

PUT /movie_index/movie/1
{ "id":1,"name":"operation red sea","doubanScore":8.5,"actorList":[  {"id":1,"name":"zhang yi"},{"id":2,"name":"hai qing"},{"id":3,"name":"zhang han yu"}]
}
PUT /movie_index/movie/2
{"id":2,"name":"operation meigong river","doubanScore":8.0,"actorList":[  {"id":3,"name":"zhang han yu"}]
}PUT /movie_index/movie/3
{"id":3,"name":"incident red sea","doubanScore":5.0,"actorList":[  {"id":4,"name":"zhang chen"}]
}
2、搜索 type 全部数据
GET /movie_index/movie/_search
3、查找指定 id 的 document 数据
GET /movie_index/movie/1
4、修改 document

A. 整体替换
说明: 修改和新增没有区别,是做一个覆盖操作

PUT /movie_index/movie/3
{"id":"3","name":"incident red sea","doubanScore":"8.0","actorList":[  {"id":"1","name":"zhang chen"}]
}

B. 只修改某个字段

POST /movie_index/movie/3/_update
{"doc": {"doubanScore":"8.1"}
}
5、删除一个 document
DELETE /movie_index/movie/3
6、按条件查询(全部)
GET /movie_index/movie/_search
{"query": {"match_all": {}}
}
7、按照字段的分词查询
GET /movie_index/movie/_search
{"query": {"match": {"name": "sea"}}
}
8、按照分词子属性查询
GET /movie_index/movie/_search
{"query": {"match": {"actorList.name": "zhang"}}
}
9、按照短语查询

说明: 按照短语查询是指匹配某个 field 的整个内容, 不再利用分词技术

GET /movie_index/movie/_search
{"query": {"match_phrase": {"name": "operation red"}}
}
10、模糊查询(如果分词器中没有对应分词可以使用)

说明: 校正匹配分词,当一个单词都无法准确匹配,es 通过一种算法对非常接近的单词也给与一定的评分,能够查询出来,但是消耗更多的性能。

GET /movie_index/movie/_search
{"query": {"fuzzy": {"name": "red"}}
}
11、查询后过滤
GET /movie_index/movie/_search
{"query": {"match": {"name": "red"}},"post_filter": {"term": {"actorList.id": "3"}}
}
12、查询前过滤(推荐使用)
GET movie_index/movie/_search
{"query": {"bool": {"filter": [{"term": {"actorList.id": 3}},{"term":{"actorList.id": 1}}],"must": {"match": {"name": "red"}}}}
}
13、按范围过滤
GET movie_index/movie/_search
{"query": {"bool": {"filter": {"range": {"doubanScore": {"gt": 5,"lt": 9}}}}}
}
14、排序
GET movie_index/movie/_search
{"query":{"match": {"name":"red operation"}}, "sort": [{"doubanScore": {"order": "desc"}}]
}
15、分页查询
# from 从第一条数据开始 size:查询几条
GET movie_index/movie/_search
{"query": { "match_all": {} },"from": 1,"size": 1
}
16、指定查询的字段
GET movie_index/movie/_search
{"query": { "match_all": {} },"_source": ["name", "doubanScore"]
}
17、聚合
# 每个演员参演了多少部电影 (按名字进行计数)
GET movie_index/movie/_search
{"aggs": {"groupby_actor": {"terms": {"field": "actorList.name.keyword"}}}
}
18、高亮
GET /movie_index/movie/_search
{"query": {"match": {"name": "sea"}},"highlight":{"fields":{"name":{}}}
}#自定义高亮标签
GET /movie_index/movie/_search
{"query": {"match": {"name": "sea"}},"highlight":{"pre_tags": "<p style='color:red'>","post_tags": "</p>","fields":{"name":{}}}
}

关于Mapping

通过 Mapping 来设置和查看每个字段的数据类型.

1、查看mapping
GET movie_index/_mapping
2、手动指定Mapping

A:搭建索引

# type:字段类型  
# index:是否建立倒排索引 默认值:true建立  
# store:是否存储数据 默认值: true存储  如果不存储这个字段有索引能通过这个字段查询,但是获取不到这个值的内容
PUT /movie_chn?include_type_name=true
{"mappings": {"movie":{"properties": {"id":{"type": "long","index": false,"store": true},"name":{"type": "text", "analyzer": "ik_smart"},"doubanScore":{"type": "double"},"actorList":{"properties": {"id":{"type":"long"},"name":{"type":"keyword"}}}}}}
}

B:插入数据

PUT /movie_chn/movie/1
{ "id":1,"name":"红海行动","doubanScore":8.5,"actorList":[  {"id":1,"name":"张译"},{"id":2,"name":"海清"},{"id":3,"name":"张涵予"}]
}
PUT /movie_chn/movie/2
{"id":2,"name":"湄公河行动","doubanScore":8.0,"actorList":[  {"id":3,"name":"张涵予"}]
}PUT /movie_chn/movie/3
{"id":3,"name":"红海事件","doubanScore":5.0,"actorList":[  {"id":4,"name":"张晨"}]
}

C:查询

GET /movie_chn/movie/_search
{"query": {"match": {"name": "红海"}}
}GET /movie_chn/movie/_search
{"query": {"term": {"actorList.name": "张"}}
}

IK

IK分词器细粒度的拆分

1、ik_smart:会将文本做最粗粒度的拆分,例如「中华人民共和国国歌」会被拆分为「中华人民共和国、国歌」
2、ik_max_word:会将文本做最细粒度的拆分,例如「中华人民共和国国歌」会被拆分为「中华人民共和国、中华人民、中华、华人、人民共和国、人民、人、民、共和国、共和、和、国国、国歌」,会穷尽各种可能的组合

GET _analyze
{"analyzer": "ik_smart","text": "中华人民共和国国歌"
}GET _analyze
{"analyzer": "ik_max_word","text": "中华人民共和国国歌"
}

自定义ik词汇

1、进入elasticsearch/plugins/ik/config目录
2、新建一个myDict.dic文件,编辑内容(以utf8无bom保存, 如果不行加一些换行或者空出第一行)
3、修改IKAnalyzer.cfg.xml(在ik/config目录下)
在这里插入图片描述
4、重启es

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

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

相关文章

(二)激光线扫描-相机标定

1. 何为相机标定? 当相机拍摄照片时,我们看到的图像通常与我们实际看到的不完全相同。这是由相机镜头引起的,而且发生的频率比我们想象的要高。 这种图像的改变就是我们所说的畸变。一般来说,畸变是指直线在图像中出现弯曲或弯曲。 这种畸变我们可以通过相机标定来进行解…

论坛项目知识回顾

目录 一. MySQL 建表 二. MyBatis 三. dao层 四. service层 五. controller层 六 component层 七. configuration层 八. utils 包 九. common 包 十. Exception 十一. interceptor包 十二. 代码有使用什么SpringBoot注解 一. MySQL 建表 首先使用 MySQL 进行表的创…

【iptables 实战】06 iptables网络防火墙实验

一、现状说明 在上一节中&#xff0c;我们将两个网段的机器&#xff0c;通过中间机器的网络转发&#xff0c;能达到互通。再来回顾一下这个网络连接的图 这一节&#xff0c;我们将通过设置机器B的iptables规则&#xff0c;来做一些防火墙实验 机器A模拟公网的一台服务器&#…

【生命周期】

生命周期 1 引出生命周期2 分析生命周期3 总结生命周期 1 引出生命周期 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta …

微服务技术栈-认识微服务和第一个微服务Demo

文章目录 前言一、认识微服务二、微服务技术栈三、Eureka注册中心四、微服务DEMO1、搭建eureka-server2、服务注册和服务发现 总结 前言 随着业务的不断复杂&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。 本章就从微服…

【JVM】垃圾回收(GC)详解

垃圾回收&#xff08;GC&#xff09;详解 一. 死亡对象的判断算法1. 引用计数算法2. 可达性分析算法 二. 垃圾回收算法1. 标记-清除算法2. 复制算法3. 标记-整理算法4. 分代算法 三. STW1. 为什么要 STW2. 什么情况下 STW 四. 垃圾收集器1. CMS收集器&#xff08;老年代收集器&…

算法-动态规划/trie树-单词拆分

算法-动态规划/trie树-单词拆分 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/word-break/description/?envTypestudy-plan-v2&envIdtop-interview-150 1.2 题目描述 2 动态规划 2.1 解题思路 dp[i]表示[0, i)字符串可否构建那么dp[i]可构建的条件是&…

【计算机网络黑皮书】应用层

【事先声明】 这是对于中科大的计算机网络的网课的学习笔记&#xff0c;感谢郑烇老师的无偿分享 书籍是《计算机网络&#xff08;自顶向下方法 第6版&#xff09;》 需要的可以私信我&#xff0c;无偿分享&#xff0c;课程简介下也有 课程连接 目录 应用层网络应用的原理应用架…

Linux使用之xshell、xftp保姆教学(含安装包,详细使用方法,连接失败解决方法)

前言 链接: FTP&#xff0c;SSH服务器介绍 这是我之前写的一篇博客&#xff0c;其中介绍了Ubuntu操作系统的一些常用命令以及服务器介绍&#xff0c;这篇文章就向大家详细介绍如何安装及应用这些服务器&#xff0c;我以xshell、xftp为例。 安装包&#xff0c;使用方法&#xf…

快速上手Apache POI

哈喽~大家好&#xff0c;这篇我们来看看快速上手Apache POI。 &#x1f947;个人主页&#xff1a;个人主页​​​​​ &#x1f948; 系列专栏&#xff1a;【日常学习上的分享】 &#x1f949;与这篇相关的文章&#xff1a; Red…

认识柔性数组

在C99中&#xff0c;结构中的最后一个元素允许是未知大小的数组&#xff0c;这就叫做柔性数组成员 限制条件是&#xff1a; 结构体中最后一个成员未知大小的数组 1.柔性数组的形式 那么我们怎样写一个柔性数组呢 typedef struct st_type {int i;int a[0];//柔性数组成员 }ty…

Moonbeam Ignite强势回归

参与Moonbeam上最新的流动性计划 还记得新一轮的流动性激励计划吗&#xff1f;Moonbeam Ignite社区活动带着超过300万枚GLMR奖励来啦&#xff01;体验新项目&#xff0c;顺便薅一把GLMR羊毛。 本次Moonbeam Ignite活动的参与项目均为第二批Moonbeam生态系统Grant资助提案中获…