{"id":15665882,"url":"https://github.com/kingname/sourcecodeofmongoredis","last_synced_at":"2025-04-07T05:11:04.878Z","repository":{"id":47662370,"uuid":"172072488","full_name":"kingname/SourceCodeofMongoRedis","owner":"kingname","description":"《左手MongoDB，右手Redis——从入门到商业实战》书籍配套源代码。","archived":false,"fork":false,"pushed_at":"2024-02-17T13:31:26.000Z","size":2166,"stargazers_count":213,"open_issues_count":14,"forks_count":102,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-03-30T21:11:17.228Z","etag":null,"topics":["mongodb","python3","redis"],"latest_commit_sha":null,"homepage":"https://item.jd.com/41568617299.html","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kingname.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-02-22T13:39:12.000Z","updated_at":"2025-01-25T14:43:29.000Z","dependencies_parsed_at":"2024-02-16T06:23:00.960Z","dependency_job_id":"c5f71a57-9229-4356-8ceb-19e9ef3e46e4","html_url":"https://github.com/kingname/SourceCodeofMongoRedis","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kingname%2FSourceCodeofMongoRedis","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kingname%2FSourceCodeofMongoRedis/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kingname%2FSourceCodeofMongoRedis/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kingname%2FSourceCodeofMongoRedis/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kingname","download_url":"https://codeload.github.com/kingname/SourceCodeofMongoRedis/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247595335,"owners_count":20963943,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["mongodb","python3","redis"],"created_at":"2024-10-03T13:56:10.846Z","updated_at":"2025-04-07T05:11:04.860Z","avatar_url":"https://github.com/kingname.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"## 数据工程师妹子养成手记——数据库篇\n\n\u003e 《左手MongoDB，右手Redis——从入门到商业实战》背后的故事。\n\n这篇文章没有代码，请放心阅读。\n\n程序员最宝贵的东西是生命，生命属于程序员只有一次。一个程序员的一生应该这样度过：当她回首往事的时候，她不会因为搭建环境浪费时间而悔恨，也不会因为集群无法运行而羞耻。这样，在她开发的时候，她能够说：“我的整个生命和全部精力，都已经献给了开发中最重要的事情——设计程序，实现程序和调Bug。” ——P酱。\n\nP酱是公司新来的实习生妹子。听说是一个文科生。文科生应该会去文案组或者策划组吧。什么？来数据组？让我来带？\n\n于是我和P酱~~生活~~工作在了一起。\n\n## P酱你会些什么？\n\n“我叫P酱，在XX大学读研二，爱好是拍照和被拍，大家可以在B站找到我跳舞的视频，比如av170001。我的另外一个爱好是写代码……”\n\n当一个文科妹子说自己喜欢写代码的时候，整个办公室热闹了起来。\n\n“P酱，听说你喜欢写代码，那你写过什么东西吗？”新人介绍会议结束以后，我问P酱。\n\n“一般都是各种分析程序，我们的专业要做很多调查报告，他们都是用Excel来计算的。我喜欢用Python来把这些统计过程自动化。后来也写过自动写诗的程序、鬼畜视频生成器等等。”\n\n“真不敢相信你是文科生。这么说你的兴趣是数据分析方向咯？”\n\n“其实我对师父你做的爬虫很有兴趣。但是听说会经常和网站发生对抗？女孩子还是不要打打杀杀的好~”\n\n于是我让P酱负责对爬虫的原始数据进行清洗、整理并做简单的分析。\n\n## 一种船新的数据储存方式\n\n“P酱，爬虫抓到的原始数据是存放在MongoDB里面的，你的Python还不错吧，你试一试用Python来读写MongoDB看看。”\n\n“MongoDB是什么呀？”\n\n“是一个和MySQL不太一样的数据库。”\n\n“MySQL我知道，MongoDB和MySQL有什么不一样呢？”\n\n“我举个例子，当你要插入数据的时候，你需要做的，就是‘插入’。咳咳，你不要脸红，我是指你不需要写SQL语句、不需要建表、不需要提前定义字段。仅仅只需要一行代码就能够实现了。我这里给你写了一篇文档，讲到了MongoDB的增删改查，你试一试。数据库已经给你搭建好了，你直接连上去用吧”\n\n半天以后。\n\n“师父，我已经会使用MongoDB啦。”\n\n“你读爬虫的原始数据，主要涉及到的就是查询操作，为了巩固插入、修改和删除的操作，再给你一个小任务吧。试一试写一个人员管理系统吧。”\n\n## 既然有关系，就整整齐齐放在一起看吧\n\n“P酱，你看起来很高兴的样子啊。”\n\n“因为我觉得MongoDB比起MySQL太简单了啊~”\n\n“你确定？那我看看你怎么对整行数据去重的？”\n\n“师父，我知道distinct关键字可以对一个字段去重。但是整行数据我是读出来用Python来去重的。”\n\n“这个时候你就要用到MongoDB的聚合查询了。文档已经给你写好了，拿去看吧。”\n\n“还有还有，这里你把店铺信息和菜单信息放在了两个集合里面，我怎么样才能把他们联表查询出来呢？”\n\n“联表查询是MySQL里面的操作，在MongoDB里面，没有`表`，只有`集合`，所以叫做`联集合查询`更恰当一些。这也是要用到聚合查询，也在这个文档里面了。”\n\n## 再给你一个玩具吧。\n\n“P酱，之前让你做的爬虫数据监控系统怎么样了？”\n\n“功能已经做好了，但是有一个地方查询起来特别慢。我已经加过索引了，但还是很慢。怀疑是同时联了四个集合的数据造成的。”\n\n“这边的数据实际上每小时才更新一次，你没有必要每次刷新页面都去查询MongoDB的。我觉得是时候让你用一下Redis做缓存了。”\n\n“Redis就是那个内存数据库吗？我知道我知道。”\n\n“给你写了一份文档，包含Redis里面的各种数据类型和使用方式。你试一试把Redis和MongoDB结合起来看看能不能提高速度。”\n\n## 你怎么擅自加功能啊！\n\n“P酱，你怎么在爬虫监控系统的网页上加了一个广播窗口？”\n\n“呀，被师父发现了。因为我想到同一个爬虫可能会被几个人监控，所以就用Redis的发布订阅功能做出来了这个广播的功能。一旦爬虫状态发生改变，所有人都能收到推送。”\n\n“既然你这么闲，那不如加上账号登录功能，把权限验证也做上去？不同的人只能看到自己负责的爬虫。顺便你可以试一试用Redis实现……”\n\n“实现布隆过滤器和Session管理是吗？”\n\n“你怎么知道我要说什么？”\n\n“因为我早上看到你在文档上面更新了布隆过滤器和Session管理相关的内容啊~”\n\n## 红色的锁？\n\n“师父师父，你知道什么是RedLock吗？”\n\n“你学得这么快？都知道RedLock了？RedLock是Redis官方给出的分布式锁的算法。已经有很多编程语言实现它了。”\n\n“原来RedLock只是一个算法啊……”\n\n## 为什么我学的这么快呢？\n\n“师父师父，我觉得很奇怪啊，为什么MongoDB和Redis我学得这么快呢？难道是因为他们本来就简单？还是因为我太聪明了？”\n\n“为什么你不说是因为你师父教的好呢？“\n\n“因为这是事实啊~不用我说出来~”\n\n“咳咳，实际上是因为两个原因。一是你一直通过项目驱动来学习，先有需求，然后再去学习实现这个需求所要涉及到的技能。所以你知道你学的东西能用来干什么，自然就能学得快……”\n\n“那第二个原因是什么呢？”\n\n“第二个原因，我先问你一个问题，你会搭建Redis集群吗？会搭建MongoDB集群吗？知道什么叫做哨兵吗？你知道如何优化MongoDB的启动参数吗？”\n\n“这…………好像都不知道额…………”\n\n“因为你的角色是数据工程师，不是数据库工程师，所以数据库搭建、底层优化这些内容我都给你跳过了。”\n\n“这些听起来都很重要啊，师父你会教我吗？”\n\n“你想经常值夜班吗？想半夜3点被人打电话叫起来修数据库吗？认清自己的定位啊，数据库工程师的技能当然很重要，但你是要成为数据工程师的人，技能树应该点在合适的方向。”\n\n## 后记\n\n后来，P酱成了别人的女朋友。\n\n![](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/2019-02-22-22-33-30.png)\n\n幸好我还有左手和右手，于是我把我给P酱总结的文档编撰成了《左手MongoDB，右手Redis——从入门到商业实战》这本书。本书现在已经在京东、亚马逊、淘宝上架。\n\n![](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/2019-02-23-13-22-19.png)\n\n![](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/2019-02-23-13-22-45.png)\n\n![](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/2019-02-23-13-23-29.png)\n\n\n这本书的定位是MongoDB和Redis的应用，所以有意弱化了数据库的搭建、维护和底层优化。所以本书可能不适合数据库工程师。\n\n希望本书能够给那些一直想掌握MongoDB、Redis，但是又不知道从何处下手的读者，提供一个学习的方向。\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkingname%2Fsourcecodeofmongoredis","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkingname%2Fsourcecodeofmongoredis","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkingname%2Fsourcecodeofmongoredis/lists"}