一、经验分享
在V2EX上面,有人问做项目的时候,Python和Java应该怎么选择?
我的回答是:
1. 如果你自己一个人写项目,那么用Python
2. 如果很多人一起写这个项目,并且每个人都是大佬,那么也用Python
3. 如果很多人一起写这个项目,但有至少一个人是混子,那么用Java
如果前面有两条路,一条很长,但是能很平稳的走到终点,另一条需要飞檐走壁,但很快就能到终点。你跟混子说,让他走平稳的长路,但他不会听你的,他自以为自己可以飞檐走壁,结果不仅自己摔了,还把路给炸了。但用Java,在语言层面限制他只能走平稳的长路,让他没有办法做其它选择。这样对项目来说最安全。
二、问题解答
1
序列化场景:redis中有一个键值对,value是java类型的Long(不是基础类型long)。现在我有一个需求是:如何用python代码也能够同样设置一个java里面的Long类型的value。
反序列化场景:从redis中读取value的值如图所示,但是这是一个二进制的串,要怎么反序列化出来处理成python的呢?
对Python来说,不存在long不long的问题,他就是int。因此,所有字符串形式的序列化都不能用,例如json就不能用。但protobuf/msgpack 是可以标记数据类型的二进制序列化格式。因此,你可以使用protobuf或者msgpack来序列化。这样Java就可以识别到数据类型了。你图中就是一种二进制形式的序列化数据。但需要知道它是用什么东西序列化的,才能反序列化。
2
我希望能够在git push时,自动执行black格式化代码,从而达到提交的代码都是经过格式化的要求,是否有这种设置可以达到这个目的呢?
有两种方法:1. 设置git hook,它会在你push前自动先做一些自定义操作。你搜索这个关键词就能找到。2. 使用jenkins/GitHub action。你代码提交到GitHub上面后,它自动开始运行拉代码,格式化再推回去。
3
请教下南哥,从文本大量写入MySQL,或者从mysql大量导出到文本有什么高效的办法么?用异步或者多线程有效果么?
大量写入的时候,要用执行计划,通过executemany一次写入一批数据。一批1000条。读取的时候,看这篇:为什么PyMySQL获取一条数据会让内存爆炸
4
接问题3,大量读的话用pymsql的流式游标是不是可行,不会让内存炸掉,但是测了下读取速度会下降?
你把数据分段,多起几个线程分别读不同段的就可以了。
5
现在自己研究爬虫,用Python+selenium(已经隐藏掉selenium特征,用公众号介绍的Stealth),现在试着爬Tmall的商品价格,(通过页面直接抓),刚开始抓几个页面还可以,没有障碍,抓10几个页面后,就会弹出来滑动验证,selenium可以自动滑块,但滑块后提示失败 需要重新滑动,滑好几次都是失败,即使人工滑动,也是失败。麻烦给个指点,有什么方法可以通过?
因为selenium能被识别的特征有很多,你隐藏不干净。第二是淘宝会根据用户行为来判断你是不是爬虫,这不是隐藏特征就行的。行为检测这个很难解决。即使你真人手动用正常的浏览器打开tmall,然后一页一页手工复制商品,复制十多页它也会出现验证码。因为正常购物的用户不会有你这个行为。它用的是群控,需要通过手机集群操作app来抓的数据。
南哥,请问下,我们公司是个创业型的公司,数据量应该是在十亿到百亿级,最近准备搭建分布式数据库,mysql和mongodb的分布式采用那种方式比较好呢,我测试过很多方式效果都不是太好,也有可能是哪里配置不好,还测试过tidb数据库这些,实在是没有头绪,还望南哥和各位大佬们指引方向!
这个数据量绝对不要用mysql。它根本撑不住。mongodb能撑住几亿数据的写入,但是撑不住查询。给你两个建议:
1. 如果你主要是搜索,用Elasticsearch。
2. 如果你涉及大量group by这种聚合查询,用clickhouse。它的性能极高,单机单节点,在4亿数据里面聚合查询,结果秒出。你100亿数据,用三台机器部署clickhouse就够了。
不过他们都有短板。elasticsearch不适合复杂的聚合查询。clickhouse不适合频繁更新已有数据。有时候可能要两个结合起来用。
ok,了解,我以为是我配置问题造成测试效果不好,我去试试clickhouse,感谢,受教了!
创业公司哪来的这么多数据?
哦,我是计算未来可能增长数据量,目前很长一段时间可能就一亿左右,或者说我可以先不用考虑那么长远?
不要过度设计,强大的设施一般都有代价。基础设施应该跟软件和数据规模相匹配才好。预留一定的冗余。规模上升到现有的基础设施快要撑不住的时候再升级。
好的,那这样的话,mongodb+es是不是比较好的方案呢?
是的