07 2020 档案
摘要:楔子 在上一篇中我们说到了Python中的对象在底层的数据结构,我们知道Python底层通过PyObject和PyTypeObject完成了C++所提供的对象的多态特性。在Python中创建一个对象,会分配内存并进行初始化,然后Python会用一个PyObject *来保存和维护这个对象,当然所有对
阅读全文
摘要:楔子 我们在上一篇中说到了,面向对象理论中"类"和"对象"这两个概念在Python内部都是通过"对象"实现的。"类"是一种对象,称为"类型对象","类"实例化得到的也是"对象",称为"实例对象"。 并且根据对象的不同特点还可以进一步分类: 可变对象:对象创建之后可以本地修改; 不可变对象:对象创建之
阅读全文
摘要:Python中一切皆对象 关于Python,你肯定听过这么一句话:"Python中一切皆对象"。没错,在Python的世界里,一切都是对象。整型是一个对象、字符串是一个对象、字典是一个对象,甚至int、str、list等等,再加上我们使用class自定义的类,它们也是对象。 像int、str、lis
阅读全文
摘要:楔子 我们平时在做测试的时候,经常会使用一些假数据,而Python中有一个包叫faker(不是打LOL的那个),专门用来生成假数据,并且生成的假数据非常逼真,下面我们就来看一下。 faker使用方法 基本使用 faker使用起来非常简单,我们看一下就知道了。 from faker import Fa
阅读全文
摘要:楔子 本文来自于公众号《小林coding》。 我们在编写代码的时候经常会用到多线程或者多进程,但是你对进程和线程本身的了解有多深呢?这次让我们来仔细地梳理一下关于进程和线程方面的知识吧。 进程 比如我们写了一份代码,无论是 Go 代码也好,Python 代码也罢,它们本质上都只是一个静态文件。当我们
阅读全文
摘要:楔子 Python 有一个内置的模块叫 heapq,从名字上看它和堆有关系,我们先来看看这个模块都有哪些功能吧。 import heapq data = [4, 9, 1, 5, 6, 2, 7, 3, 8] # 将 data 调整为一个堆,关于堆后面会详细介绍 # 总之堆有两种,分别是大根堆和小根
阅读全文
摘要:Redis的使用虽然很方便,但是也会遇到一些问题,这些问题不仅在工作中会出现,面试的时候也经常会被问到。 缓存雪崩 缓存雪崩是指在短时间内,有大量缓存同时过期,导致大量的请求直接查询数据库,从而对数据库造成了巨大的压力,严重情况下可能会导致数据库宕机。这种情况就叫做缓存雪崩。 我们看一下正常情况下和
阅读全文
摘要:楔子 之前我们了解了 Redis 主从节点集群模式,在这个模式下,如果从节点发生故障了,客户端可以继续向主节点或其他从节点发送请求,进行相关的操作。但如果是主节点发生故障了,那么显然会直接影响到从节点的同步,因为从节点没有相应的主节点可以进行数据复制操作了。 而且,如果客户端发送的都是读操作请求,那
阅读全文
摘要:楔子 主从同步(主从复制)是 Redis 高可用服务的基石,也是多机运行中最基础的一个。我们把主要存储数据的节点叫做主节点(master),把其他通过复制主节点数据的副本节点叫做从节点(slave),如下图所示: 在 Redis 中一个主节点可以拥有多个从节点,一个从节点也可以是其他从节点的主节点,
阅读全文
摘要:楔子 我们前面介绍过 HyperLogLog 可以用来做基数统计,但它没提供判断一个值是否存在的查询方法,那我们如何才能在海量数据之中判断一个值是否存在呢? 因为是海量数据,所以我们就无法将每个键值都存起来,然后再从结果中检索数据了,比如数据库中的 select count(1) from tabl
阅读全文
摘要:楔子 这次我们来说一下如何在Redis中嵌入Lua脚本,Lua和Python一样,是一门脚本语言。只不过Lua解释器非常的精简,所以它不具备像Python一样独立开发大型应用程序的能力,它的目的就是为别的语言提供扩展功能的。一般都会嵌入到C中,我们知道C在编译的时候是比较耗时的,而我们每做一次修改都
阅读全文
摘要:楔子 锁是多线程编程中的一个重要概念,它是保证多线程并发时顺利执行的关键。我们通常所说的"锁"是指程序中的锁,也就是单机锁,比如Python的threading模块里面的Lock等等,而分布式锁是指可以在多机集群中使用的锁。 锁主要用于并发控制,用于保证一项资源在任何时候只能被一个线程使用,如果其他
阅读全文
摘要:楔子 Redis虽然是一个缓存,但是它也可以作为一个消息队列。所以redis还是比较有野心的,本来在缓存方面就已经把memcached给干掉了,但还想在消息队列的方向上闯一闯。不过虽说Redis支持消息队列,但是它还是作为缓存更加的专业,大公司很少有将redis作为消息队列来使用的,因此消息队列的话
阅读全文
摘要:楔子 在我们实际开发的过程中,可能会遇到这样一个问题,当我们需要统计一个大型网站的独立访问次数时,该用什么的类型来统计? 如果我们使用 Redis 中的集合来统计,当它每天有数千万级别的访问时,将会是一个巨大的问题。因为这些访问量不能被清空,我们运营人员可能会随时查看这些信息,那么随着时间的推移,这
阅读全文
摘要:楔子 "限流"这种事情即使在生活中也很常见,比如我们银行办理业务,银行不可能给去的所有人同时服务,因为柜台就那么几个。所以可能一次只给5个人办理业务,其他的人只能在后面排队;再比如打饭等等,也是一样的道理。因为能提供服务的数量有限,所以必须要通过限流的方式。 在程序的层面上也是一样的,如果我们的系统
阅读全文
摘要:楔子 我们说如果想查询数据库中都有哪些key的话,那么可以使用keys命令来查看,keys后面接一个模式,即可返回所有匹配指定模式的key。并且指定模式的时候,可以使用通配符,比如: *:匹配任意多个任意字符 ?:匹配单个任意字符 [...]:匹配[]中的任意一个字符 当然keys这个命令很简单,用
阅读全文
摘要:楔子 查询附近的人或者附近的商家等等是一个非常常用并且实用的功能,比如:我们经常使用高德地图、百度地图或者其它地图,去查询我们想去的目的地在什么位置,并且还会显示距离。如果我们去的地方有多个,比如我们想去招商银行,但如果附近有多个招商银行,那么地图会显示附近的所有银行,并默认按照距离进行排序,然后我
阅读全文
摘要:管道技术(Pipeline)是客户端提供的一种批处理技术,用于一次处理多个Redis,从而提高整个交互的性能。 通常情况下Redis是单线程执行的,客户端先向服务器发送请求,服务端接收并处理请求、然后把结果返回给客户端,这种处理模式在非频繁请求时不会出现任何问题。 但如果出现集中大批量请求时,因为每
阅读全文
摘要:楔子 在某些极端情况下,软件为了能正常运行会做一些保护性的措施,比如运行内存超过最大值之后的处理,以及键值过期之后的处理等等,都属于此类问题,而专业而全面的回答这些问题恰好是一个工程师所具备的优秀品质。 那么下面我们就来探讨一下。 Redis内存用完了会怎么办? Redis 的内存用完指的是 Red
阅读全文
摘要:楔子 我们知道 Redis 是有事务功能的,尽管它不像关系型数据库那样常用,但是在面试中还是很容易被问到的,下面我们就来总结一下 Redis 的事务。 通过 Redis 事务的原理以及实际操作,来彻底攻略 Redis 中的事务。 事务介绍 Redis 事务是一组命令的集合,将多个命令进行打包,然后这
阅读全文
摘要:配置文件 Redis 最大的一个特点就是它的配置文件行数非常多,加上注释大概一千三四百行,里面有大量的配置可以供我们进行设置。其实关于 Redis 的配置我们之前也提到过,比如:开启多线程、设置线程数、数据结构内部存储元素的数量限制等等,那么下面我们就来介绍一下 Redis 配置文件中一些其它的常见
阅读全文
摘要:楔子 在前面的章节中,我们看到 Cython 可以将 Python 的性能提升 10 倍、100 倍、甚至 1000 倍,而这些性能的提升只需要我们做一些简单的修改即可。并且我们还了解了 Cython 的类型化 memoryview,通过类型化 memoryview,我们实现了一个比内置的 sum
阅读全文
摘要:楔子 Cython 的两个优秀的品质就是它的广度和成熟度,可以编译所有的 Python 代码,并且将 C 的速度代入了 Python,并且还能轻松的和 C、C++ 集成。而本篇文章的任务就是完善 Cython 的功能,并介绍 Cython 的阵列特性,比如:对 Numpy 数组的深入支持。 我们已经
阅读全文
摘要:楔子 在前面的系列中我们知道了 Cython 如何通过提前编译的方式来对 Python 代码进行加速,这一节我们聚焦在另一个方向上:假设有一个现成的 C 源文件,那么如何才能让 Python 操作它呢? 事实上,Python 访问 C 源文件,我在其它文章中介绍过。当时的方式是将 C 源文件编译成动
阅读全文
摘要:楔子 我们之前在介绍 Cython 语法的时候,一直都是一个 pyx 文件,而且文件名也一直叫 cython_test.pyx 就没变过,但如果是多个 pyx 文件改怎么办?怎么像 Python 那样进行导入呢? Python 提供了 modules 和 packages 来帮助我们组织项目,这允许
阅读全文
摘要:Redis 的五种常见数据结构 Redis 的数据类型可谓是 Redis 的精华所在,同样的数据类型,但不同的值对应的存储结构也是不同的。比如:当你存储一个短字符串(小于 44 字节),实际存储的结构是 embstr;长字符串对应的实际存储结构是 raw,这样设计的目的就是为了更好的节约内存。 那么
阅读全文
摘要:楔子 上一篇博客中,我们介绍 Cython 给 Python 赋予的一些额外特性,以及这些特性的使用方式,但那主要是基本的数据类型和函数。Cython 也可以增强 Python 的类,不过在了解细节之前,我们必须首先了解 Python 类和扩展类之间的区别,这样我们才能明白 Cython 增强 Py
阅读全文
摘要:一条命令的执行过程有很多细节,但大体可以分为:客户端先将用户输入的命令转化为 Redis 相关的通讯协议,再用 socket 连接的方式将内容发送给服务器端。服务器端在接收到相关内容后,则是先将内容转化为具体的命令,再判断用户授权信息和其它相关信息,当验证通过时会执行最终命令,命令执行完毕后会进行相
阅读全文
摘要:Redis 是属于单线程还是多线程? Redis 是普及率最高的技术之一,不仅是面试会被经常问到,在工作中也是非常常用的,下面我们就深入的了解一下Redis。 首先,Redis 使用的到底是多线程还是单线程? 不同版本的 Redis 是不同的,在 Redis4.0 之前,Redis 是单线程运行的,
阅读全文
摘要:楔子 本文来自于公众号《小林coding》。 操作系统是一个非常深层次的领域,想学好的话可以说是一个非常困难的事情,不过操作系统涉及的范围很广,我们可以研究一些我们感兴趣、或者说离我们近一些的部分。比如:内存管理,明白了内存管理,可以对整个操作系统的工作会有一个初步的轮廓。 虚拟内存 如果你是电子相
阅读全文
摘要:楔子 前面我们说了 Cython 是什么,为什么我们要用它,以及如何编译和运行 Cython 代码。有了这些知识,那么是时候进入 Cython 的深度探索之路了。 Cython 和 Python 的差别从大方向上来说无非两个,一个是:运行时解释和预先编译;另一个是:动态类型和静态类型。 解释执行 V
阅读全文