YAML
YAML是一种数据序列化语言而不是标记语言,其语法比较简洁直观,特点是使用空格来表达层次结构,其最大的优势是在数据结构的表达上,且能配合大多数编程语言使用,因此YAML更多应用于配置文件的编写,其文件一般以.yml
为后缀。
由于其语法的特殊性,没有编辑器可能容易写错,因而在此推荐一个无广告的yaml在线格式化网站:JS-YAML,其可以直接将yaml转化为json。
基础语法
YAML对大小写敏感
YAML用
#
表示注释,且只支持单行注释用缩进表示层级关系
- 缩进只能使用空格,不能用TAB字符
- 缩进的空格数量不做要求,但要求同一层级的元素左侧必须对齐
一个文件中可以包含多个文件的内容
用三个破折号
"---"
表示一份内容的开始用三个小数点
"..."
表示一份内容的结束(非强制)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 这是第一份内容
one:1
# 其他内容
...
# 这是第二份内容
two:2
# 其他内容
# 第一份内容转换结果如下:
# 'one:1'
# 第二份内容转换结果如下:
# 'two:2'
数据结构与类型
对象
用来表示以键值对(key:value)形式出现的数据。
使用“冒号+空格”来分开键与值,对应JSON中的
"key":"value"
1
2
3
4
5#yaml
key:value
# 内容转换结果如下:
# 'key:value'支持多层嵌套(用缩进表示层级关系)
1
2
3
4
5
6key:
child-key1:value1
child-key2:value2
# 内容转换结果如下:
# { key: 'child-key1:value1 child-key2:value2' }支持用花括号包裹,逗号加空格分隔的流式风格语法:
1
2
3
4key:{ child-key1:value1, child-key2:value2 }
# 内容转换结果如下:
# 'key:{ child-key1:value1, child-key2:value2 }'用问号声明一个复杂对象,且允许使用多个词汇(数组)来组成键:
1
2
3
4
5
6
7
8
9?
- keypart1
- keypart2
:
- value1
- value2
# 内容转换结果如下:
# { 'keypart1,keypart2': [ 'value1', 'value2' ] }
数组
一组以破折号+空格的区块形式为开头的数据便组成了一个数组:
1
2
3
4
5
6
7values:
- value1
- value2
- value3
# 内容转换结果如下:
# { values: [ 'value1', 'value2', 'value3' ] }与此同时也支持用方括号包裹、逗号加空格分隔的内联格式来表达
1
2
3
4values:[value1, value2, value3]
# 内容转换结果如下:
# 'values:[value1, value2, value3]'支持多为数组(用缩进表示层级关系)
1
2
3
4
5
6
7
8
9
10values:
-
- value1
- value2
-
- value3
- value4
# 内容转换结果如下:
# { values: [ [ 'value1', 'value2' ], [ 'value3', 'value4' ] ] }
标量
表示YAML中最基本的数据类型
字符串
字符串一般不需要引号包裹,但是如果字符串中使用了反斜杠
"\"
开头的转义字符就必须使用引号包裹1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19strings:
- Hello without quote # 不用引号包裹
- Hello
world #拆成多行后会自动在中间添加空格
- 'Hello with single quotes' # 单引号包裹
- "Hello with double quotes" # 双引号包裹
- "I am fine. \u263A" # 使用双引号包裹时支持Unicode编码
- "\x0d\x0a is \r\n" # 使用双引号包裹时还支持Hex编码
- 'He said: "Hello!"' # 单双引号支持嵌套
# 内容转换结果如下:
# { strings:
# [ 'Hello without quote',
# 'Hello world',
# 'Hello with single quotes',
# 'Hello with double quotes',
# 'I am fine. ☺',
# '\r\n is \r\n',
# 'He said: "Hello!"' ] }对于多行的文字,YAML提供了两种特殊的语法支持
保留换行
使用竖线符
"|"
来表示该语法,每行的缩进和行尾空白都会被去掉,而额外的缩进会被保留1
2
3
4
5
6
7
8
9lines: |
我是第一行
我是第二行
我是第三行
我是第四行
我是第五行
# 内容转换结果如下:
# { lines: '我是第一行\n我是第二行\n 我是第三行\n 我是第四行\n我是第五行 \n' }
折叠换行
使用右尖括号
">"
来表示该语法,只有空白行才会被识别为换行,原来的换行符都会被转换成空格1
2
3
4
5
6
7
8
9
10
11lines: >
我是第一行
我也是第一行
我还是第一行
我仍然是第一行
我是第二行
我也是第二行
# 内容转换结果如下:
# { lines: '我是第一行 我也是第一行 我还是第一行 我仍然是第一行\n我是第二行 我也是第二行\n' }
布尔值
"true"、"True"、"TRUE"、"yes"、"Yes"和“YES"皆为真
"false"、"False"、"FALSE"、"no"、"No"和“NO"皆为假
1
2
3
4
5
6
7
8boolean:
- true # True、TRUE
- yes # Yes、YES
- false # False、FALSE
- no # No、NO
# 内容转换结果如下:
# { boolean: [ true, 'yes', false, 'no' ] }
整数
支持二进制表示
1
2
3
4
5
6int:
- 666
- 0001_0000 #二进制表示
# 内容转换结果如下:
# { int: [ 666, 10000 ] }
浮点数
支持科学计数法
1
2
3
4
5
6float:
- 3.14
- 6.8523015e+5 # 使用科学计数法
# 内容转换结果如下:
# { float: [ 3.14, 685230.15 ] }
空值(Null)
"null"、"Null"和"~"都是空,不指定值默认也是空
1
2
3
4
5
6
7
8nulls:
- null
- Null
- ~
-
# 内容转换结果如下:
# { nulls: [ null, null, null, null ] }
时间戳
YAML也支持ISO 8601格式的时间数据
1
2
3
4
5
6
7
8
9
10date1: 2020-05-26
date2: 2020-05-26T01:00:00+08:00
date3: 2020-05-26T02:00:00.10+08:00
date4: 2020-05-26 03:00:00.10 +8
# 内容转换结果如下:
# { date1: Tue May 26 2020 08:00:00 GMT+0800 (中国标准时间),
# date2: Tue May 26 2020 01:00:00 GMT+0800 (中国标准时间),
# date3: Tue May 26 2020 02:00:00 GMT+0800 (中国标准时间),
# date4: Tue May 26 2020 03:00:00 GMT+0800 (中国标准时间) }
类型转换
YAML支持使用严格类型标签的双感叹号+目标类型形式,即("
!!
")来强制转换类型1
2
3
4
5
6
7
8
9a: !!float '666'
b: '666'
c: !!str 666
d: !!str 666.66
e: !!str true
f: !!str yes
# 内容转换结果如下:
# { a: 666, b: '666', c: '666', d: '666.66', e: 'true', f: 'yes' }
其他高级类型
YAML也可以使用更高级的类型,但不一定兼容所有解析器,包括集合、有序映射、十六进制数据和二进制数据等
数据重用与合并
为了避免过多重复的定义,YAML提供了由锚点标签
"&"
和引用标签"*"
组成的语法,凭借此可以快速引用一些相同的数据1
2
3
4
5
6
7
8
9a: &anchor #设置锚点
one: 1
two: 2
three: 3
b: *anchor #引用锚点
# 内容转换结果如下:
# { a: { one: 1, two: 2, three: 3 },
# b: { one: 1, two: 2, three: 3 } }配合合并标签
"<<"
使用可以与任意数据进行合并,以此实现类似于C++中继承的功能1
2
3
4
5
6
7
8
9
10
11
12
13
14
15human: &base # 添加名为base的锚点
body: 1
hair: 999
singer:
<<: *base # 引用base锚点,实例化时会自动展开
skill: sing # 添加额外的属性
programer:
<<: *base # 引用base锚点,实例化时会自动展开
hair: 6 # 复写base中的属性
skill: code # 添加额外的属性
# 内容转换结果如下:
# { human: { body: 1, hair: 999 },
# singer: { body: 1, hair: 999, skill: 'sing' },
# programer: { body: 1, hair: 6, skill: 'code' } }
Redis
Redis是一个用C语言编写的、开源的、基于内存运行并支持持久化的、高性能的NoSQL数据库,具有支持数据持久化、支持多种数据结构、支持数据备份等特点,通常被称为数据结构服务器。
NoSQL数据库泛指非关系型数据库,其去掉了关系数据库的关系型特性,是为了解决大规模数据集合多重数据种类带来的问题而生。
Windows安装
Redis下载地址:点击前往
打开上述的下载地址后,可以在网页下方的Assets处看到目前支持的版本,找到最新的版本下载安装即可。
注:msi格式的为Windows的安装文件,双击即可进行安装,而zip包和tar.gz包则需要先解压再安装。
安装好后,需要着重关注以下几个文件:
文件名 | 作用 |
---|---|
redis.windows.conf | Redis 运行的配置文件。 |
redis-benchmark.exe | Redis 性能测试的工具。 |
redis-check-aof.exe | Redis 的 aof 文件修复的工具。 |
redis-check-dump.exe | Redis 的 rdb 文件修复的工具。 |
redis-cli.exe | Redis 的客户端。 |
redis-server.exe | Redis 的服务端。 |
Redis数据类型
Redis支持五种数据类型:string(字符串)、hash(哈希)、list(列表)、set(集合)及zset(有序集合)。
String类型
string是Redis最基本的类型,一个key对应一个value(即键值对)。Redis的string可以包含任何数据,如jpg图片或序列化图像等,其一个键最大可以存储512MB的数据。
1 | #设置website值 |
Hash类型
hash是一个键值对集合,其是一个string类型的field和value的映射表,适合用于存储对象,每个hash可以存储 4294967295个键值对。
1 | #设置一个对象webinfo,它的键webname对应的值为tangmenjue,键weburl对应的值为tangmenjue.top,webtype对应的类型为it |
List类型
Redis的list类型是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的左边或右边。
1 | #向列表tangmenjue.top里添加Redis、Vue 和Pgsql3个元素 |
Set类型
Redis的Set是string类型的无序集合,集合是通过哈希表来实现的,因此添加、删除、查找的复杂度都是O(1)。每个集合中最大可存储4294967295个成员。
1 | #向集合tangmenjue.top添加Redis、Vue 和Pgsql3个元素 |
ZSet类型
zset和set一样也是string类型元素的集合且不允许成员重复。
与set不同的是,每个元素都会关联一个double类型的分数,通过这个分数来为集合中的成员按从大到小进行排序。zset成员是唯一的,但分数(score)是可以重复的。
1 | #向有序集合tangmenjue.top添加分数为0的Redis值 |
连接本地Redis
进入到Redis所在目录,在地址栏输入cmd,此时会在当前目录打开命令行窗口,如下图所示:
在命令行中输入以下命令后回车,启动redis server客户端:
1
2
3
4
5E:\Redis>redis-server.exe
[4524] 16 Dec 11:48:29.399 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
[4524] 16 Dec 11:48:29.399 # Redis version=5.0.14.1, bits=64, commit=ec77f72d, modified=0, pid=4524, just started
[4524] 16 Dec 11:48:29.399 # Configuration loaded
[4524] 16 Dec 11:48:29.401 # Could not create server TCP listening socket 127.0.0.1:6379: bind: 操作成功完成。此时可以看到redis server的运行信息,说明redis server运行成功。
接下来不要关闭这个Redis server,重新在地址栏输入cmd,打开一个新的命令行。在命令行中输入以下命令后回车,启动redis client端:
1
2PS E:\Redis> redis-cli.exe
127.0.0.1:6379>看到127.0.0.1:6379则表明此时已经成功连接上了本地Redis服务器。
在redis client端的cmd上输入以下命令后回车,以此来测试redis-cli客户端是否能连接上redis服务器:
1
2
3
4127.0.0.1:6379> ping
PONG
#当看到输出PONG时则表示连接成功
注意:若是启动redis server客户端时出现以下错误:
1 | E:\Redis>redis-server.exe |
出现这一错误则则可以将启动命令改为如下命令:
1 | E:\Redis>redis-server.exe redis.windows.conf |
连接远程Redis
在Redis根目录下打开cmd,使用redis-cli客户端,连接远程redis服务的语法为:
1 | redis-cli -h host -p port -a password |
Redis配置
使用redis-cli客户端连接上redis服务器后,可以使用config命令来查看或设置redis的配置,也可以直接修改安装目录下的redis.windows.conf文件来修改配置。
config相关命令如下:
config get key
:获取配置项为key的配置,配置项不存在时返回(empty list or set)
config get *
:获取所有配置config set key "value"
:设置配置项key的值为value