Shawn's Blog
8 分钟阅读

关系型数据库索引初步使用

0X00 前言 不论多初级的后端程序员,只要认可自己是“后端程序员”那最起码也是听过“数据库索引”这个东西的,应该也直到这东西能让数据库变快。但是具体“数据库索引”是个什么东西,怎么用,为什么能让数据库变快可能就不一定清楚了。 这篇博客仅仅是简述了“数据库索引”的最基础内容,不涉及内部原理(其实我也还没搞懂)。阅读了本篇博客可以(也许)搞清楚怎么给一张表添加索引,索引加在哪儿,以及为什么不能给所有字段加索引。 0X01 一个业务场景 假设我们搞了一个电商平台“并夕夕”,现在有超多用户大概几百万,很多人都在我们系统里买了东西,大概下了1000W单。那么我们用来存储订单的表就有大概1000W条数据了,那么我们这个没有进行过任何优化的数据库就已经顶不住了,我们每次在后台查看订单列表的时候一个查询就要快20s,显然是一个接受不了的速度了。 那么我们来看一下这个列表都干了什么:“根据 订单状态(下单待支付/已支付/配送中/已收货/退货中/已完成),订单类型(直接购买/拼单购买/分享白拿)等状态筛选,并取出前20条展示出来”。后台SQL是这个样子的SELECT * FROM bxx_order…

2 分钟阅读

Python 装饰器

0X00 给一个方法计时 现在我们有一个需求,需要给程序中的一部分方法计时,以监控他们执行完具体用了多久。那么在没有装饰器的情况下我们会写出类似这样的代码: 0X01 引入装饰器 如果只是临时给一个方法使用也不是不行,但是如果我们需要监控大量的方法呢?众所周知Python中function也是可以作为参数传递的,那来看一下下面这种写法呢 因为上面timer(foo)返回的结果是一个func,所以后面需要再加一对括号来调用这个方法 这种方法只写了一次计时的逻辑,但是可以给任意一个方法使用,其实这时候def timer(func)已经是装饰器了,下面调用的方法timer(foo)/timer(bar)也是正确的装饰器使用方法。那是不是觉得和常见的装饰器使用不太一样呢?其实常见的@timer用法是Python中提供的一种语法糖。 0X02 @语法糖 其实上面的代码就可以直接使用@语法糖了,具体用法是这样:…

2 分钟阅读

Python 中的可迭代对象、迭代器与生成器

0X00 什么是可迭代对象 我们平时用到的list/set/tuples是最常见的可迭代对象,简单判断就是说当可以for item in this_obj的时候this_obj就是可迭代对象。所以不只是list/set/tuples,打开的文件或是Django中的queryset也都是可迭代对象。 使用iter()可以将列表变为一个迭代器,然后使用next方法访问下一个元素。实际上iter(this_obj)方法和next(this_obj)方法分别调用的是this_obj.__iter__()和this_obj.__next__(),所以我们如果想要自己实现迭代器的话就需要实现这两个方法。 0X01 迭代器 那我们来实现实现一个计算斐波纳契数列的迭代器吧。 运行起来: 这里没有中断的判定,如果需要中断的话就抛出一个StopIteration异常就好了,就像这样: 0X02 生成器 生成器是一类特殊的迭代器 ,将我们平时写的这种[i for i in range(100)]列表生成式的方括号换成小括号,就是将结果从列表变成生成器了(i for i in range(100))。…

3 分钟阅读

使用 Django 中的 select_related 和 prefetch_related 优化查询

0X00 前言 没有什么前言,只有一个数据库模型,下面的代码使用这个模型拿来测试。 我们先假设Major表存在10条数据,而Student表存在1万条数据。 0X01 使用select_related 如果我们要得到所有的学生和他们所学专业的名字,那么我们可以轻松写出下面的代码 这样就能得到所有学生姓名和他们所学的专业名了,但是重点在于这次查询其实是一个很低效的查询,因为在Student.objects.all()的时候查询了一次数据库,而且每次访问student.selected_major.name的时候都会再查询一次数据库,基于上述条件这两行代码将会查询10001次数据库,是一个比较夸张的数字了。那么如何用select_related来优化这次查询呢? 其实就是在all()之后添加了select_related('major'),这次就只需要对数据库进行一次查询。在我本地的类似环境下测试结果是不使用select_related消耗的时间是优化后的400%左右。…

5 分钟阅读

为什么https是安全的(简单介绍)

0X00 没有什么用的开头 众所周知https是安全加密的协议,那么https究竟是如何保证数据传输的安全性的呢?这里来简单介绍一下https的安全机制。 0X01 简介 HTTPS全称是 _Hypertext Transfer Protocol Secure_ 也就是传统的HTTP加上了S _Secure_ ,也可以叫 _HTTP over TLS_ ,总之就是加了密的HTTP嘛。 最常见的加密就是通信双方共有一个密钥,使用这个密钥对原文进行加密和解密,简单粗暴。但是万一密钥泄露了,那么任何人都可以用这个密钥解密你们通信的所有内容,甚至通信双方都是无感知的。(想象一下你和小姐姐的聊天记录被一个扣脚大汉一行行的看完还嘿嘿傻笑是不是贼恐怖)…

5 分钟阅读

vim 寄存器的使用

编辑器之神可不是浪得虚名 0X00 遇到了一些问题 如果你看到了这篇文章那么我可以认为你至少已经掌握了vim基本用法。在我个人使用vim的过程中遇到了一些问题,这次就挑“寄存器”这部分出来说一下吧。 我这里贴一段代码过来,这段代码出自我在学校时写的一个小项目open_disframe 现在我们在编辑编辑这段代码的时候需要将其中的部分内容替换掉,比如将第一个if中的slave_socket.send.....和第二个if中的process_heartbeatxxx和第三个if中的continue替换成break。虽然这么做可能有点诡异,不过这里实在没找到完美的适用场景,公司的代码也不能贴出来,又懒得编造一个完美适用场景,就先这样看吧。 通常我们与到这种情况都会是下面的操作流 1. 手动替换第一处的break 2. 复制break 3. 找到下一处需要替换的地方选中 4. p粘贴过去 5. 找到下一处需要替换的地方选中 6. p粘贴过去 7. 发现“剪贴板”被上面那次被替换掉的数据覆盖了,以至于将上次删掉的内容贴过来了,而不是自己想要的break 8.…

4 分钟阅读

我眼中的「正版」与「盗版」

0X00 何为正版 正版的即“正确地使用版权”。而版权是属于版权所有人的,版权所有人提出使用条件,使用者只要符合条件,就算是正确地使用,就不违反版权法。 以上来自维基百科:“正版”词条 0X01 我的正版观念 正确的版权观念当然应该是在任何情况下都要“正确的使用版权”。但是几乎不会有人能做到这一点,我这里不谈政治正确,只是说一下我个人的正版观念。我的正版观念简单说来就是“在自己条件允许的情况下尽可能的使用正版”,当然这里的条件允许不只是指的经济条件,还有各种其他的因素。 比如说电影,按照最正确的正版意识来说应该是在上映时在电影院观看,院线下映后在各个视频网站观看或单独购买光盘/数字授权等。我个人只做到一部分,电影还在院线时我要么去电影院观看要么就等下映后在线观看,从来不下载观看“枪版”和“泄漏版”,不过下映比较久后也有可能会通过“torrent(也就是种子)”下载到本地观看。 音乐也是类似。我一般都是使用本地音乐播放器听歌,不论是在电脑还是手机上。不过每次发现新音乐都是通过在线播放器,当喜欢的新音乐达到了一定数量后就充值对应平台的会员把他们下载下来,继续使用本地播放器播放。…

7 分钟阅读

如何将自己的时间管理起来

0X00 时间都去哪儿了 好多人都会有这种情况,整整两天的周末回忆起来却不知道自己做了什么,明明也没看几部电影、没怎么打游戏,也没怎么学习,时间怎么就不见了呢?更为常见的一种是“等我有空了就搞”、“等我空了一定去一趟哪儿哪儿哪儿”、“下周六一定要去吃XXX”,然后就再也想不起来了。真正空下来的时候又觉得自己没事做,完全想不起来之前列出来比卷纸还长的todo list了。 实际上大家几乎不会真的有“无事可做”的时候,只是有空的时候想不起来之前的计划,定了计划又不定执行时间。最后到头来就落得这么一个不仅很闲又啥事都做不了的境况。比如你一定会有过上午还在说“有空了一定去一趟本地的博物馆看看”,下午的时候就趴在床上不知道要干啥的情况。这种在我们中太长见了,通常我们都是就这么趴在床上继续下去了。 以我个人来说,在主动管理自己时间的时候我一天下来有很多事要做,感觉自己很充实。那段时间里我玩游戏、看书、写代码甚至去一公里外的镇上吃一家好吃的包子都会列在我的计划中,严格按照计划行事。…

5 分钟阅读

把自己的 VPS/Server 用起来

好多人的VPS或是服务器就只跑了一个小服务或是小程序,虽然我们多数人的VPS性能比较差但是只跑一个小服务一个小程序未免还是有些浪费。大可将其充分利用起来,毕竟性能再差也是一个24小时不停机且带有一个独立公网IP的机器。这里我介绍一下我跑在VPS上的一些服务和使用中的一些经验和建议,希望可以给各位带来些许的帮助吧。 0X00 操作系统 通常我们自己的VPS性能都不怎么强,很多人都是买的单核512M内存的,所以Windows Server系统通常是不用想了。那么众多的Linux发行版本又该如何选择呢?其实因为我们是个人使用,不用过分考虑发行版本的区别,哪个用着习惯就用哪个。我自己的VPS用过一段时间的Fedora和Debian,都是很不错的。如果是针对Linux新手的话我还是比较建议使用Ubuntu和CentOS,因为这两个系统的用户群体很大,出现问题时候在网络上也更容易找到相关的解决方案。 还有就是图形界面,Linux作为服务器操作系统时是完全没有必要安装图形界面的。想必购买了VPS的用户应该也多少能操作一下Linux,就更没有必要浪费系统资源和时间去安装图形界面和VNC了。 0X01…

6 分钟阅读

Linux上的简单文本处理

0X00 前言 最开始使用Linux的时候一直搞不懂为什么Linux下会有这么多在命令行里操作文本的工具。一度以为这些玩意儿没啥大用,但是随着使用频率与强度的增加才发现这些东西是Linux上非常有魅力的部分。 0X01 cat cat命令是最简单的,cat filename就是将文件内容以文本的形式输出到命令行。这个命令主要是作为后面组合技的基础,威力到后面cat的作用才能发挥出来。 0X02 head head是查看文件的前面部分,默认情况下是前10行,可以使用-n参数指定具体的行数。如果你有一个文件巨大无比,比如说几个G,且你只关心前100行,那怎么搞呢。使用cat是不可能的了,毕竟你cat一下之后回去睡一觉屏幕都可能还没滚完,何况你还得翻回最上面查看开头的内容。 0X03 tail tail类似于head命令,不过这个是用来查看文件最后的,同样支持使用-n参数来指定最后多少行。不过这个命令最多用于查看日志文件。例如你有一个日志文件每秒都在源源不断的写入新内容,此时又想看最新的日志怎么搞呢。tail提供了一个-f的参数,使用tail filename…