开发者博客 – IT技术 尽在开发者博客

开发者博客 – 科技是第一生产力


  • 首页

  • 归档

  • 搜索

MySQL基本概念和正确发音(表、列、行、注解等讲解)

发表于 2021-11-08

「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」

1、什么是数据库

维基百科关于数据库的定义:

In computing, a database is an organized collection of data stored and accessed electronically from a computer system. Where databases are more complex they are often developed using formal design and modeling techniques.

翻译成中文的意思就是:在计算中,数据库是从计算机系统以电子方式存储和访问的有组织的数据集合。 在电脑中,我们可以将数据库理解成“文件柜”,需要存储的数据以某种方式进行组织,并存放在“文件柜”中。

DB和DBMS区别:

很多人会把DB和DBMS搞混淆,其实两者是两个东西。DB(database)指的是数据库容器;DBMS(database management system)指的是数据库管理系统。两者之间的关系是,数据库DB是通过数据库管理系统DBMS创建和操纵的容器。在实际使用中,我们并不直接访问数据库,而是使用DBMS来访问数据库。

2、MySQL数据库重要概念

2.1 表

表(table):指的是某种特定类型数据的结构化清单。

上述概念中有两个重要的知识点:

  • 特定类型 -> 指一种类型比如用户信息、订单信息、商品信息,表设计不允许杂糅各种数据类型
  • 结构化清单 -> 指表数据按照用户需求进行结构化拆分和组织的数据,比如用户信息拆分为用户名、性别、年龄等结构化数据

表在同一个数据库中不允许同名,不同数据库中允许同名

可以通过show tables查看数据库中的表

user表的结构化清单

2.2 列

列(column):表中的一个字段,一个表有一个或多个列组成。

在上述用户信息表中,拥有用户名列、性别列、年龄列等,这些列共同组成了用户表。

MySQL数据库中列都有其对应的数据类型。数据类型(datatype)会约束列所能存放的数据。比如可以防止在数值类型的字段中录入字符类型数据。

可以通过show full columns from 表名 查看表的具体列信息

2.3 行

行(row):表中的一条记录。

MySQL数据库中的数据以行的形式存储,每一条数据都是一行(也可以称之为记录),但是正确的没有歧义的说法是行(hang)。

2.4 主键

主键(primary key):一列或几个列,其值或组合值能够唯一区分表中的每个行。

主键就好比人的身份证号,它不会重复,可以用于标记认得身份。 值得注意的是,主键可以是多个列共同组成。

也可以通过DDL查看,主键用 PRIMARY KEY 标识

1
2
3
4
5
6
7
sql复制代码CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(255) NOT NULL COMMENT '姓名',
`age` int(11) NOT NULL COMMENT '年龄',
`sex` smallint(1) DEFAULT NULL COMMENT '性别',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

定义主键需要满足两个条件:

  1. 主键列数据不重复
  2. 主键列数据不为空(null)

只要满足这两个条件,列就可以作为主键。建议表设计时,一定要定义主键,拥有主键能够方便数据查询、删除、更新等操作,否则相对比较麻烦。

定义主键满足的两个规范:

  1. 主键值不应该更新
  2. 主键值不应该具有业务意义、也就是说除了标志作用,不应该用于其他业务使用

3、SQL应该怎么读

SQL是Strucctured Query Language的缩写,在读的时候我们可以拆开读S—— Q——L,大部分情况下我们是组合起来读的,应该读作sequel / [ˈsiːkwəl] .

此链接在线朗读

fanyi.baidu.com/?aldtype=16…

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

layui实现树形菜单(一)

发表于 2021-11-07

「这是我参与11月更文挑战的第 5 天,活动详情查看:2021最后一次更文挑战」

1、前言

​ 因为前段时间换了新工作。新的项目组要求前后端都写,前端是使用的layui。虽然说现在流行前后端分离,前端大多使用vue、react等模块化框架,但是还有好多公项目因为历史原因、人员因素等,使用的还是前后端一体或者前后端一起写。并且layui这种jQuery框架对后端开发来说也相对友好些。(PS:虽然layui的官网已经下架,但是在gitee的issue上还是有相关文档的镜像网站的,如:layui.itze.cn/ ,虽然有文档参考,但是在实际的开发过程中还是遇到了很多问题,踩了很多坑。主要是因为版本呢的不同导致的,我现在使用的是v2.2.5版本,参考文档的是v2.5,好多函数以及特性都不支持。但layui的源码大部分还是能看懂的,不懂得看看源码也就解决了。

​ 下面我们就详细介绍下,如何基于layui实现左侧树形菜单。

2、后端代码

​ 首先我们要在后端构建出树形结构的菜单数据。这里父子级关系的关联是将数据放在同一张表中根据parent_id来实现的,根节点的parent_id设为null或者000-000这样的。然后对于构建父子级结构推荐大家在代码中实现,而不是先查父级再for循环查子级,这样如果菜单数的深度很深的话是很浪费时间的。下面就上代码来具体说明下:

1、菜单数据的查询

​ 这里是根据用户查到所属角色,然后再根据角色信息查出角色的权限

1
2
3
4
xml复制代码	select cm.* from com_menu cm
inner join com_role_menu crm on crm.com_menu_id = cm.com_menu_id
inner join com_user_role cur on crm.com_role_id = cur.com_role_id
where cur.com_user_id = #{comUserId}

2、构建树形结构信息
这里我使用的双层循环来实现的,整体思路是遍历查找每一个元素的上一级,将子菜单添加到父级元素下,最后移除掉所有的子菜单就得到了一个树形菜单结构。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
java复制代码private static List<MenuTreeNode> getTreeMenu(List<MenuTreeNode> menuList) {
List<MenuTreeNode> removeMenus = new ArrayList<MenuTreeNode>();
for (int i = 0; i < menuList.size(); i ++) {
try {
MenuTreeNode currMenu = menuList.get(i);
String upperValue = currMenu.getUpperid();
if (StringUtils.isBlank(upperValue)) {
continue;
}
for (int j = 0; j < menuList.size(); j++) {
//从遍历查找上级
try {
MenuTreeNode upperMenu = menuList.get(j);
String baseValue = upperMenu.getCom_menu_id();
if (baseValue.equals(upperValue)) {
//找到上级、将该行添加到上级的childrens中
if (null == upperMenu.getChildren()) {
upperMenu.setChildren(new ArrayList<>());
}
upperMenu.getChildren().add(currMenu);
//保存要从menuList中移去的行,将在后面统一移去
removeMenus.add(currMenu);
break;
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
} catch (Exception e1) {
log.error(e1.getMessage(), e1);
}
}
menuList.removeAll(removeMenus);
return menuList;
}

​ 好了,这次就先分享到这里,下次为大家介绍下基于递归实现树形结构的构建以及前端代码的实现。

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

浅谈Java反射

发表于 2021-11-07

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」。

引言:之前学习了Java反射,但是没有及时写博客记录,最近学spring框架时候又遇到,就再次记录并巩固一下。

反射

Java反射机制是指在程序的运行过程中可以构造任意一个类的对象、获取任意一个类的成员变量和成员方法、获取任意一个对象所属的类信息、调用任意一个对象的属性和方法。反射机制使得Java具有动态获取程序信息和动态调用对象方法的能力。

Class c = Class.forName("java.lang.String");

反射的调用方法

可以通过以下类调用反射API。

  • Class类:可获得类属性方法
  • Field类:获得类的成员变量
  • Method类:获取类的方法信息
  • Construct类:获取类的构造方法等信息

具体如下:

1
2
3
4
java复制代码java.lang.Class:代表一个类
java.lang.reflect.Method:代表类的方法
java.lang.reflect.Field:代表类的成员变量
java.lang.reflect.Constructor:代表类的构造器

反射的优点

反射看起来好像比较复杂,都是创建对象,明明直接可以通过new创建,为什么要用反射呢?简单来说的话就是new一个对象只能在程序还没编译之前进行创建,而反射的话是在java文件编译成.class文件后进行新建对象。

简而言之就是当java文件编译生成.class文件后,如果代码出了问题,需要及时修改,这个时候如果使用的不是反射,那么则需要到代码源文件里面修改,并重新编译,程序比较大的时候会比较麻烦,所以需要反射来进行修改,比如说开始用的是Mysql突然要用Oracle了,这个时候用反射的话只要在运行时候修改配置文件的信息就可以了。

总结

Java反射在很多框架以及类中都有使用到,用的好的话可以极大的增加我们代码的灵活性,当然如果用的不好的话会消耗系统性能,增加代码复杂性。

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

《Elasticsearch核心技术与实战》笔记 -- 第一

发表于 2021-11-07

这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

视频课程:极客时间 – 《Elasticsearch核心技术与实战》

为什么要学ElasticSearch

elasticsearch概述1.png

  • 主要功能
    • 分布式搜索引擎
      • 大数据近实时分析引擎
  • 产品特征
    • 高性能,和T+1说不
      • 容易使用 / 容易拓展
  • 互联网公司大量使用 ElasticSearch
    • 阿里、腾讯、小米、饿了么、滴滴、携程等等
  • 应用场景
    • 网站搜索 / 垂直搜索 / 代码搜索
    • 日志管理分析 / 安全指标监控 / 应用性能监控 / WEB抓取舆情

学习目标

  • 开发
    • 产品基本功能,底层工作原理,数据建模最佳实践
  • 运维
    • 容量规划;性能优化;问题诊断;滚动升级;
  • 方案
    • 搜索与如何解决搜索的相关性问题
    • 大数据分析实践与项目实战,理论知识运用到实际场景

课程实战

  • 1、电影搜索
  • 2、Stack OverFlow 调查问卷数据分析

课程内容与结构

  • ElasticSearch 入门与深入
    • 环境搭建 / 搜索与聚合 / 架构原理 / 数据建模
  • ElasticSearch 集群管理
    • 水平扩展及性能优化 / 最佳实践
  • ELK 进行大数据分析
    • 可视化分析 / 时序型数据 / 异常检测
  • 项目实战和知识点回顾
    • 电影搜索 / 问卷分析 / Elastic认证

三点学习建议

  • 勤动手
    • 本地搭建多节点的集群环境,理解分布式工作原理,执行教程中的每一个范例
  • 多思考
    • 结合实际的业务场景,深入思考,学会查询相关的技术文档
  • 定目标
    • 做一次分享,开发一个具体的项目,参加 Elastic 认证考试

ElasticSearch简介及其发展历史

从开源到上市

  • Elastic Inc - 开源软件 / 上市 公司
  • 当前市值 154.62(美股) 亿美元(2021/11/05 20:00:00),开盘当天涨幅达 94%
  • ElasticSearch 软件下载量,超 3.5 亿次 【2018年官方数据 www.elastic.co/blog/ze-bel…
  • 10 万 + 的社区成员
  • 7200 + 订阅用户,分布在 100+ 国家
  • 云服务 - Elastic,Amazon,阿里巴巴,腾讯

ElasticSearch 简介

  • ElasticSearch -开源分布式搜索分析引擎
    • 近实时(Near Real TIme)
    • 分布式存储 / 搜索 / 分析引擎
  • Solr (Apache 开源项目)
  • Splunk (商业上市公司)

db-engines.png

ElasticSearch v.s. Solr

Google treads.png

起源 - Lucene

  • 基于 Java 语言开发的搜索引擎库类
  • 创建于 1999年,2005年成为 Apache 顶级开源项目
  • Lucene 具有高性能、易拓展的优点
  • Lucene 的局限性:
    • 只能基于 Java 语言开发
    • 类库的接口学习曲线陡峭
    • 原生并不支持水平拓展

ElasticSearch的诞生

Shay Banon, ElasticSearch 创始人,“Search is something that any application should hava.”

  • 2004 年 Shay Banon 基于 Lucene 开发了 Compass
  • 2010 年 Shay Banon 重写了 Compass,取名 ElasticSearch
    • 支持分布式,可水平拓展
    • 降低全文检索的学习曲线,可以被任何编程语言调用

ElasticSearch 的分布式架构

分布式架构.png

  • 集群规模可以从单个扩展到数百个节点
  • 高可用 & 水平扩展
    • 服务和数据两个维度
  • 支持不同的节点类型
    • 支持 Hot & Warm 架构

支持多种方式集成接入

  • 多种编程语言的类库(www.elastic.co/guide/en/el…
    • Java / .NET / Python / Ruby / PHP / Groovy / Perl / Go / JavaScript

ElasticSearch 的主要功能

  • 海量数据的分布式存储以及集群管理
    • 服务与数据的高可用,水平拓展
  • 近实时搜索,性能卓越
    • 结构化 / 全文 / 地理位置 / 自动完成
  • 海量数据的近实时分析
    • 聚合功能

ElasticSearch搜索功能.png

市场反应

  • 2010 年第一次发布;2012 年成立公司
  • 成立 6个月,160万下载,首轮募到 1000万美金风险投资
    • Rod Johnson – Spring Framework创始人
    • Benchmark Capital / Data Collective

ElasticSearch 版本与升级

  • 0.4 :2010 年 2 月 第一次发布
  • 1.0: 2014 年 1 月
  • 2.0:2015 年 10 月
  • 5.0:2016 年 10 月
  • 6.0:2017 年 10 月
  • 7.0:2019 年 4 月

EOL Support - www.elastic.co/cn/support/…

新特性 5.x

  • Lucene 6.x,性能提升,默认打分机制从 TF-IDF 改为 BM 25
  • 支持 Ingest 节点 / Painless Scripting / Completion suggested 支持 / 原生的 Java REST 客户端
  • Type 标记成 deprecated,支持了 Keyword 的类型
  • 性能优化
    • 内部引擎移除了避免同一文档并发更新的竞争锁,带来 15% - 20% 的性能提升
    • Instant aggregation,支持分片上聚合的缓存
    • 新增了 Profile API

新特性 6.x

  • Lucene 7.x
  • 新功能
    • 跨集群复制 (CCR)
    • 索引生命周期管理
    • SQL 的支持
  • 更友好的升级及数据迁移
    • 在主要版本之间的迁移更为简化,体验升级
    • 全新的基于操作的数据复制框架,可加快恢复数据
  • 性能优化
    • 有效存储稀疏字段的新方法,降低了存储成本
    • 在索引时进行排序,可加快排序的查询性能

新特性 7.x

  • Lucene 8.0
  • 重大改进 - 正式废除单个索引下多 Type 的支持
  • 7.1 开始,Security 功能免费试用 - 当前稳定版本 7.15
  • 部署k8s ECK - ElasticSearch Operator on Kuberneetes
  • 新功能
    • New Cluster coordination
    • Feature - Complete High Level REST Client
    • Script Score Query
  • 性能优化
    • 默认的 Primary Shard 数从 5 改为 1,避免 Over Sharding
    • 性能优化,更快的 Top K

Elastic Stack 家族成员及其应用场景

Elastic Stack 生态圈

elastic stack 生态圈.png

Logstash:数据处理管道

  • 开源的服务器端数据处理管道,支持从不同来源采集数据,转换数据,并将数据发送到不同的存储库中
  • Logstash 诞生于 2009 年,最初用来做日志的采集于处理
  • Logstash 创始人 Jordan Sisel
  • 2013 年被 ElasticSearch 收购
  • 社区文化:“Remember:if a new user has a bad time, it’s a bug in logstash”

Logstash 特性

  • 实时解析和转换数据
    • 从 IP 地址破译地理坐标
    • 将 PII 数据匿名化,完全排除敏感数据
  • 可扩展
    • 200 多个插件(日志 / 数据库 / Arcsign / Netflow)www.elastic.co/guide/en/lo…
  • 可靠性安全性
    • Logstash 会通过持久化队列来保证至少将运行中事件传送一次
    • 数据传输加密
  • 监控

Kibana 可视化分析利器

  • Kibana 名字的含义:Kiwifruit + Banana (猕猴桃 + 香蕉)
  • Kibana 创始人: Rashid Khan
  • 数据可视化工具,帮助用户解开对数据的任何查询
  • 基于 Logatesh 的工具,2013 年加入 Elastic 公司

Kibana 特性

  • 提供各种可视化的图表
  • 可以通过机器学习的技术,对异常情况进行检测,用于提前发现可疑问题

BEATS - 轻量的数据采集器

Beats 是一款轻量级的数据采集器,采用 Go 语言编写。它集合了多种单一用途数据采集器。这些采集器安装后可用作轻量型代理,从成百上千或成千上万台机器向 Logstash 或 Elasticsearch 发送数据。

  • 轻量 —— Beats 是数据采集的得力工具。将这些采集器安装在你的服务器中,它们就会把数据汇总到 Elasticsearch。如果需要更加强大的处理性能,Beats 还能将数据输送到 Logstash 进行转换和解析。
  • 可拓展 —— 每款开源采集器都是以用于转发数据的通用库 libbeat 为基石。需要监控某个专用协议,可以自己构建采集器。

Beats 系列

www.elastic.co/cn/products…

beats系列.png

X-Pack:商业化套件

  • 6.3 之前的版本,X-Pack 以插件方式安装
  • X-Pack 开源之后,ElasticSearch & Kibana 支持 OSS 版和 Basic 两种版本
    • 部分 X-Pack 功能支持免费使用,6.8 和 7.1 开始,Security 功能免费
  • OSS, Basic,黄金级, 白金级

日志的重要性

  • 为什么重要
    • 运维:医生给病人看病,日志就是病人对自己的陈述
    • 恶意攻击,恶意注册,刷单,恶意密码猜测
  • 挑战
    • 关注点很多,任何一个点都有可能引起问题
    • 日志分散在很多机器,出了问题时 ,才发现日志被删了
    • 很多运维人员是消防员,哪里有问题去哪里

日志的重要性.png

日志管理

日志管理.png

Elasticsearch 与数据库的集成

  • 单独使用 ElasticSearch 存储
  • 以下情况可考虑与数据库集成
    • 与现有系统的集成
    • 需考虑事务性
    • 数据更新频繁

指标分析 / 日志分析流程

分析流程.png

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

Java中最全面的SQL操作指南 SQL基础 基本SQL操作

发表于 2021-11-07

这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

SQL基础

创建数据库
1
sql复制代码CREATE DATABASE database_name
删除数据库
1
sql复制代码DROP DATABASE database_name
备份数据库
  • 创建备份的device:
1
2
sql复制代码USE master
EXEC sp_addumpdevice 'disk','database_backup','d:\mssql7backup\database_backup.dat'
  • 开始备份:
1
sql复制代码BACKUP DATABASE origin_database TO database_backup
分离数据库
1
sql复制代码sp_detach_db
附加数据库
1
sql复制代码sp_attach_db 'database_name','d:\mssql7backup\database_backup.dat'
修改数据库名称
1
sql复制代码sp_renamedb 'old_name','new_name'
创建新表
1
2
3
4
sql复制代码CREATE TABLE table_name (
col1 type1 [NOT NULL] [primary key],
col2 type2 [NOT NULL],
...)
根据已有的表创建新表
  • 根据旧表创建新表:
1
sql复制代码CREATE TABLE table_name LIKE table_old
1
sql复制代码CREATE TABLE tab_name AS SELECT col1,col2… FROM tab_old definition only
删除新表
1
sql复制代码DROP TABLE table_name
增加一个列
1
sql复制代码ALTER TABLE table_name ADD COLUMN col TYPE
  • 列增加后将不能删除,列加上后数据类型也不能改变,唯一能够改变的是增加varchar类型的长度
添加主键
1
sql复制代码ALTER TABLE table_name ADD PRIMARY KEY (col)
删除主键
1
sql复制代码ALTER TABLE table_name DROP PRIMARY KEY (col)
创建索引
1
sql复制代码CREATE [UNIQUE] INDEX index_name ON table_name (col,...)
删除索引
1
sql复制代码DROP INDEX index_name
  • 索引是不可更改的,想要更改索引必须删除重新建立新的索引
创建视图
1
sql复制代码CREATE VIEW view_name AS SELECT statement
删除视图
1
sql复制代码DROP VIEW view_name

基本SQL操作

查找
1
sql复制代码SELECT filed,... FROM table_name WHERE field LIKE ’%value%’
选择
1
sql复制代码SELECT field,... FROM table_name WHERE 范围
插入
1
sql复制代码INSERT INTO table_name (field1,field2) VALUES (value1,value2)
修改
1
sql复制代码UPDATE table_name SET field1=value1 WHERE 范围
删除
1
sql复制代码DELETE FROM table_name WHERE 范围
排序
1
sql复制代码SELECT filed,... FROM table_name ORDER BY field1,field2 [DESC]
总数
1
sql复制代码SELECT count AS total_count FROM table_name
求和
1
sql复制代码SELECT SUM(field) AS sum_value FROM table_name
平均
1
sql复制代码SELECT AVG(field) AS avg_value FROM table_name
最大
1
sql复制代码SELECT MAX(field) AS max_value FROM table_name
最小
1
sql复制代码SELECT MIN(field) AS min_value FROM table_name

SQL高级查询

UNION运算符
  • UNION运算符是通过组合其余两个结果表并且消去表中任何重复行而派生出一个结果表
  • 当UNION和ALL一起使用时,即UNION ALL, 此时不会消除重复行
EXCEPT运算符
  • EXCEPT运算符通过包括所有在某一个表但是不在另一个表中的行并消除所有重复行而派生出一个结果集
  • 当EXCEPT和ALL一起使用时,即EXPCET ALL, 此时不会消除重复行
INTERSECT运算符
  • INTERSECT运算符通过只包括两个表中都有的行并消除所有重复行而派生出一个结果集
  • 当INTERSECT和ALL一起使用时,即INTERSECT ALL, 此时不会消除重复行
LEFT JOIN
  • 左连接: 左外连接. 结果集既包括连接表的匹配行,也包括左连接表的所有行
1
sql复制代码SELECT a.a, a.b, a.c, b.c, b.d, b.f FROM a LEFT JOIN b ON a.a = b.c
RIGHT JOIN
  • 右连接: 右外连接. 结果集既包括连接表的匹配连接行,也包括右连接表的所有行
FULL JOIN
  • FULL JOIN或者CROSS JOIN
  • 全连接: 全外连接. 结果集既包括连接表的匹配行,也包括两个连接表中的所有记录
GROUP BY
  • 一张表,如果分组完成后,查询后,只能得到组相关信息
    • 统计信息:
      • COUNT
      • SUM
      • MAX
      • MIN
      • AVG
    • 分组的标准
  • 分组时: 不能以text, ntext, image类型的字段作为分组依据
  • 在SELECT统计函数中的字段,不能和普通字段放在一起

SQL提升

复制表
  • 复制表: 只复制表结构.源表名为a,新表名为b
1
sql复制代码SELECT filed,... INTO b FROM a WHERE 1<>1
1
sql复制代码SELECT TOP 0 field,... INTO b FROM a
拷贝表
  • 拷贝表: 拷贝数据.源表名a,新表名b
1
sql复制代码INSERT INTO b(a, b, c) SELECT d,e,f FROM a
跨数据库之间表的拷贝
  • 跨数据库之间的表的拷贝: 具体数据使用绝对路径
1
sql复制代码INSERT INTO b(a, b, c) SELECT d,e,f FROM b IN '"&Server.MapPath(".")&"\data.mdb" &"' where 条件
子查询
1
sql复制代码SELECT a,b,c FROM a WHERE a IN (SELECT d FROM b )
显示文章,提交人和最后回复时间
1
sql复制代码SELECT a.title,a.username,b.adddate FROM table_name a,(SELECT MAX(adddate) adddate FROM table_name WHERE table_name.title=a.title) b
连接查询
1
sql复制代码SELECT a.a, a.b, a.c, b.c, b.d, b.f FROM a LEFT OUT JOIN b ON a.a = b.c
视图查询
1
sql复制代码SELECT filed,... FROM (SELECT a,b,c FROM a) T WHERE t.a > 1
BETWEEN
  • BETWEEN:
    • BETWEEN限制查询数据范围时包括边界值
    • NOT BETWEEN限制查询数据范围时不包括边界值
1
2
3
sql复制代码SELECT a,b,c FROM table1 WHERE TIME BETWEEN time1 AND time2

SELECT a,b,c FROM table1 WHERE a NOT BETWEEN 数值1 AND 数值2
IN
1
sql复制代码SELECT a,b,c FROM table1 WHERE a [NOT] IN (‘值1’,’值2’,’值4’,’值6’)
EXISTS
  • 两张关联表,删除主表中已经在副表中没有的信息
1
sql复制代码DELETE FROM table1 WHERE NOT EXISTS (SELECT a,b,c FROM table2 WHERE table1.field1=table2.field1 )
四表联查
1
sql复制代码SELECT * FROM a LEFT INNER JOIN b ON a.a=b.b RIGHT INNER JOIN c ON a.a=c.c INNER JOIN d ON a.a=d.d WHERE 条件
日程安排提前5分钟提醒
1
sql复制代码SELECT filed,... FROM 日程安排 WHERE datediff('minute',f开始时间,getdate())>5
数据库分页
1
sql复制代码SELECT TOP 10 b.filed,... FROM (SELECT TOP 20 主键字段,排序字段 FROM 表名 ORDER BY 排序字段 DESC) a,表名 b WHERE b.主键字段 = a.主键字段 ORDER BY a.排序字段
查询前10条记录
1
sql复制代码SELECT TOP 10 field,... form table1 WHERE 范围
选择每一组b值相同的数据中a最大的记录的所有信息
  • 每月的排行榜
  • 热销产品分析
  • 按科目成绩排名
1
sql复制代码SELECT a,b,c FROM table_name ta WHERE a=(SELECT MAX(a) FROM table_name tb WHERE tb.b=ta.b)
包含所有在tableA中但是不在tableB和tableC中的行并消除所有重复行而派生出的一个结果表
1
sql复制代码SELECT a FROM tableA EXCEPT (SELECT a FROM tableB) EXCEPT (SELECT a FROM tableC)
随机取出10条数据
1
sql复制代码SELECT TOP 10 field,... FROM table_name ORDER BY newid()
随机选择记录
1
sql复制代码select newid()
删除重复记录
1
sql复制代码DELETE FROM table_name WHERE id NOT IN (SELECT MAX(id) FROM table_name GROUP BY col1,col2,...)
  • 下面这种做法可以实现删除重复记录,但是操作牵连到大量的数据移动,不适合大容量的数据操作:
1
2
3
sql复制代码SELECT DISTINCT field,... INTO TEMP FROM table_name
DELETE FROM table_name
INSERT INTO table_name SELECT field,... FROM TEMP
  • 示例: 在一个外部表导入数据,由于某些原因第一次只导入了一部分,但是很难判断具体位置,只有在下一次全部导入,这样也就产生好多重复的字段,需要删除重复的字段:
1
2
3
4
5
6
sql复制代码
ALTER TABLE table_name
ADD column_b INT IDENTITY(1,1)
DELETE FROM table_name WHERE column_b NOT IN(
SELECT MAX(column_b) FROM tablename GROUP BY column1,column2,...)
ALTER TABLE table_name DROP COLUMN column_b
列出数据库里所有的表名
1
sql复制代码SELECT name FROM sysobjects WHERE TYPE='用户名'
列出表里所有的列名
1
sql复制代码SELECT name FROM syscolumns WHERE id=object_id('table_name')
初始化表
1
sql复制代码TRUNCATE TABLE table_name
选择10到15的记录
1
sql复制代码SELECT TOP 5 field,... FROM (SELECT TOP 15 field,... FROM TABLE ORDER BY id ASC) a ORDER BY id DESC

基本SQL函数

字符串函数

DATALENGTH
  • DATALENGTH(char_expr): 返回字符串包含的字符数,但是不包含后面的空
SUBSTRING
  • SUBSTRING(expresion, start, length): 取子串,字符串的下标从 “1” 开始 ,start为起始位置 ,length为字符串长度.
  • 工程实践中,使用**LEN(expression)**取得表达式的长度
RIGHT
  • RIGHT(char_expr, int_expr): 返回字符串右边第int_expr个字符
LEFT
  • LEFT(char_expr, int_expr): 返回字符串左边第int_expr个字符
ISNULL
  • ISNULL(check_expression, replacement_value): 如果check_expression为空,则返回replacement_value的值.如果check_expression不为空,则返回check_expression表达式的值
SP_ADDTYPE
1
sql复制代码EXEC SP_ADDTYPE birthday, datetime, 'NULL'
SET NOCOUNT
  • SET NOCOUNT: 使返回的结果中不包含有关受Transact-SQL语句影响的行数的信息
  • 如果存储的过程中包含的一些语句并不返回许多实际的数据,那么该设置可以大量减少网络流量,显著提高性能
  • SET NOCOUNT是在执行或运行时设置,而不是在分析时设置:
    • 当SET NOCOUNT设置为NO时,不返回计数,即不返回受Transact-SQL语句影响的行数
    • 当SET NOCOUNT设置为OFF时,返回计数

SQL注意点

  • 在SQL查询中 ,FROM后面最多可以跟256张表或者视图
  • 在SQL语句中出现ORDER BY查询时,先进行排序,然后再取值
  • 在SQL中,一个字段的最大容量是8000, 而对于nvarchar而言最大容量是4000, 因为nvarchar是Unicode码

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

Redis去重4种方法

发表于 2021-11-07

数据仓库系列文章

  1. 数仓架构发展史
  2. 数仓建模方法论
  3. 数仓建模分层理论
  4. 数仓建模—宽表的设计
  5. 数仓建模—指标体系
  6. 一文搞懂ETL和ELT的区别
  7. 数据湖知识点
  8. 技术选型 | OLAP大数据技术哪家强?
  9. 数仓相关面试题
  10. 从 0 到 1 学习 Presto,这一篇就够了!
  11. 元数据管理在数据仓库的实践应用
  12. 做中台2年多了,中台到底是什么呢?万字长文来聊一聊中台
  13. 数据仓库之拉链表
  14. sqoop用法之mysql与hive数据导入导出

这篇文章主要介绍了Redis实现唯一计数的3种方法分享,本文讲解了基于SET、基于 bit、基于 HyperLogLog三种方法,需要的朋友可以参考下

唯一计数是网站系统中十分常见的一个功能特性,例如网站需要统计每天访问的人数 unique visitor (也就是 UV)。计数问题很常见,但解决起来可能十分复杂:一是需要计数的量可能很大,比如大型的站点每天有数百万的人访问,数据量相当大;二是通常还希望扩展计数的维度,比如除了需要每天的 UV,还想知道每周或每月的 UV,这样导致计算十分复杂。

在关系数据库存储的系统里,实现唯一计数的方法就是 select count(distinct <item_id>),它十分简单,但是如果数据量很大,这个语句执行是很慢的。用关系数据库另外一个问题是插入数据性能也不高。

Redis 解决这类计数问题得心应手,相比关系数据库速度更快,消耗资源更少,甚至提供了 3 种不同的方法。

1.基于 set

Redis 的 set 用于保存唯一的数据集合,通过它可以快速判断某一个元素是否存在于集合中,也可以快速计算某一个集合的元素个数,另外和可以合并集合到一个新的集合中。涉及的命令如下:

复制代码 代码如下:

1
2
3
sql复制代码SISMEMBER key member  # 判断 member 是否存在
SADD key member # 往集合中加入 member
SCARD key # 获取集合元素个数

基于 set 的方法简单有效,计数精确,适用面广,易于理解,它的缺点是消耗资源比较大(当然比起关系数据库是少很多的),如果元素个数很大(比如上亿的计数),消耗内存很恐怖。

2.基于 bit

Redis 的 bit 可以用于实现比 set 内存高度压缩的计数,它通过一个 bit 1 或 0 来存储某个元素是否存在信息。例如网站唯一访客计数,可以把 user_id 作为 bit 的偏移量 offset,设置为 1 表示有访问,使用 1 MB的空间就可以存放 800 多万用户的一天访问计数情况。涉及的命令如下:
复制代码 代码如下:

1
2
3
4
ini复制代码SETBIT key offset value  # 设置位信息
GETBIT key offset # 获取位信息
BITCOUNT key [start end] # 计数
BITOP operation destkey key [key ...] # 位图合并

基于 bit 的方法比起 set 空间消耗小得多,但是它要求元素能否简单映射为位偏移,适用面窄了不少,另外它消耗的空间取决于最大偏移量,和计数值无关,如果最大偏移量很大,消耗内存也相当可观。

3.基于 HyperLogLog

实现超大数据量精确的唯一计数都是比较困难的,但是如果只是近似的话,计算科学里有很多高效的算法,其中 HyperLogLog Counting 就是其中非常著名的算法,它可以仅仅使用 12 k左右的内存,实现上亿的唯一计数,而且误差控制在百分之一左右。涉及的命令如下:
复制代码 代码如下:

1
2
ini复制代码PFADD key element [element ...]  # 加入元素
PFCOUNT key [key ...] # 计数

这种计数方法真的很神奇,其中涉及到统计学中的一些均匀分布、随机概率、伯努利分布等,我也没有彻底弄明白,有兴趣可以深入研究相关文章。

redis 提供的这三种唯一计数方式各有优劣,可以充分满足不同情况下的计数要求。

  1. 基于bloomfilter

BloomFilter是利用类似位图或者位集合数据结构来存储数据,利用位数组来简洁的表示一个集合,并且能够快速的判断一个元素是不是已经存在于这个集合。虽然BloomFilter不是100%准确,但是可以通过调节参数,使用Hash函数的个数,位数组的大小来降低失误率。这样调节完全可以把失误率降低到接近于0。可以满足大部分场景了。

假如此时有一个集合S = {x1, x2, … xn},Bloom Filter使用k个独立的hash函数,分别将集合中的每一个元素映射到{1,…,m}的范围。对于任何一个元素,被映射到的数字作为对应的位数组的索引,该位会被置为1。比如元素x1被hash函数映射到数字8,那么位数组的第8位就会被置为1。下图中集合S只有两个元素x和y,分别被3个hash函数进行映射,映射到的位置分别为(0,3,6)和(4,7,10),对应的位会被置为1:
bloomfilter
现在假如要判断另一个元素是否是在此集合中,只需要被这3个hash函数进行映射,查看对应的位置是否有0存在,如果有的话,表示此元素肯定不存在于这个集合,否则有可能存在。

redis使用布隆过滤器需要安装插件:https://blog.csdn.net/u013030276/article/details/88350641。

猜你喜欢

Hive计算最大连续登陆天数

Hadoop 数据迁移用法详解

Hbase修复工具Hbck

数仓建模分层理论

一文搞懂Hive的数据存储与压缩

大数据组件重点学习这几个

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

领域驱动模型(DDD)学习笔记

发表于 2021-11-07

领域驱动的核心思想

将对软件的分析和设计还原到真实的客观世界中。

一个复杂系统的领域驱动设计,是以子域为中心进行领域建模绘制出一张一张的领域模型设计。

DDD的真谛

领域建模,即深入理解业务。

设计思路

  • 贫血模型
    在软件设计中,POJO对象中,他们只有get/set 方法,没有业务逻辑。
  • 充血模型
    在软件设计中,POJO对象中,他们只有get/set 方法,有业务逻辑。
  • 两种设计思路的优劣比较:*

充血模型:

保持了对象的封装性,使得领域模型在面临多态,继承等复杂结构时,易于变更。
保持了领域模型的原貌,需求变更可以直接映射成程序变更。
需要开发人员需要更高的分析业务、业务建模与设计能力。

贫血模型:

更加容易应对复杂的业务处理场景
将复杂的业务处理场景,划分为多个相对独立的步骤,然后交给多个service串联执行。

聚合的设计思路:

聚合体现的是一种整体与部分的关系,对比数据库中的一对多的关系,比如订单和订单明细的关系。
一个订单对象中包含了多条订单明细,并且将他们做成了一个聚合。

仓库

采用仓库的概念完成对数据库的访问。

工厂

是领域对象生命周期的起点。
比如:系统要通过id装载(查询)一个订单对象

  • 订单仓库将任务交个订单工厂,订单工厂分别调用订单dao,订单明细dao和用户dao去查询。
  • 将订单明细对象和用户对象,分别set到订单对象的订单明细和用户属性中。
  • 订单工厂将装配好的订单对象返回给订单仓库。

DDD 是如何解决微服务拆分的?

微服务拆分原则:

  • 高内聚:就是单一职责原则,将代码修改的范围缩小到这个微服务内。
  • 低耦合:具体可通过接口调用其他服务。

架构师需要的能力:

  • 能够将业务转换为技术,将业务需求落地到技术方案。
  • 能合理利用技术支撑业务。

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

CentOS7搭建nfs共享服务

发表于 2021-11-07

需求背景

相信做Java开发的小伙伴可能都会遇到这样的需求,在生产环境多台机器需要访问一台机器上数据,这样的数据一般都是为了统一管理和存储,并且呢,这样的数据一般比较大,不容易进行迁移,因此我需要多台机器访问一台机器的上的数据的功能。

技术路线1

About Samba

Samba is the standard Windows interoperability suite of programs for Linux and Unix.

Samba is Free Software licensed under the GNU General Public License, the Samba project is a member of the Software Freedom Conservancy.

Since 1992, Samba has provided secure, stable and fast file and print services for all clients using the SMB/CIFS protocol, such as all versions of DOS and Windows, OS/2, Linux and many others.

Samba is an important component to seamlessly integrate Linux/Unix Servers and Desktops into Active Directory environments. It can function both as a domain controller or as a regular domain member.

安装Samba并配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ini复制代码 # 在线安装samba和samba-client
 yum install samba samba-client
 # 使用vim编辑smb.conf
 vi /etc/samba/smb.conf
 ​
 [global]
 workgroup = WORKGROUP
 server string = Samba Server %v
 netbios name = centos
 security = user
 map to guest = bad user
 dns proxy = no
 ​
 # Share Definition
 [Anonymous]
 path = /samba/anonymous
 browsable =yes
 writable = yes
 guest ok = yes
 read only = no
 ​

添加用户

1
bash复制代码 useradd -s /sbin/nologin/sambauser

设置密码

1
css复制代码 smbpasswd -a sambauser

检测用户是否添加成功

1
复制代码 pdbedit -L

设置samba服务开机自启

1
2
3
4
bash复制代码 systemctl enable smb.service
 systemctl enable nmb.service
 systemctl restart smb.service
 systemctl restart nmb.service

设置samba服务可以通过防火墙防御

1
2
css复制代码 firewall-cmd --permanent --zone=public --add-service=samba
 firewall-cmd --reload

测试语法是否正确

1
复制代码 testparam

开始挂载

1
bash复制代码 Mount –t cift //192.168.10.18:/share /share –o username=sambatest,password=xxxy

修改服务端口

samba服务默认使用的是445端口,按照如下方式可以进行修改:

1
2
3
4
5
ini复制代码 vim /etc/samba/smb.conf
 #在[global]内加入一行
 smb ports = 4455
 #重启samba服务
 systemctl restart smbd

查看服务状态

1
lua复制代码 systemctl status smbd
1
bash复制代码 tail /var/log/samba/log.smbd

查看服务是否运行在4455端口

1
css复制代码 lsof -i:4455

对不同版本的Windows做了抓包测试,发现WinXP只访问139端口,Win7同时访问139与445端口,Win10只访问445端口

技术路线2

About nfs

NFS 就是 Network FileSystem 的缩写,最早之前是由 Sun这家公司所发展出来的 。 它最大的功能就是可以透过网络,让不同的机器、不同的操作系统、可以彼此分享文件。

服务端在线安装nfs

1
2
3
4
5
6
7
8
9
bash复制代码 # 使用yum安装nfs-utils时会把rpcbind一起安装上
 yum -y install nfs-utils
 # 编辑exports文件,添加客户端机器
 vim /etc/exports  
 #配置说明
 #/opt/nfs ,这个是本地要共享出去的目录
 # 192.168.0.0/24 ,允许访问的主机,可以是一个IP:192.168.0.4,也可以是一个IP段:192.168.227.0/24
 /opt/nfs 192.168.0.150(rw,sync,fsid=0) 192.168.0.151(rw,sync,fsid=0)  
 ​

设置nfs服务端开机自启

1
2
3
4
5
bash复制代码 systemctl enable rpcbind.service    
 systemctl enable nfs-server.service
 ​
 systemctl start rpcbind.service    
 systemctl start nfs.service

确认NFS服务器启动成功

1
css复制代码 rpcinfo -p

通过查看service列中是否有nfs服务来确认NFS是否启动

1
arduino复制代码 showmount -e 192.168.0.3 // 主机IP

在客户端安装nfs服务

1
2
3
4
5
bash复制代码 yum install -y nfs-utils
 ​
 systemctl enable rpcbind.service
 ​
 systemctl start rpcbind.service

注意:客户端不需要启动nfs服务,只需要启动rpcbind服务.

检查nfs服务器端是否有目录共享

1
复制代码 showmount -e 192.168.0.3

使用 mount 挂载A服务器端的目录/opt/nfs到客户端B的目录/opt/nfs下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
ruby复制代码 [root@localhost ~]# mkdir /opt/nfs   
 ​
 [root@localhost ~]# mount -t nfs 192.168.0.3:/opt/nfs/ /opt/nfs/  
 ​
 mount 102.64.102.134:/mnt/data/ Z: (102.64.102.134存储共享)  
 [root@localhost ~]# df -h  
 ​
 文件系统                   容量 已用 可用 已用% 挂载点    
 ​
 /dev/mapper/centos-root     11G 1.3G 9.1G   13% /    
 ​
 devtmpfs                   911M     0 911M   0% /dev    
 ​
 tmpfs                     921M     0 921M   0% /dev/shm    
 ​
 tmpfs                     921M 8.5M 912M   1% /run    
 ​
 tmpfs                     921M     0 921M   0% /sys/fs/cgroup    
 ​
 /dev/sda1                 497M 170M 328M   35% /boot    
 ​
 tmpfs                     185M     0 185M   0% /run/user/0    
 ​
 192.168.227.3:/opt/nfs   11G 1.3G 9.1G   13% /opt/nfs
 ​
 # 挂载完成,可以正常访问本机下的/opt/nfs,如果在服务端A在共享目录/opte/nfs中
 写入文件,B、C机上可以看到,但是不能在这个目录中写入文件.

如果需要A、B、C三台机器都能够向共享目录写入文件,可按照如下操作进行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
bash复制代码 [root@localhost home]# id root   
 ​
 uid=0(root) gid=0(root) 组=0(root)
 ​
 2、在A服务器上再建立一个共享目录
 ​
 mkdir /opt/nfs1
 ​
 # vim /etc/exports  
 ​
 /opt/nfs 192.168.0.4(rw,sync,fsid=0) 192.168.0.5(rw,sync,fsid=0)    
 ​
 /opt/nfs1 192.168.0.0/24(rw,sync,all_squash,anonuid=0,anongid=0)
 ​
 加入第二行,anonuid=0,anongid=0即为root用户id。
 ​
 3、让修改过的配置文件生效
 ​
 exportfs –arv
 ​
 使用exportfs命令,当改变/etc/exports配置文件后,不用重启nfs服务直接用这个exportfs即可,它的常用选项为[-aruv].    
 ​
 -a :全部挂载或者卸载;      
 ​
 -r :重新挂载;      
 ​
 -u :卸载某一个目录;      
 ​
 -v :显示共享的目录;
 ​
 4、 查看新的可挂载目录及可连接的IP
 ​
 showmount -e 192.168.0.3    
 ​
 5、在B、C clinet端新挂载一个目录
 ​
 showmount -e 192.168.0.3 #查看新的挂载共享目录是否有了。
 ​
 mkdir nfs1  
 ​
 mount -t nfs 192.168.0.3:/opt/nfs1/ /opt/nfs1/    
 ​
 ll / >/opt/nfs1/ll.txt   #测试向新的共享目录中可以写入文件了。    
 ​
 (卸载挂载:umount /home/nfs1/)
 ​
 6、想在客户机B、C上实现开机挂载,则需要编辑/etc/fstab:
 ​
 vim /etc/fstab
 ​
 加入以下内容:
 ​
 192.168.0.3:/opt/nfs                 /opt/nfs   nfs   nolock   0 0  
 ​
 192.168.0.3:/opt/nfs1               /opt/nfs1 nfs   nolock   0 0
 ​
 保存后,重新挂载
 ​
 mount

\

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

Mysql 温故知新系列「普通查询 排序」

发表于 2021-11-07

「这是我参与11月更文挑战的第 7 天,活动详情查看:2021最后一次更文挑战」

简单查询

查询的模版: select * from table_name,这里的 * 指查询出指定表的全部字段,我们可以将 * 替换为我们具体需要查询的某些字段

需要注意的一个点,在日常的开发中,sql 中非常不建议使用 *,理由有 2 :

  1. 若表进行了字段扩充的话,在 mapper 层需要增加对应的字段映射,哪怕是那个 sql 中确实没有使用到
  2. * 查询出的字段顺序,是以表中字段创建的排序为准,若字段调整,亦或插入了非表尾的地方插入了新字段,这都会影响到 mapper 的映射
  3. 一个更加实际的问题,使用 * 查询全部会拖慢 sql 的执行速度,同时,由于 mybaits 对多余的字段做了映射,此项操作也会存在性能的损耗

口说无凭,以我手里现有的数据为例:

image.png

image.png

有 23 个字段,且总记录数为 37000

先执行数次 select * 操作

image.png

查询大概需要 0.29s

image.png

以我们查询必要的几个字段示例,4 个字段,耗时大概为 0.1s,性能对比起来确实会有很大的改进

排序

在我们常规的表设计中,使用表自增主键+系统时间,查询出来的数据默认使用插入的顺序,看起来就像是 id 升序排列,以及创建时间升序排列

image.png

这种排序方式通常情况下都能用。但是,当用户关注 sparator_line 这一列时,数据就显得杂乱无章,这时候,就需要我们手动指定排序的字段以及方式

排序语句; order by column [asc] 。排序有两种,一种是的升序 asc,不显示指定则默认为此;另一种则是需要显示指定的降序 desc

image.png

有时会有多字段排序的需求,比如在按 字段1 升序排列的结果上,对 字段1 中值相同的数据,按照 字段2 降序排列。如果还需要根据 字段3 进行排序,则在上一步排序的基础上,对 字段2 相同值的数据再排列。多个排序条件之间,使用 , 分隔

以此份数据为例,先按 sparator_line 升序,再按 time 降序

image.png

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

DNS简介

发表于 2021-11-07

这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

DNS是什么?

DNS是 Domain Name System 的缩写,也就是 域名解析系统,它的作用非常简单,就是根据域名查出对应的 IP地址。

为什么需要DNS?

IP地址是网络上标识站点的数字地址,为了方便记忆,采用域名来代替IP地址标识站点地址。域名解析就是域名到IP地址的转换过程。域名的解析工作由DNS服务器完成。

比如说我们访问百度, www.baidu.com, 我们通过IP很难记住但是通过一些域名方便用户记忆。

image.png

域名的形式

域名可以划分为各个子域,子域还可以继续划分为子域的子域,这样就形成了顶级域、二级域、三级域等。

我们可以看下百度知道网站的地址为例子说明一下。

image.png

其中顶级域名分为:国家顶级域名、通用顶级域名、反向域名。

国家顶级域名 中国:cn, 美国:us,英国uk…
通用顶级域名 com公司企业,edu教育机构,gov政府部门,int国际组织,mil军事部门 ,net网络,org非盈利组织…
反向域名 arpa,用于PTR查询(IP地址转换为域名)

域名的层级

  • 根域名 :.root 或者 . ,根域名通常是省略的
  • 顶级域名,如 .com,.cn 等
  • 次级域名,如 baidu.com 里的 baidu,这个是用户可以进行注册购买的
  • 主机域名,比如 baike.baidu.com 里的baike,这个是用户可分配的

主机名.次级域名.顶级域名.根域名

baike.baidu.com.root

image.png

还有一种展示方式因特网域名空间结构

image.png

比如:www.baidu.com

  1. com: 一级域名. 表示这是一个企业域名。同级的还有 “net”(网络提供商), “org”(⾮非盈利组织) 等。
  2. baidu: 二级域名,指公司名。
  3. www: 表示主机域名为 www。

DNS 资源记录

在 DNS 服务器上,一个域名及其下级域名组成一个区域 (Zone)。一个 Zone的 相关的 DNS 信息构成一个数据库文件。

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

1…400401402…956

开发者博客

9558 日志
1953 标签
RSS
© 2025 开发者博客
本站总访问量次
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4
0%