第4章 字典
字典,又称为符号表(symbol table)、关联数组(associative array)或映射(map),是一种用于保存键值对(key-value pair)的抽象数据结构。
在字典中,一个键(key)可以和一个值(value)进行关联(或者说将键映射为值),这些关联的键和值就称为键值对。
字典中的每个键都是独一无二的,程序可以在字典中根据键查找与之关联的值,或者通过键来更新值,又或者根据键来删除整个键值对,等等。
字典经常作为一种数据结构内置在很多高级编程语言里面,但Redis所使用的C语言并没有内置这种数据结构,因此Redis构建了自己的字典实现。
字典在Redis中的应用相当广泛,比如Redis的数据库就是使用字典来作为底层实现的,对数据库的增、删、查、改操作也是构建在对字典的操作之上的。
举个例子,当我们执行命令:
redis> SET msg "hello world"
OK
在数据库中创建一个键为"msg",值为"hello world"的键值对时,这个键值对就是保存在代表数据库的字典里面的。
除了用来表示数据库之外,字典还是哈希键的底层实现之一,当一个哈希键包含的键值对比较多,又或者键值对中的元素都是比较长的字符串时,Redis就会使用字典作为哈希键的底层实现。
举个例子,website是一个包含10086个键值对的哈希键,这个哈希键的键都是一些数据库的名字,而键的值就是数据库的主页网址:
redis> HLEN website
(integer) 10086
redis> HGETALL website
1)"Redis"
2)"Redis.io"
3)"MariaDB"
4)"MariaDB.org"
5)"MongoDB"
6)"MongoDB.org"
# ...
website键的底层实现就是一个字典,字典中包含了10086个键值对,例如:
·键值对的键为"Redis",值为"Redis.io"。
·键值对的键为"MariaDB",值为"MariaDB.org";
·键值对的键为"MongoDB",值为"MongoDB.org";
除了用来实现数据库和哈希键之外,Redis的不少功能也用到了字典,在后续的章节中会不断地看到字典在Redis中的各种不同应用。
本章接下来的内容将对Redis的字典实现进行详细介绍,并列出字典的操作API。本章不会对字典的基本定义和基础算法进行介绍,如果有需要的话,可以参考以下这些资料:
·维基百科的Associative Array词条(http://en.wikipedia.org/wiki/Associative_array)和Hash Table词条(http://en.wikipedia.org/wiki/Hash_table)。
·《算法:C语言实现(第1~4部分)》一书的第14章。
·《算法导论(第三版)》一书的第11章。