- 左手MongoDB,右手Redis:从入门到商业实战
- 谢乾坤编著
- 3248字
- 2020-08-27 21:45:46
第1章 进入MongoDB与Redis的世界
非关系型数据库在如今的大数据环境下越来越受到重用。相比传统的关系型数据库,非关系型数据库在越来越多的使用场景下极大地提升了生产力。
非关系型数据库的佼佼者——文档型数据库MongoDB与键值数据库Redis,是这本书的两个主角。
1.1 非关系型数据库的产生背景与分类
1.1.1 关系型数据库遇到的问题
2008年左右,网站、论坛、社交网络开始高速发展,关系型数据库的地位受到了很大的挑战。
关系型数据库的以下问题逐渐凸显:
● 难以应付每秒上万次的高并发数据写入。
● 查询上亿量级数据的速度极其缓慢。
● 分库、分表形成的子库到达一定规模后难以进一步扩展。
● 分库、分表的规则可能会因为需求变更而发生变更。
● 修改表结构困难。
在很多互联网应用场景下,对数据联表的查询需求不是那么强烈,也并不需要在数据写入后立刻读取,但对数据的读取和并发写入速度有非常高的要求。在这样的情况下,非关系型数据库得到高速的发展。
2009年,分布式文档型数据库MongoDB引发了一场去SQL的浪潮。
1.1.2 非关系型数据库的分类及特点
非关系型数据库主要分为以下几类。
1.键值数据库
主要代表是Redis、Flare。
这类数据库具有极高的读写性能,用于处理大量数据的高访问负载比较合适。
2.文档型数据库
主要代表是MongoDB、CouchDB。
这类数据库满足了海量数据的存储和访问需求,同时对字段要求不严格,可以随意地增加、删除、修改字段,且不需要预先定义表结构,所以适用于各种网络应用。
3.列存储数据库
主要代表是Cassandra、Hbase。
这类数据库查找速度快,可扩展性强,适合用作分布式文件存储系统。
4.图数据库
主要代表是InfoGrid、Neo4J。
这类数据库利用“图结构”的相关算法,适合用于构建社交网络和推荐系统的关系图谱。
1.2 MongoDB与Redis可以做什么
1.2.1 MongoDB适合做什么
MongoDB适合储存大量关联性不强的数据。
MongoDB中的数据以“库”—“集合”—“文档”—“字段”结构进行储存。这种结构咋看和传统关系型数据库的“库”—“表”—“行”—“列”结构非常像。但是,MongoDB不需要预先定义表结构,数据的字段可以任意变动,并发写入速度也远远超过传统关系型数据库。
1.2.2 Redis适合做什么
Redis有多种数据结构,适合多种不同的应用场景。
1.使用Redis做缓存
Redis的字符串、哈希表两种数据结构适合用来储存大量的键值对信息,从而实现高速缓存。
2.使用Redis做队列
Redis有多几种数据结构适于做队列:
● 使用“列表”数据结构,可以实现普通级和优先级队列的功能。
● 使用“有序集合”数据结构,可以实现优先级队列;
● 使用“哈希表”数据结构,可以实现延时队列。
3.使用Redis去重
Redis有多几种数据结构适于做去重:
● 利用“集合”数据结构,可以实现小批量数据的去重;
● 利用“字符串”数据结构的位操作,可以实现布隆过滤器,从而实现超大规模的数据去重;
● 利用Redis自带的HyperLogLog数据结构,可以实现超大规模数据的去重和计数。
4.使用Redis实现积分板
Redis的“有序集合”功能可以实现积分板功能,还能实现自动排序、排名功能。
5.使用Redis实现“发布/订阅”功能
Redis自带的“发布/订阅”模式可以实现多对多的“发布/订阅”功能。
1.3 如何学习MongoDB和Redis
本节谈一谈如何学习MongoDB和Redis。
1.3.1 项目驱动,先用再学
“先看理论,再实做”的学习方法,最容易让人昏昏欲睡。如果先看理论,由于不知道具体的应用场景,学起来就难以抓住重点。
如果先给出一个项目,然后根据完成这个项目需要哪些知识点去针对性地学习,就能很容易找到重点,活学活用。在完成项目的同时,也就学好了知识点。
1.3.2 系统梳理,由点到面
项目驱动也并非完美无缺。基于项目来学习,容易导致的问题是知识点零碎而不成系统。因此,在完成一个项目后,应对项目涉及的知识点进行系统性的学习。例如,聊天网站需要使用Redis的列表,那么在完成了聊天网站后,就应该详细了解Redis列表的其他命令。
又比如,在问答系统中需要使用 MongoDB 的联集合查询,那么在完成项目以后,应根据联集合查询用到的“aggregate”命令去了解 MongoDB 的聚合操作。在了解了聚合操作以后,再思考聚合操作的其他应用场景。
1.3.3 分清主次,不要在无谓的操作中浪费时间
搭建环境是很多人学习的“拦路虎”。由于电脑环境的差异,可能有一些读者无论如何都无法在自己的电脑上把数据库运行起来。此时,千万不要恋战。赶紧重装系统、更换电脑、求助他人,或者使用别人已经搭建好的环境。
首先学会使用数据库,等基于MongoDB或者Redis的程序能够完美运行了,再来慢慢考虑环境搭建的问题。
至于MongoDB的分库、分表、集群,Redis的集群、哨兵等内容,除非你想成为数据库工程师,否则,可以等到熟练使用MongoDB和Redis后,再找大块空闲时间来了解。
1.3.4 在不同领域中尝试
MongoDB与Redis在多个领域中都有重要的应用。例如:
● 在爬虫开发中,MongoDB主要用来写数据,Redis主要用来缓存网址。
● 在数据分析中,MongoDB的聚合操作用得较多。
● 在后端开发中,主要用到MongoDB的增、删、改、查功能,Redis主要用来做缓存。
● 在游戏开发中,Redis可以用来做排名功能。
如果希望更好地掌握MongoDB和Redis,那么可以在多个领域都寻找项目来进行尝试,从而更全面地了解各个功能和应用场景。
1.4 如何使用本书
1.4.1 本书的产品定位
本书旨在教会读者在不同应用场景下正确使用MongoDB和Redis的不同功能,不会介绍数据库的底层原理,也不会介绍如何优化数据,更不会介绍如何搭建数据库集群。
如果以开车作为比喻,学习开车不需要知道汽车的所有组成元件,也不需要知道汽车为什么踩下油门就可以跑,更不需要知道汽车是如何组装的。诚然,技艺高超的赛车手确实需要知道汽车的一些底层原理,但前提是要会开车,再来考虑如何开得好。
几乎找不到不用数据库的互联网公司。似乎在任何场景下都要用到数据库,但数据库绝不仅仅是保存数据那样简单,数据库的不同功能有不同的适用场景。如何在适当的场景下选择最适当的功能,正是本书需要教给读者的。
本书虽然也有数据库搭建的内容,但希望读者耗费在搭建数据库上的时间不要超过半小时。如果搭建遇到了问题,请立即咨询朋友、老师,或者使用学校或公司已经搭建好的数据库来进行学习。绝对不应该在搭建数据库上耗费太多时间。
1.4.2 本书适用的读者群体
本书不适合希望成为数据库工程师的读者。
本书强调如何将MongoDB和Redis应到实际项目中,因此本书会使用编程语言Python来操作数据库,这就要求读者必须有Python基础。
如果读者对Python不熟悉,可以参考李金洪老师编著的《Python带我起飞——入门、进阶、商业实战》(电子工业出版社出版)一书。
本书适合有Python基础的后端工程师、爬虫工程师、数据工程师、数据科学家、数据挖掘工程师、游戏开发工程师等群体阅读学习。
1.后端工程师
本书中涉及的网站是使用Flask开发的,后端工程师在学习了MongoDB与Redis知识后,可以参考本书的网站源代码举一反三,使用MongoDB与Redis来优化自己网站的后台代码,从而提高速度或者简化逻辑。
2.爬虫工程师
MongoDB特别适合写入大批量、高并发、不规则的数据,Redis特别适合作为分布式爬虫的连接枢纽。爬虫工程师在学习了MongoDB与Redis后,可以大大提高爬虫的开发效率和运行效率。
3.数据工程师、数据科学家、数据挖掘工程师
这个群体的读者,可以使用MongoDB来保存数据,并使用MongoDB的聚合查询功能来对数据进行一些基本的查询操作和清洗操作,从而输出格式较为规范的数据,以便进行进一步分析。
4.游戏工程师
Redis特别适合用来存放一些中间数据。另外,Redis自带的一些数据结构天然适合用来实现游戏中的一些功能,例如积分板、去重、高速缓存等。
1.4.3 如何利用本书实例进行练习
本书有大量的实例供读者练习。实例分为小型、中型和大型三种。
1.小型实例
对于小型实例,读者可以根据书中的描述直接在MongoDB图形化管理软件、Redis交换环境或Python交互环境中进行操作。
这种实例包括(但不限于)MongoDB与Redis的基本语法、基本操作。
2.中型实例
对于中型实例,由于需要完成较多的 Python 代码,因此需要在 Python 的集成开发环境(PyCharm等)中完成。
本书会为中型实例提供原始数据的生成程序。只要运行生成程序,就会在 MongoDB 或者Redis中写入练习专用的原始数据。然后,读者就可以操作这些原始数据进行学习。
3.大型实例
对于大型的实例,本书会附送相应的代码(一个网站的所有源文件)。读者根据书中的使用说明,可以在自己电脑上将网站的运行环境搭建起来。
在项目环境能正常运行后,读者只需要完成项目中的MongoDB或Redis模块,就可以使整个网站按照预期的效果正常工作。