自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 收藏
  • 关注

原创 操作系统下常见的四种网络I/O模型详解

操作系统中,常见的I/O模型包括以下几种:阻塞I/O非阻塞I/OI/O多路复用异步I/O对于网络I/O来说,会涉及到两个系统级别的对象即就是:调用当前I/O的进程以及系统内核。当一个读操作发生的时候,会经历两个阶段:1. 等待数据的准备 2. 将数据从内核拷贝到进程中。阻塞式I/O一般情况下,操作系统中所有的socket默认的是阻塞的,当用户调用了系统套接字recvfrom的时候,内核会就会进入I/O的第一个阶段,就是准备数据,对于网络I/O来说,这时候还有许多数据并未到达,那么内核就需要

2020-11-11 17:43:54 957

原创 依赖MVC设计模式实现轻量级Web框架(六) : Http会话维持的实现

关于Http协议 : Http协议是一种无状态的协议,也就是说客户端对服务端的每一次请求,服务端都不会对客户端进行记录。但是有时候需要保存客户端的状态,比如说购物平台中创建的购物车功能,这就需要通过一种机制来维持客户端与服务端的状态,故提出了Http会话维持机制,在自定义轻量级中是通过session与cookie机制实现的。关于cookie与session机制:cookie保存在客户端,且容量是有限的,所有关于用户信息都是通过明文的形式保存在cookie中,所以这样就有一个致命的问题,如果在传输过程中co

2020-11-11 13:09:29 147

原创 依赖MVC设计模式实现轻量级Web框架(五) : 重定向,序列化以及文件下载功能的实现

重定向,序列化以及文件下载功能作为自定义框架的辅助功能,都是通过Http协议实现。采用了数据与模板分离的思想,将处理逻辑独立封装成为Response对象之后返回给客户端。重定向作为一种网页跳转技术,是Web开发中最常用的功能,重定向分为两种 : 301永久重定向以及302临时重定向。301永久重定向就是旧的资源将被永久性的删除,搜索引擎检索的时候也将旧的链接转化为重定向以后的地址;302为临时重定向,搜索引擎检索的时候将一个旧的链接跳转到新的链接,但是旧的资源还存在重定向技术的实现是通过修改响应头中的L

2020-11-11 11:58:52 702

原创 依赖MVC设计模式实现轻量级Web框架(四) : 模板支持功能的实现

模板支持是一种替换网页资源内容的一种技术。需要动态的渲染网页中的内容的时候,就需要模板支持功能的支撑。如下属代码所示,对于<h1></h1>标签中的内容,需要依据不同的请求而在网页中渲染不同的内容,就用到了模板替换的技术,如果不使用模板替换技术,那么这就是一件非常麻烦的事情,对于不同的请求,就需要编写不同的前端代码。<!DOCTYPE html><html> <head> <meta charset="UTF-8" />

2020-11-10 11:56:59 150

原创 依赖MVC设计模式实现轻量级Web框架(三): 中间件处理功能

中间件功能实现的目的就是为了改变全局的请求与响应。比如说需要对访问流量的限制或者是全局请求合法性的验证。如下图所示 : 客户端请求发送过来之后会进入请求中间件,如果请求中间件拦截成功,那么直接向客户端返回被拦截的响应,否则进入请求转发的流程处理之后将响应提交给响应中间件处理之后返回。那么在轻量级Web框架中如何设计中间件的接口?首先了解一下,请求过来之后的流程 : 请求进入之后首先走的是__call__函数,携带系统信息跳转到applications中的application方法,在该方法中调用了dis

2020-11-09 18:02:41 217

原创 依赖MVC设计模式实现轻量级Web框架(二): 动态路由功能

在框架中最核心的功能就是动态路由,通过动态路由功能才可以将指定访问的路径关联到对应的逻辑处理函数中处理并返回,所以在项目启动的时候就需要将逻辑函数与对应url关联到框架中。通过借鉴目前主流Web框架的做法以及为了更直观的体现MVC模式的应用,在自定义轻量级Web框架中采用了CBV的模式。CBV模式通俗点说就是通过类的方式组织代码将客户端的请求通过反射的方式对应到请求的逻辑函数中,代码实例如下 : class UserloginHandler(BaseHandler) : def get(self,re

2020-11-09 17:07:49 181

原创 依赖MVC设计模式实现轻量级Web框架(一):相关功能的介绍

MVC设计模式:即就是Model(模型)-View(视图) -Controller(控制器)模式,就是一种通过业务逻辑,业务数据以及视图分离的方式来组织代码,降低业务模块,视图模块以及数据模块之间的耦合性。Model(模型) : 处理应用程序数据逻辑的部分,负责从数据库中存取数据View (视图) :处理数据展示的部分,依据模型数据建立Controller (控制器) : 处理应用程序与用户交互部分,负责从视图中读出数据,控制模型的输入输出,并向模型发送数据WSGI协议 :Web服务网关接口,定

2020-11-09 16:28:26 245 1

原创 Mysql原理刨析 :InnoDB存储引擎为什么需要设置主键?并且推荐使用整型的自增主键

1. 为什么要设置主键 ?毫无疑问的是,当对Mysql中的表设置了InnoDB存储引擎的时候,那么就需要对一列数据建立索引,方便快速查找,如果不设置主键的,Mysql会在表中逐列对比寻找无重复项的列作为逐渐,如果没有查找到,那么Mysql会在表中添加默认列作为主键。如果不设置主键列,那么Mysql会消耗大量的资源去寻找索引列或者是创建新的索引列,如果设置了索引列那么将极大的降低Mysql的资源消耗。2. 为什么要采用整型的数据 ?Mysql底层对数据查找的时候,会涉及到大量的对比操作,如果采用UUID

2020-09-26 17:10:24 634

原创 Mysql底层原理(二) :两种存储引擎的底层实现

Mysql中存在两种存储引擎 :MyISAM存储引擎以及InnoDB存储引擎MyISAM属于表级别的非聚集存储引擎,而InnoDB则属于表级别的聚集存储引擎。非聚集以及聚集的区别:通过数据是否与索引隔离而判断:在Mysql文件中默认MyISAM存储引擎的表中存在两个文件即 tableName.MYI 以及 tableName.MYD ,以MYI结尾的文件中存储的是该表的索引,以MYD结尾的存储是数据。而默认InnoDB存储引擎的表中只存在.idb结尾的文件,该文件中存放了索引以及文件。MyISAM存

2020-09-26 16:52:29 510

原创 Mysql进阶(一):Mysql索引底层数据结构

了解Mysql底层之前,首先要对以下几种数据结构有着比较深入的了解:二叉查找树平衡二叉树红黑树哈希表B - 树为什么要了解这几种数据结构?从这些数据结构出发可以对Mysql的底层有着更加深入的理解。首先来看以下二叉查找树,在查找的过程中,二叉查找树可以将查找效率优化到O(logN),了解二叉查找树一定明白,二叉查找树的一个重要的性质就是比当前节点小的节点都位于当前节点的左子树,比当前节点大的节点都位于当前节点的右子树。但是二叉查找树有着一个相对致命的缺点影响二叉查找树的效率,当插入线性递增或

2020-09-26 16:38:41 121

原创 Falsk源码刨析(二) : 请求到响应的流程源码刨析

客户端发送过来请求之后,首先会携带参数调用app对象__call__()的方法,该方法中只完成了一件事,就是调用wsgi_app()方法 def __call__(self, environ, start_response): /* @environ : 创建的WSGI环境 @start_response : 接受状态码的响应对象 */ return self.wsgi_app(environ, start_response)

2020-09-11 15:47:19 115

原创 Flask源码刨析(一):匹配规则与视图函数映射实现功能刨析

Python种目前比较主流的Web开源框架有Django,轻量级框架Falsk以及异步框架Tornado。Falsk作为轻量级框架,可以利用其快速搭建一个网站或者Web服務。Flask高度依赖于两种第三库渲染模板引擎的janjia2以及用于处理WSGI(Web 服務网关接口)协议的工具集werkzeug。Falsk可以理解为一个建立再两个第三方库之间的桥梁,前者用于实现对模板的渲染,后者则是接受HTTP请求,并对请求预处理,之后触发Falsk框架。对Flask有了简单的了解之后,正式进入对源码的分析阶段

2020-09-11 11:31:53 149

原创 设计模式:工厂方法模式的实现

工厂方法来源于简单工厂模式,继承简单工厂模式的优点同时又弥补了简单工厂模式的缺点,工厂方法模式将具体产品的创建过程延迟到了抽象工厂的子类中即就是具体工厂类中,添加新的产品的时候只需要创建一个新的具体工厂类就可以完美的解决,更好的符合了开闭原则。from abc import abstractmethod,ABCMetaclass AbstractProductHandler(metaclass=ABCMeta) : #抽象产品类 @abstractmethod def doOp

2020-09-05 16:09:19 192

原创 redis高级进阶:redis分布式锁的业务逻辑模型以及模型实现

系统对于业务量的承载难度是呈指数级增长,对于业务量小的系统,完成可以利用单线程模型完成对业务逻辑的处理,并不影响用户的体验以及系统性能,但是对于业务量大项目,单线程处理的逻辑显然不适合用,高并发的系统一方面要考虑用户的体验,同时也要兼顾系统的性能。redis作为系统的缓存中间层,因为操作缓存层的效率要远远高于直接操作数据库,所以能够有效的考虑用户的体验。redis分布式锁作为处理高并发业务中的最基础的业务模型是值得了解以及学习的。redis分布式锁常用业务场景主要集中于高并发场景的秒杀系统或者是接口的幂等

2020-09-05 13:50:00 340

原创 Redis专题:Redis集群方案——主从复制模式

1

2020-08-21 14:35:04 324

原创 Redis专题:Redis两种持久化的方式

刚才给v伙伴们,

2020-08-21 13:45:47 169

原创 Python高阶专题:如何平衡多线程以及多进程的选择?

多线程与多线程在具体项目开发中如何平衡?什么场景下使用多线程?什么场景下使用多进程?要了解这些问题之前,首先要对Python中的GIL(全局解释器锁)有比较深刻的了解,GIL限制Python语言发挥多核的优势,使得某一时间点只有一个线程运行在CPU上。总的来说,开发过程中的开发场景逃不开数据密集型场景以及I/O密集型场景,不同的业务场景需求也有差异,顾名思义,数据密集型的场景对于CPU的使用频率要远高于I/O密集型,所以可以得出结论,对于数据密集型的场景来说优先选择多进程可以有效的发挥多核CPU的优势,而I

2020-08-19 18:09:28 235

原创 Python高阶专题:线程间同步以及同步机制

1. 线程同步多个线程争抢同一资源的时候,为了保证资源能够合理的分配给每个线程而避免线程之间争抢资源造成死锁等行为,所以引入了线程同步的机制。2. 线程同步的机制2.1 锁机制锁机制时最常见的线程同步机制,在线程争抢单一少量资源的时候最为常见,订单开发模型中的减库存实例就可以利用锁机制实现,保证数据的合法性。加锁的方式有两种分别为LOCK以及RLOCKfrom threading import Lock,RLocklock = Lock()lock.acquire() #加锁lock.r

2020-08-19 11:27:16 283

原创 Python高阶专题:多线程编程之线程间通信

线程间的通信在多线程编程过程中难以避免,常见的线程间通信方式有两种:共享变量通过消息队列Queue实现1. 共享变量目前接触的问题来看,适应于解释多线程编程过程中一个典型实例nums = 0def InsertNums() : global nums for i in range(10000000) : nums += 1def DeleteNums() : global nums for j in range(10000000) :

2020-08-18 18:17:51 174

原创 Python高阶专题:Python多线程中的全局解释器锁(GIL)

1. GIL的渊源Python中的GIL并非Python的特性,Python不完全依赖GIL,GIL是为了实现解释器时引入的一个全局排他锁。Python中的一个线程对应C语言中的一个线程,运行时在解释器上加锁,使得任意时刻只运行在一个CPU上执行字节码2. GIL并非效率低Python中的GIL并非想象中的效率低下,加载在解释器上的全局排他锁在一定的条件下会释放执行一定数量的字节码行数时释放执行I/O操作的时候释放执行一定的时间片之后释放nums = 0def InsertNums(

2020-08-18 17:46:37 154

原创 Python高阶专题:属性描述符__get__,__set__,__delete__

rtdgvh

2020-08-06 11:57:02 167

原创 Python高阶专题:抽象基类以及isinstance与type的检查

了解Java的开发者对接口不会陌生,Java无法进行多继承,所以引入了接口的概念实现多态,而Python则遵守鸭子类型的编程风格,对于鸭子类型这里不做详细解释,有兴趣可以查询以前的博客。既然Python弱化了多继承的难度,为何还要引入抽象基类这个概念 ?与Java接口类似,Python中抽象基类无法进行实例化,强制实例化会抛出异常from abc import abstractmethod,ABCMetaclass AbstractBaseHandler(metaclass=ABCMeta) :

2020-08-06 11:45:07 327

原创 Python高阶专题:鸭子类型与多态

鸭子类型

2020-08-05 19:03:55 524

原创 Redis专题:redis实现常见的业务模型

从v会比较慢,

2020-08-05 13:43:13 223

原创 Redis专题:Redis集群中哈希一致性算法原理

在Redis分布式集群中,保证数据能够均匀的分布在集群中每个机器中是Redis追求的基本操作,由于redis中的数据是动态变化的,所以为了保证通过最小的代价保证数据均匀分布,哈希一致性算法被提出1.常规的解决方案导致的问题如果集群中存在两台服务器,为了保证数据均匀的落在这两台服务器中,常规的解决方案:拿到每条数据的key值,并对其进行哈希处理拿到哈希值之后用其模上集群中机器得数量将得到结果对应数据存放到对应编号的机器对与数据量小的业务,这种方案可以很好的保证数据可以均匀的分布在每台服务器中,

2020-08-02 17:29:41 518

原创 Redis专题:缓存雪崩+缓存击穿+缓存穿透

1.Redis在项目中的应用处理系统并发提高系统性能实现分布式锁2.Redis的应用模型redis作为缓存层存储热点数据,解决并发问题3. Redis常见问题3.1 缓存雪崩redis中的存储的热点数据有一定的有效期,未来某一时刻这些数据会被redis清空,如果热点数据集体失效,那么所有的请求都会打向Mysql,轻则影响用户体验,重则导致Mysql服务器宕机该问题就是被称为缓存雪崩同一时期缓存的数据集体失效redis服务器宕机3.1.1 缓存雪崩解决方案1. 同一时期缓存

2020-08-02 13:30:10 177

原创 Python高阶专题:__getattr__以及__getattribute__区别

ybjnkm

2020-08-01 02:54:02 142

原创 Python高阶专题:元类编程以及Django框架ORM的实现

1. 元类编程在了解元类编程之前首先要明白类这个概念,按照类的定义可以理解类是创建对象的实例的模板,Python明确说明了在Python中一切皆对象,那么可以理解类也是对象,如果类是对象,那么一定就有创建类的模板,元类编程可以说是创建类的模板1.1 运行时动态创建类类创建的查找顺序 : 优先查找metaclass指定的类创建,如果没有找到查找其类的继承链,之后调用type()创建类1.1.1 常规的动态创建类的方式/*通过用户的选择创建不同的权限的用户*/def CreateUserClass

2020-07-31 13:44:37 288

原创 Redis专题:过期策略以及内存淘汰机制

数据存放在内存中的访问效率时远远优于数据存放在磁盘中,因为磁盘的I/O操作时非常耗时的操作,对于服务器的性能以及用户体验都不友好。直接操作内存可以极大降低访问时间改善提高服务器的性能,但是由于内存的容量远小于磁盘容量,所以引入了过期策略以及内存淘汰机制清除掉内存中一些冗余的数据,降低系统的开销。1. redis的过期策略redis采用了定期删除+惰性删除的过期策略1.1 定期删除redis 默认隔 100ms 随机抽取一些设置了过期时间的 key,检查其是否过期,但是这并不是最优化的方案,如果内存中

2020-07-29 13:40:11 134

原创 Python高阶专题:生成器以及生成器原理

1.Python普通函数的调用原理def MainFunction() : #主调函数 MoudleFunction() passdef MoudleFunction() : #被调函数 pass主调函数在执行过程中,主调函数一直持有控制权,当被调函数执行的时候,主调函数将控制权权交给被调函数,在被调函数执行期间,被调函数一直享有控制权直到执行完成之后释放控制权。标准的Python解释器是通过c语言编写的,解释器通过一个c函数PyEval_EvalFrameEx 执行Python函数。其

2020-07-29 12:03:42 268

原创 Python高阶专题:内置模块UserList与UserDict的区别

No. UserList与UserDict|--|from collections import UserDict,UserListUserList与UserDict都是内置的可以继承模块的封装class MyList(UserList) : passclass MyDict(UserDict) : pass1.为什么定制列表或者字典的时候不直接继承list或者dict ?python列表以及字典的实现都是通过C语言实现,如果直接继承会导致有些方法被覆盖掉,所以Python提

2020-07-29 11:21:25 644

原创 Python高阶专题:可迭代对象协议以及迭代器

No.迭代协议与迭代器1.迭代协议与可迭代对象只有实现了迭代协议 __iter__才可以称为可迭代对象2.迭代器访问集合内元素的方式,用于遍历数据,但是无法返回,提供了惰性访问数据,同时实现了__iter__以及__next__协议|--| from collections.abc import Iterable,Iterator# Iterable : 可迭代对象继承类 # Iterator : 迭代器对象继承类|--| Iterable 源码class Iterable(metacla

2020-07-28 21:33:23 124

原创 Python高阶专题:序列类型之特殊序列类型的协议(+,+=,extend的区别以及可切片序列)

No.序列类型的特定协议1. 序列操作中+,+=,extend的区别1.1 + 操作与 +=的区别1.1.1 +操作sequence = [1,2,3]sequence = sequence + [4,5,6]print(sequence) # [1, 2, 3, 4, 5, 6]sequence = [1,2,3]sequence = sequence + (4,5,6)#Traceback (most recent call last):File #"D:/WeChatHand

2020-07-28 21:11:14 179

原创 Python高阶专题:序列类型之序列类继承关系

序列类的继承关系Pyhton操作是通过Python的协议约束的,序列对象的操作也不例外,只有满足了某种协议,序列才有了相对应的操作。通过类的继承使得序列的功能越来丰富1.序列类的类继承源码|--|from collections import abc|--|--|from _collections_abc import __all__|--|--|--|--|__all__ = ["Sequence", "MutableSequence"]1.1 Sequence的类继承源码class It

2020-07-28 20:42:33 396

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除