唐抉的个人博客

YAML与Redis的基本运用

字数统计: 3.6k阅读时长: 15 min
2022/12/16

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
    6
    key:
    child-key1:value1
    child-key2:value2

    # 内容转换结果如下:
    # { key: 'child-key1:value1 child-key2:value2' }

  • 支持用花括号包裹,逗号加空格分隔的流式风格语法:

    1
    2
    3
    4
    key:{ 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
    7
    values:
    - value1
    - value2
    - value3

    # 内容转换结果如下:
    # { values: [ 'value1', 'value2', 'value3' ] }

  • 与此同时也支持用方括号包裹、逗号加空格分隔的内联格式来表达

    1
    2
    3
    4
    values:[value1, value2, value3]

    # 内容转换结果如下:
    # 'values:[value1, value2, value3]'

  • 支持多为数组(用缩进表示层级关系)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    values:
    -
    - 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
    19
    strings:
    - 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
      9
      lines: |
      我是第一行
      我是第二行
      我是第三行
      我是第四行
      我是第五行

      # 内容转换结果如下:
      # { lines: '我是第一行\n我是第二行\n 我是第三行\n 我是第四行\n我是第五行 \n' }

  • 折叠换行

    • 使用右尖括号">"来表示该语法,只有空白行才会被识别为换行,原来的换行符都会被转换成空格

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      lines: >
      我是第一行
      我也是第一行
      我还是第一行
      我仍然是第一行

      我是第二行
      我也是第二行

      # 内容转换结果如下:
      # { lines: '我是第一行 我也是第一行 我还是第一行 我仍然是第一行\n我是第二行 我也是第二行\n' }

布尔值

  • "true"、"True"、"TRUE"、"yes"、"Yes"和“YES"皆为

  • "false"、"False"、"FALSE"、"no"、"No"和“NO"皆为

    1
    2
    3
    4
    5
    6
    7
    8
    boolean:
    - true # True、TRUE
    - yes # Yes、YES
    - false # False、FALSE
    - no # No、NO

    # 内容转换结果如下:
    # { boolean: [ true, 'yes', false, 'no' ] }

整数

  • 支持二进制表示

    1
    2
    3
    4
    5
    6
    int:
    - 666
    - 0001_0000 #二进制表示

    # 内容转换结果如下:
    # { int: [ 666, 10000 ] }

浮点数

  • 支持科学计数法

    1
    2
    3
    4
    5
    6
    float:
    - 3.14
    - 6.8523015e+5 # 使用科学计数法

    # 内容转换结果如下:
    # { float: [ 3.14, 685230.15 ] }

空值(Null)

  • "null"、"Null"和"~"都是空,不指定值默认也是空

    1
    2
    3
    4
    5
    6
    7
    8
    nulls:
    - null
    - Null
    - ~
    -

    # 内容转换结果如下:
    # { nulls: [ null, null, null, null ] }

时间戳

  • YAML也支持ISO 8601格式的时间数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    date1: 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
    9
    a: !!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
    9
    a: &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
    15
    human: &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
2
3
4
5
6
7
8
9
10
11
#设置website值
127.0.0.1:6379> set website tangmenjue.top
OK

#获取website值
127.0.0.1:6379> get website
"tangmenjue.top"

#删除website值
127.0.0.1:6379> del website
(integer) 1

Hash类型

hash是一个键值对集合,其是一个string类型的field和value的映射表,适合用于存储对象,每个hash可以存储 4294967295个键值对。

1
2
3
4
5
6
7
8
9
10
11
12
13
#设置一个对象webinfo,它的键webname对应的值为tangmenjue,键weburl对应的值为tangmenjue.top,webtype对应的类型为it
127.0.0.1:6379> hmset webinfo webname tangmenjue weburl tangmenjue.top webtype it
OK

#获取webinfo对象中,weburl、webname、webtype的键值
127.0.0.1:6379> hmget webinfo weburl webname webtype
1) "tangmenjue.top"
2) "tangmenjue"
3) "it"

#删除对象webinfo
127.0.0.1:6379> del webinfo
(integer) 1

List类型

Redis的list类型是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的左边或右边。

1
2
3
4
5
6
7
8
9
10
11
12
13
#向列表tangmenjue.top里添加Redis、Vue 和Pgsql3个元素
127.0.0.1:6379> lpush tangmenjue.top Redis Vue Pgsql
(integer) 3

#获取列表tangmenjue.top的下标从0到3的数据
127.0.0.1:6379> lrange tangmenjue.top 0 3
1) "Pgsql"
2) "Vue"
3) "Redis"

#删除值
127.0.0.1:6379> del tangmenjue.top
(integer) 1

Set类型

Redis的Set是string类型的无序集合,集合是通过哈希表来实现的,因此添加、删除、查找的复杂度都是O(1)。每个集合中最大可存储4294967295个成员。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#向集合tangmenjue.top添加Redis、Vue 和Pgsql3个元素
127.0.0.1:6379> sadd tangmenjue.top Redis Vue Pgsql
(integer) 3

#继续向集合tangmenjue.top添加元素Sqlserver,此时返回1表示成功
127.0.0.1:6379> sadd tangmenjue.top Sqlserver
(integer) 1

#继续向集合tangmenjue.top添加元素Redis,此时返回0表示失败。因为集合中已有Redis,不可重复插入
127.0.0.1:6379> sadd tangmenjue.top Redis
(integer) 0

#获取集合tangmenjue.top的所有元素
127.0.0.1:6379> smembers tangmenjue.top
1) "Pgsql"
2) "Sqlserver"
3) "Vue"
4) "Redis"

#删除集合tangmenjue.top
127.0.0.1:6379> del tangmenjue.top
(integer) 1

ZSet类型

zset和set一样也是string类型元素的集合且不允许成员重复。

与set不同的是,每个元素都会关联一个double类型的分数,通过这个分数来为集合中的成员按从大到小进行排序。zset成员是唯一的,但分数(score)是可以重复的。

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
#向有序集合tangmenjue.top添加分数为0的Redis值
127.0.0.1:6379> zadd tangmenjue.top 0 Redis
(integer) 1

#向有序集合tangmenjue.top添加分数为1的Vue值
127.0.0.1:6379> zadd tangmenjue.top 1 Vue
(integer) 1

#向有序集合tangmenjue.top添加分数为2的Pgsql值和分数为3的Sqlserver值
127.0.0.1:6379> zadd tangmenjue.top 2 Pgsql 3 Sqlserver
(integer) 2

#获取有序集合tangmenjue.top的所有数据,并打印出分数
127.0.0.1:6379> zrange tangmenjue.top 0 -1 withscores
1) "Redis"
2) "0"
3) "Vue"
4) "1"
5) "Pgsql"
6) "2"
7) "Sqlserver"
8) "3"

#删除有序集合tangmenjue.top
127.0.0.1:6379> del tangmenjue.top
(integer) 1

连接本地Redis

进入到Redis所在目录,在地址栏输入cmd,此时会在当前目录打开命令行窗口,如下图所示:

  • 在命令行中输入以下命令后回车,启动redis server客户端:

    1
    2
    3
    4
    5
    E:\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
    2
    PS 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
    4
    127.0.0.1:6379> ping
    PONG

    #当看到输出PONG时则表示连接成功

注意:若是启动redis server客户端时出现以下错误:

1
2
3
4
5
E:\Redis>redis-server.exe
[7976] 16 Dec 11:41:31.720 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
[7976] 16 Dec 11:41:31.720 # Redis version=5.0.14.1, bits=64, commit=ec77f72d, modified=0, pid=7976, just started
[7976] 16 Dec 11:41:31.721 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server.exe /path/to/redis.conf
[7976] 16 Dec 11:41:31.724 # Could not create server TCP listening socket *:6379: bind: 在一个非套接字上尝试了一个操作。

出现这一错误则则可以将启动命令改为如下命令:

1
E:\Redis>redis-server.exe redis.windows.conf

连接远程Redis

在Redis根目录下打开cmd,使用redis-cli客户端,连接远程redis服务的语法为:

1
2
3
4
redis-cli -h host -p port -a password
#其中:host为服务器所在的ip地址
#port为Redis服务的监听端口
#password为Redis服务的密码,若没有开启认证则不需要这一参数

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
CATALOG
  1. 1. YAML
    1. 1.1. 基础语法
    2. 1.2. 数据结构与类型
      1. 1.2.1. 对象
      2. 1.2.2. 数组
      3. 1.2.3. 标量
      4. 1.2.4. 字符串
      5. 1.2.5. 布尔值
      6. 1.2.6. 整数
      7. 1.2.7. 浮点数
      8. 1.2.8. 空值(Null)
      9. 1.2.9. 时间戳
      10. 1.2.10. 类型转换
      11. 1.2.11. 其他高级类型
      12. 1.2.12. 数据重用与合并
  2. 2. Redis
    1. 2.1. Windows安装
    2. 2.2. Redis数据类型
      1. 2.2.1. String类型
      2. 2.2.2. Hash类型
      3. 2.2.3. List类型
      4. 2.2.4. Set类型
      5. 2.2.5. ZSet类型
    3. 2.3. 连接本地Redis
    4. 2.4. 连接远程Redis
    5. 2.5. Redis配置