- 博客(50)
- 收藏
- 关注
原创 读猿码系列——6.Golang中用幂等思路解决缓存击穿的方案:singleflight
SingleFlight的作用是在处理多个goroutine同时调用同一个函数的时候,只让一个goroutine去实际调用这个函数,等到这个goroutine返回结果的时,再把结果返回给其他几个同时调用了相同函数的goroutine,这样可以减少并发调用的数量。在实际应用中也是,它能够在一个服务中减少对下游的并发重复请求。
2022-10-15 11:26:53
817
1
原创 读猿码系列——4. 从filebeat和go-stash深入日志收集及处理(go-stash篇)
go-zero组件之一,logstash的golang版本
2022-06-07 21:02:52
1441
原创 读猿码系列——3. 从filebeat和go-stash深入日志收集及处理(filebeat篇)
提到容器的日志采集,在实际生产开发流程中,我们通常是先自己封装的日志库,然后走 filebeat + kafka + logstash + es这个完整的日志收集处理流程。关于kafka和es的资料网上比较多,这两块我们暂且不细看。go-satsh是logstash 的 Go 语言替代版,是go-zero生态中的一个组件,这部分我们将在go-satsh篇介绍。...
2022-06-07 20:58:50
943
原创 读猿码系列——2. 搞懂Etcd核心API
Etcd是一个高可用的分布式键值(key-value)数据库,Etcd也是云原生架构中重要的基础组件之一,它在微服务和Kubernates集群中不仅可以作为服务注册与发现,还可以作为key-value存储的中间件,供应用程序读取和写入数据。作为一个高度一致的分布式键值存储,它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据。它可以优雅地处理网络分区期间的 leader 选举,以应对机器的故障,即使是在 leader 节点发生故障时。Etcd的存储有如下特点: 采用键值对数据存储,
2022-05-03 16:09:58
1322
原创 读猿码系列——1. gRPC+Etcd3的服务发现&负载均衡
项目源码:https://github.com/wwcd/grpc-lb项目文档:https://segmentfault.com/a/1190000008672912我们先把项目down下来,它的目录结构如下:我们先去掉其他组件,单来看下gRPC的调用流程,下图是官方文档中的调用流程图: 首先客户端(gRPC stub)调用A方法,发起RPC调用; 对请求信息使用Protobuf进行对象序列化压缩; 然后在服务端(gRPC Sever)接收到请求后,解.
2022-05-03 16:05:41
1367
原创 从卡牌类游戏初探游戏服务器
游戏服务器与普通服务器有什么区别呢?如果你想了解游戏开发,这个问题你一定思考过。它们之间的区别包括数据的实时性、交互性、并发性等区别,而且对于不同类型的游戏,服务器之间的差异也很大。这里以弱交互类型为例,就是建立HTTP短连接的游戏服务器类型。这类型的游戏不需要进行实时连接和实时计算,例如:部分卡牌游戏、横版卷轴如跑酷、部分回合制游戏、天梯积分奖励等,它们注重客户端的玩家体验。而对于实时网络对战的游戏,如MMORPG或者需要低延迟的游戏,如射击类游戏等都需要实时连接,这时候需要有状态的连接方式。对于
2022-02-07 11:22:58
4230
2
原创 深入Git —— 从底层对象到常用命令速刷手册
首先来简单介绍下Git,Git是一款分布式版本控制工具,需要存储大量的文件内容数据,其中Gitobjects发挥了关键的作用。Gitobjects基本存储了Git的一切,多种类型的对象和对象之间的引用共同构成了Git版本控制的核心。Gitobjects的存储特点如下: GitObjects会松散存储在仓库的.git/objects/目录下 Git Objects采用key-value的形式进行存储 不同的Object,Git会为其生成唯一的key key的格式...
2021-09-24 20:13:15
269
原创 从一次RPC调用流程看各场景下gRPC框架的解决方案(上)
先来简单总结回顾下HTTP/2和ProtoBuf 协议分别是如何提升性能的:在HTTP/2 中采用了静态表和动态表结合来降低HTTP头部体积,并通过Stream流实现并发传输;ProtoBuf 通过在 proto 文件中为每个字段预分配 1 个数字,编码时省去了完整字段名占用的空间。RPC——像调用本地一样发起远程调用在进入gRPC框架前先来简单看一下RPC是什么。RPC全称是 Remote Procedure Call,即远程过程调用,用于网络间的进程通信。RPC以编程语言中本地函数调用形式,
2021-08-12 15:06:21
612
原创 应用层编解码调优思路——HTTP1.1和HTTP2以及编解码工具Protobuf
为了大家更好的整理思路,今天分享的HTTP优化相关内容将围绕在HTTP诞生之初,对于其在应用层的5个精准定位展开,这也正是 REST 架构能够成功的关键。 基于TCP连接 采用请求-响应模式 低门槛的ASCII编码 无状态 信息安全交由TLS解决 首先是基于TCP连接,这意味着应用层无需关注如何可靠传输变长的消息,交由TCP处理即可;请求-响应模式使得客户端(client)及服务端(server)的开发变得简单;无状态的特性使得服务端更容易实现高可用;TLS
2021-07-11 22:32:03
538
2
原创 应用层编解码调优思路——TLS/SSL性能优化
说起应用层协议优化,我们首先想到的一般是使用HTTPS代替HTTP,即TLS/SSL协议来保障应用层消息安全。不过针对一些图片网站,在权衡安全与性能后选择了后者,所以还在使用HTTP。实际上TLS/SSL是由一系列加密算法及规范组成,对于性能优化我们从两个切入点来看,分别是如何选择加密算法以及加密时的密钥是如何传递的。先来说下对加密算法的选择,目前主流的对称加密算法是AES(Advanced Encryption Standard),它在网站访问和压缩软件中均有被使用到,这也是我们首选的对称加密算法
2021-07-10 23:06:56
457
1
原创 Twisted——基于事件驱动的Python网络框架
对于追求服务器程序性能的应用有什么适用的Python框架吗?那就是今天和大家分享的Twisted框架,它支持许多常见的传输及应用层协议,包括TCP、UDP、SSL/TLS、HTTP、FTP等,这也意味着能为客户端和服务器端提供自定义开发工具。那为什么就说它能保证高效能通信呢?Twisted在不同的操作系统平台上利用了不同的底层技术:在Windows中,基于IO完成端口技术保证了底层高效地将I/O事件通知给框架及应用程序;在Linux中采用epoll技术,它能显著提高在大量并发连接中只有少量活跃的情况下C
2021-07-01 09:39:15
1340
2
原创 事件驱动如何理解?什么场景下适合用?Python如何实现一个事件监听器?
产品小姐姐给了阿巩这样的业务需求:游戏服务器希望在玩家升级或者达成某项成就时触发多种效果。比如玩家升级后,全属性将会提高,解锁新的系统,可以学习其他技能且开启新的战斗模式……可以看出,玩家升级后,所有挂钩的业务都要集中在一起,依次被处理。首先我们使用if 玩家升级再逐条添加业务功能代码是完全可以实现的,但是这样写出来的代码耦合度极高,往往是“牵一发而动全身”,一旦后续新业务加入,还要继续插入代码。为达到解耦效果,引入了事件驱动模型:我们把“玩家升级”包装成一个事件,任何对这个事件感兴趣的“观察者”只需要
2021-06-10 09:58:04
773
2
原创 Go语言基础速刷手册
我们就不从安装和hello world开始了,首先来看下Go的变量和内置数据类型都有哪些。变量声明Go 语言与其他语言显著不同的一个地方在于,Go 语言的类型在变量后面。方法一:指定变量类型,如果没有初始化,则变量默认为零值。var a = "Agong"var b intvar c boolvard string这里的零值指的是:数值类型为0、布尔类型为false、空字符串等。方法二:根据值自行判定变量类型。var d = true方法三:在函数体内需要初始化声明时使.
2021-05-06 10:55:14
284
1
原创 B树和B+树区别及适用场景
B树和B+树相比,有两个最核心的区别:1、B树没有内部节点和叶子结点的区分,它的每个节点都是即存了key又存了data。2、由于没有内部节点和叶子结点的区分,使得B+树没有将叶子结点用链表串联起来的结构。这两个区别给B树带来了两个检索的特点:1、进行单个key查询时,B树最快可以在O(1)的时间代价内就查到。而从平均时间代价来看,会比B+树稍快一些。但波动会比较大,因为每个节点既存key又存data会使得树变高,底层的节点的IO次数就会变多。2、进行范围查询时,由于缺乏叶子结点的连.
2021-04-25 11:51:05
3499
2
原创 Django Rest framework使用简介
在开发Web应用中,有两种应用模式: 前后端不分离[客户端看到的内容和所有界面效果都是由服务端提供出来的。] 2.前后端分离[把前端的界面效果(html,css,js分离到另一个服务端,python服务端只需要返回数据即可]。前端形成一个独立的网站,服务端构成一个独立的网站什么是API?如果我们把前端页面看作是一种用于展示的客户端,那么 API 就是为客户端提供数据、操作数据的接口。例如:我们经常使用的淘宝商城就有很多的客户端,Web, iOS 和 Android端,但是当我.
2021-04-19 23:01:03
1414
1
原创 如何区分不同用户?Cookie/Session详解,基于Token的用户认证——JWT
Cookie和Session作用都是跟踪用户的整个会话。Cookie是存在于客户端的“客户通行证”,Session是存在于服务端的“客户档案表”。Cookie:为什么产生:一个用户的所有请求操作对应一个会话,另一个用户则对应另一个会话,但是由于HTTP协议的无状态特性,服务器无法单从连接上跟踪到会话。来源:服务端response向客户端浏览器颁发Cookie,存储在客户端的浏览器中。作用:当浏览器再次请求该网站时,浏览器把url+Cookie提交给服务器,在服务端进行验证。操作:服务端操
2021-04-15 19:53:54
1617
原创 Django应用上线前有哪些注意事项?如何使用同步或异步容器启动Django应用?
Django应用上线前的注意事项单元测试首先在整个应用上线前,应该有完整的单元测试去测试各模块的功能。通常需在写代码的过程中甚至之前需要写好单元测试,以便高效维护代码的设计结构。我们可以使用Python自带的UnitTest或者Django的TestCase,这里介绍下Django的TestCase。下图为Django TestCase的几个重要的基类:SimpleTestCase:继承自python,可以发起HTTP请求,跟页面模板以及URL做交互,但是该基类禁止了数据库的访问。 Tra
2021-04-14 17:57:12
250
原创 Python分布式任务队列Celery,Django中如何实现异步任务和定时任务
问题引入个人的某Django项目需要实现在后台发送邮件,发送邮件时间比较长,需要在后台做大量的数据运算,包括去做深度学习生成报告,以及做大量数据的处理。由于Python中GIL全局锁的限制,单是使用多线程threading,无法充分利用CPU,这里需要一个工具实现异步方式来进行分配管理任务。Celery简介celery是一个分布式的任务队列,把大量任务分布到不同的机器上去,通过集群来运行大量的任务。celery由Python编写,可通过暴露HTTP方式进行任务交互以及与其他语言集成开发。安装
2021-04-13 23:23:38
878
1
原创 系统性能调优思路整理
一、基础设施优化1、提升 CPU 缓存的命中率CPU 缓存分为数据缓存与指令缓存。按顺序访问数据(操作连续内存):利用数据缓存,提高读数据缓存的命中率。 有规律的条件分支(如数据集先排序再处理):利用指令缓存,提高读指令缓存的命中率。 数据按缓存行大小填充/对齐(通常为64字节):防止伪共享,提高并发处理能力和缓存命中率。 对于多核CPU,如果缓存命中率很高,可以考虑进行CPU绑定。伪共享:假设cache line是64字节,我们在一个64字节的并且和cache line 对齐后的内
2021-04-09 23:06:17
1146
原创 百度、字节、天融信等社招Python后端开发面经
Python基础:1、Python基本数据结构有哪些2、Python数据类型间的互转,举例子3、数组的遍历和切片4、有序字典5、迭代器,优缺点6、__init__和__new__的区别7、面向对象的特性、Python中如何体现面向对象8、pass语句9、Python2和Python3的区别,编码上的区别10、Python可变和不可变数据类型11、lambda匿名函数12、思路题:数据的去重和排列组合方法,内置类库13、正则匹配需要哪几个关键步骤14、场
2021-03-21 00:48:53
1613
4
原创 解决Django 前后端分离跨域问题
一、跨域出现原因浏览器的同源策略:同源策略是一种浏览器最基本的安全机制,如果两个 URL 的 protocol、port(如果有指定的话)和 host都相同的话,则这两个 URL 是同源。二、解决方案(一)CORS:使用django-cors-headers包支持Python 3.6至3.9。支持Django 2.2到3.2。1、从pip安装:pip install django-cors-headers2、修改settings.py:注册AppINSTALLE..
2021-03-10 18:09:12
1133
原创 什么是IO多路复用?用来解决什么问题?如何实现?
白话IO多路复用这里引述知乎大佬对于IO多路复用的机场空管的比喻和理解:假设你是一个机场的空管, 你需要管理到你机场的所有的航线, 包括进港,出港, 有些航班需要放到停机坪等待,有些航班需要去登机口接乘客。你会怎么做?最简单的做法,就是你去招一大批空管员,然后每人盯一架飞机, 从进港,接客,排位,出港,航线监控,直至交接给下一个空港,全程监控。那么问题就来了:很快你就发现空管塔里面聚集起来一大票的空管员,交通稍微繁忙一点,新的空管员就已经挤不进来了。 空管员之间需要协调,屋子里面就1,
2021-01-29 00:12:47
4958
5
原创 为什么使用中间件?如何实现Redis分布式锁以及缓存和消息队列常见问题
中间件什么是中间件用户量增加时对应用程序做横向扩展的架构趋势,比如:MySQL读写分离或对MySQL表进行横向和纵向拆分。即将应用程序的单个节点拆分成多个节点,用户登录到不同节点后产生的连接session,通过采用中间一个共享的介质去存储多节点的会话。企业级应用中常用的中间件主要是缓存和消息队列这两类,原因有以下几点:随着业务规模增大,单体应用无法满足业务场景需求。 用户数量剧增,单凭数据库无法抗住并发压力。 业务场景复杂需要解耦。 业务场景丰富造成访问热点。从数据请求看缓存.
2021-01-23 17:26:17
797
原创 详细Redis核心知识点汇总
Redis核心知识点思维导图指路:链接:https://pan.baidu.com/s/1HXHsJHQ-CZuGwnA6s6FUVw提取码:owkk一级分类如下:常见Redis问题如下。便于定位问题,对症下药解决:
2021-01-23 11:19:29
186
原创 MySQL理论汇总大纲——日志和主备相关
一、日志系统 redo log(重做日志): 当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log里面,并更新内存,同时InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面。 WAL(Write-Ahead Logging):关键点即先写日志,再写磁盘。将磁盘的随机写变成了顺序写。 WAL 机制主要得益于两个方面: 1、redo lo...
2020-12-17 15:42:04
146
原创 一条SQL更新语句是如何执行的?
MySQL 的逻辑架构图如下(图源丁奇老师专栏《MySQL实战45讲》):SQL更新语句执行流程:1.首先客户端通过tcp/ip发送一条sql语句到server层的SQL interface。2.SQL interface接到该请求后,先对该条语句进行解析,验证权限是否匹配。3.验证通过以后,分析器会对该语句分析,是否语法有错误等。4.接下来是优化器生成相应的执行计划,选择最优的执行计划。5.之后执行器根据执行计划执行这条语句。在这一步会去open table,如果该table上有MDL
2020-12-16 23:33:09
154
原创 MySQL理论汇总大纲——锁相关
1、根据加锁范围分为:全局锁、表级锁、行锁 全局锁 1、范围:对整个数据库实例加锁。 2、MySQL提供加全局读锁的方法:Flush tables with read lock(FTWRL)。 3、这个命令可以使整个库处于只读状态。使用该命令之后,数据更新语句、数据定义语句和更新类事务的提交语句等操作都会被阻塞。 4、使用场景:全库逻辑备份。 5、风险 ...
2020-12-16 16:15:41
295
原创 MySQL理论汇总大纲——事务相关
1、事务特性 原子性 一致性 隔离性 持久性2、多事务同时执行时会出现的问题 脏读 当前事务读到的数据是别的事务想要修改成为的但是没有修改成功的数据。 不可重复读 当前事务先进行了一次数据读取,然后再次读取到的数据是别的事务修改成功的数据,导致两次读取到的数据不匹配,也就照应了不可重复读的语义。 针对update或delete 幻读 当前事务读第一次取到的数据比后来读取到数据条...
2020-12-16 00:15:42
124
原创 MySQL理论汇总大纲——索引相关
索引相关1、索引的作用: 提高数据查询效率2、常见索引模型: 哈希表、有序数组、搜索树 哈希表:键 - 值(key - value) 哈希思路:把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置 哈希冲突的处理办法:链表 哈希表适用场景:只有等值查询的场景 有序数组: 按顺序存储。查询用二分...
2020-12-15 18:24:42
155
原创 Django的请求响应完整流程解析
图例:Django:Django内部自己实现的代码。Your code: 程序员实现的代码。Extendable:可对工作进行全局扩展的,各种中间件。External:外部工具,例如浏览器、数据库。步骤详细解释:1、通过Http客户端(浏览器或爬虫)发起请求,访问到modwsgi,modwsgi使用Django的WSGI模块实现(通过manage.py runserver启动)。启动WSGI模块后会给每一个用户生成一个Handler句柄(WSGIHandler类控制整个请求到响应..
2020-11-12 11:31:01
1689
原创 Python实现哲学家就餐问题
哲学家就餐问题:哲学家就餐问题是典型的同步问题,该问题描述的是五个哲学家共用一张圆桌,分别坐在五张椅子上,在圆桌上有五个盘子和五个叉子(如下图),他们的生活方式是交替的进行思考和进餐,思考时不能用餐,用餐时不能思考。平时,一个哲学家进行思考,饥饿时便试图用餐,只有在他同时拿到他的盘子左右两边的两个叉子时才能进餐。进餐完毕后,他会放下叉子继续思考。请写出代码来解决如上的哲学家就餐问题,要求代码返回“当每个哲学家分别需要进食 n 次”时这五位哲学家具体的行为记录。测试用例:输入:n = 1 (1
2020-11-08 19:34:04
2574
原创 Python操作MySQL
1.安装PyMySQL使用pip命令安装PyMySQL库。pip install PyMySQL2.创建数据库使用脚本create_employee.sql创建数据库mytestdb,以及创建数据表employee。create_employee.sql代码如下:create database if not exists mytestdb character set utf8;use mytestdb;drop table if exists `employee`;...
2020-11-06 20:55:43
190
原创 collections扩展基本数据类型
collections 官方文档:https://docs.python.org/zh-cn/3.7/library/collections.htmlcollections提供了加强版的数据类型,以下列举三个常用基本数据类型:namedtuple ——带命名的元组 Counter ——计数器 deque ——双向队列namedtuple使用namedtuple定义元组中存放的数据为Point点的x,y坐标。支持通过位置顺序传递参数以及关键字传递参数。#命名元组import.
2020-11-04 18:33:39
205
原创 如何判断链表有环
题目描述:有一个单向链表,链表中有可能出现“环”,如下图,那么,如何用程序来判断该链表是否为有环链表呢?方法一: 从头节点开始遍历每一个节点,每遍历一个新节点就从头检查到新节点之前的所有节点,如果和该新节点的值有重复,则证明该节点被遍历过两次,链表有环;如果不存在与新节点相同值的节点,就继续遍历下一个新节点,继续重复上述操作。假设链表的节点数量为n,则该解法时间复杂度为O(),由于未创建额外存储空间,空间复杂度为O(1)。方法二: 引入哈希表,创建一...
2020-11-04 16:09:16
369
原创 python核心知识汇总
一、列表和元组基本概念列表和元组,都是一个可以放置任意数据类型的有序集合。其中列表是动态的,长度大小不固定,可以随意地增加、删减或者改变元素;而元组是静态的,长度大小固定,无法增加删减或者改变。 Python 中的列表和元组都支持负数索引,-1 表示最后一个元素,-2 表示倒数第二个元素,以此类推。 列表和元组都支持切片操作 列表和元组都可以随意嵌套 两者也可以通过 list() 和 tuple() 函数相互转换 列表和元组常用的内置函数: count(
2020-06-27 04:28:34
3264
原创 SVM支持向量机+实例展示
一、SVM简介SVM定义:支持向量机(英语:support vector machine,常简称为SVM,又名支持向量网络)是在分类与回归分析中分析数据的监督式学习模型与相关的学习算法。给定一组训练实例,每个训练实例被标记为属于两个类别中的一个或另一个,SVM训练算法创建一个将新的实例分配给两个类别之一的模型,使其成为非概率二元线性分类器。SVM模型是将实例表示为空间中的点,这样映射就使得单独...
2019-08-05 15:54:29
35364
1
原创 朴素贝叶斯实例二——情感分析
大体思路:从测试数据中将用户正面情感和负面情感的评论抽取出来,以识别评论是正面负面,和真实标签进行对比计算出准确率。from matplotlib import pyplot as pltimport jieba # 分词import re # 正则from sklearn.feature_extraction.text import TfidfVectorizerimport nu...
2019-07-30 13:52:18
3039
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人