自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

klay的博客

普通软件工程的本科在校学生,主要开发语言为java、go,正在拓展自己的开发栈

  • 博客(40)
  • 收藏
  • 关注

原创 Django学习笔记:Django安装配置与运行

配置Django使用pip3安装Djangopip3 install django —version=2.1.2查看下载的django版本使用ipython进入python命令行In [1]: import django

2020-11-14 20:32:50 220

原创 Django学习笔记:View层传参方法

View层:传参方法?传参方法在url后面使用?表示参数,如下:http://127.0.0.1:8000/?name=klay&age=18使用方法:在View视图层使用request.GET.get(arg1,arg2)函数接受参数Arg1表示参数名字,arg2表示默认值,如果在url处没有传入值,则在django逻辑中设置arg2为默认值在two应用下对应的view层编写以下代码:-untitled0 -two views.pydef index(request):

2020-11-14 20:30:47 1342

原创 Python学习笔记:迭代器

迭代器只要是可迭代的对象,无论有没有下标,都是可以迭代的# 迭代字符串for x in 'hello world!': print(x)hello world!# 迭代listsum = 0for x in [1,3,4,6,7,8]: sum+=xprint(sum)29# 迭代字典dict = {'图书馆':3,'机场':11,'教研室':23}for key in dict: print('key is : {}, valu

2020-11-13 19:25:29 259 1

原创 Python学习笔记:函数

函数定义一个函数#格式:def functionname( parameters ): "函数_文档字符串" function_suite return [expression]定义一个功能为最大值的函数def max(num1,num2): if num1>num2: return num1 else: return num2print(max(55,77))77在函数中可以进行类型判断处理,如果类型不合法则可

2020-11-13 14:21:13 285

原创 Python学习笔记:Set集合

Set集合python 的 set 和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素。创建一个SetSet需要接入一个list列表作为传入进行创建set1 = set([1,2,3])set1{1, 2, 3}如果创建字典过程中有重复的值,则会把重复的值给过滤掉set1 = set([1,2,3,2,1])set1{1, 2, 3}删除Setset1.remove(3)set1{1, 2}Set运算Set是无序不重复的元素集合,

2020-11-13 11:02:26 138

原创 Python学习笔记:Dict字典

Dict字典类似于Java中的map,使用key-value存储值对,加快查找速度创建字典dict = {'1':'李明','2':'陈凯','3':'吴菲'}dict{'1': '李明', '2': '陈凯', '3': '吴菲'}字典的键必须是唯一的,而值不一定需要是唯一的,如果出现了键不唯一,则会覆盖原来的值dict = {'1':'李明','2':'陈凯','1':'吴菲'}dict{'1': '吴菲', '2': '陈凯'}访问字典dict = {'1':'李明',

2020-11-13 09:52:24 233

原创 Python学习笔记:元组

Tuple元组tuple 和 List 非常类似,但是 tuple 一旦初始化就不能修改。 也就是说元组(tuple)是不可变的元组(tuple) 不可变是指当你创建了 tuple 时候,它就不能改变了,也就是说它也没有 append(),insert() 这样的方法,但它也有获取某个索引值的方法,但是不能赋值。因为 tuple 是不可变的,所以代码更安全。所以建议能用 tuple 代替 list 就尽量用 tuple 。创建一个Tuple元组tuple1 = 'first','second',

2020-11-12 20:31:20 169

原创 Python学习笔记:列表

列表创建列表name = ['first', 'second', 'third']优点:可以避免重复性工作,替代如下代码:name1 = 'first'name2 = 'second'name3 = 'third'访问列表中的值输出第一个值:print(name[0])输出全部值:print(name[0:])print (name)需要注意的是,打印列表的过程是左闭右开的以下代码打印的结果是第一和第二个元素print(name[0:2])['first', 'se

2020-11-12 19:47:28 139

原创 谈一谈Java中的深拷贝和浅拷贝

在 Java 开发中,对象拷贝或者说对象克隆是常有的事,对象克隆最终都离不开直接赋值、浅拷贝、深拷贝 这三种方式,其中直接赋值应该是我们最常用的一种方式吧,对于浅拷贝和深拷贝可能用的少,所以或多或少存在一些误区,这篇文章会详细的介绍这三种对象克隆方式。前置知识值类型:Java 的基本数据类型,例如 int、float引用类型:自定义类和 Java 包装类(String、Integer)直接赋值:直接赋值是我们最常用的方式,在我们代码中的体现是Persona = new Person();

2020-08-14 10:38:58 293

原创 一次对AQS和ReetrantLock的源码理解和解析

AQS简介AQS在jdk1.8中全称为AbstractQueuedSynchronizer,中文翻译为同步器,是各种锁比如ReetrantLock、CountDownLatch、Semaphore的基础,AQS实现了锁、排队、锁队列这些框架但是对于tryAcquire、tryRelease、tryAcquireShared、tryReleaseShared、isHeldExclusively这些方法就需要子类比如之前的ReetrantLock等去实现。所以在了解ReetrantLock的底层原理之前,我们

2020-08-03 10:52:34 177

原创 单例模式的几种创建方法(synchorized、DoubleCheck、静态内部类等)

单例模式单例模式是创建型模式,它确保了一个类只能有一个对象被创建。在单例模式中,需要注意以下几点:构造方法必须为private,不能被其他类调用new方法成员变量为static的,这样子才能被static方法返回饿汉式饿汉式在类加载的时候就被初始化,免去检查是否为空的步骤,但是如果一直没有被调用的话,就会造成浪费。public class HungrySingleton { private static HungrySingleton hungrySingleton = new H

2020-07-29 20:06:36 470

原创 简述从2-3树到红黑树

因为CSDN的markdown不支持自动插入图片,所以这里引用我的github链接,大家可以进入该链接查看该图文博客(图片较多)简述从2-3树到红黑树

2020-07-29 12:55:58 170

原创 Mysql的事务并发问题和隔离级别

事务的四大特性ACID就是事务的四大特性,它们分别是原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)原子性:数据库中的每个事务都是不能再次分割的,要么一起操作成功,要么一起操作失败回滚,不能出现一个事务中一句执行成功了而另外一句没有执行成功的情况一致性:一致性是指数据库中的事务从一种状态变到另外一种状态,而数据库的完整性没有被破坏。比如A和B的总金额是2000元,无论A和B之间发生怎么样的交易,它们的总金额仍然是2000元隔离性

2020-07-28 12:27:07 396

原创 InnoDB和MyISAM的锁的区别和联系

InnoDB和MyISAM的锁InnoDB和MyISAM的行表锁InnoDB默认是行级锁,支持表锁,也就在InnoDB中更新某条数据会对行上锁,如果是排他锁,那么其他的事务访问这一行的数据需要等锁释放之后才能进行,而对其他行数据是没有影响的。MyISAM默认是表级锁,不支持行级锁,也就是在MyISAM中进行某条数据更新时,会对整个表上锁,所有的其他事务对表中对数据进行访问或者更新的时候都必须等那个事务释放表锁。需要注意的是,当InnoDB不走索引的时候,就会默认上表级锁了。InnoDB和MyISA

2020-07-27 20:46:11 430

原创 InnoDB的索引概念以及慢查询优化

聚簇索引之前的文章介绍了B+树的概念以及由来。聚簇索引就是按照每张表的主键创建一颗B+树,同时叶子节点中存放的是对应的主键的行数据,所以B+树中的数据也是聚簇索引的一部分,因为我们不能创建两个有相同数据的B+树(这样会很浪费硬盘空间)所以每张表只能拥有一个聚簇索引。在大多数情况下,查询优化器都会偏向于使用聚簇索引,因为使用聚簇索引访问到的叶子节点直接是我们需要的数据。非聚簇索引非聚簇索引是在聚簇索引之外建立的索引,它的叶子节点不存储对应行的数据,而是存储对应的主键,所以在使用非聚簇索引获取到主键值之

2020-07-27 19:14:59 152

原创 从二叉树到B+树简单分析为什么Mysql选择B+树作为索引

二叉树二叉树是一种特殊的树状结果,它每个节点都只有左孩子和右孩子,每个节点的左孩子都比它的值要小,而每个节点的右孩子都比它的值要大。所以当我们想要查找某个元素的时候,只需要按照它的左右孩子大小关系进行查找即可。比如在以下树中搜索4的时候:首先访问根节点,根节点为5,5>4,所以访问5的左孩子。访问3,3<4,所以访问3的右孩子访问4,我们就找到了我们需要找的值 5 / \ 3 8 / \ \ 1 4 10

2020-07-27 16:09:12 246

原创 ZooKeeper的api介绍和分布式锁实现思想

Api连接Zookeeper服务器Zookeeper(connnectString,sessiontimeout,watcher)connnectString:域名+端口,比如127.0.0.1:2173sessiontimeout:session超时时间watcher:监听事件操作apicreate(path,data,flags):创建一个给定路径的znode,并在znode保存data数据,falg为znode类型delete(path,version): 根据version匹配

2020-07-24 18:03:27 208

原创 Zookeeper的一些入门实践和知识

znode分类持久性的znode:创建之后即使发生Zookeeper集群宕机或者client宕机也不会丢失临时性的znode:client宕机或者client在指定的timeout内没有给Zookeeper集群发送信息就会消失znode也可以为顺序性,每一个顺序性的znode关联一个唯一的单调递增整数作为znode名字后缀持久顺序性znode临时顺序性znode使用zkCli实现一个简单的分布式锁启动两个zookeeper的zkCli第一个cli执行create -e /lock 表示

2020-07-24 13:50:05 208

原创 从HashMap到ConcurrentHashmap(jdk1.7到1.8)源码解析

HashMap jdk1.8源码解析HashMap 底层的数据结构是:数组 + 链表 + 红黑树。如下:其中当链表的长度大于等于 8 时,链表会转化成红黑树,当红黑树的大小小于等于 6 时,红黑树会转化成链表。HashMap的特性:static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }

2020-07-24 01:36:24 116

原创 简单工厂和工厂方法模式的代码实现和区别联系

简单工厂简单工厂的定义是:由一个工厂对象决定创建出哪一种产品类的实例。需要注意的是,简单工厂属于创建型,但是却不属于GOF23种设计模式它的适用场景是:工厂类负责创建的对象比较少应用层只知道传入工厂类的参数,对于如何创建对象并不关心所以简单工厂方法也有对应的优点和缺点:优点:它只需要传入一个正确的参数就能获取对应的对象,而不需要知道其创建的细节缺点:它的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背类开闭的原则简单工厂实现过程为了实现简单工厂,我们需要建立一个抽象类,然

2020-07-23 14:39:12 218

原创 观察者模式——设计模式实现以及源码解析

观察者模式概念观察者模式(Observer),又叫发布-订阅模式(Publish/Subscribe),定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。这种设计模式在很多的中间价中都有具体的实现,比如在Redis的主从服务器中,当从服务器完成了各种步骤进入与主服务器命令传播的步骤之后,每次主服务器接收到一次外部命令写入,都会把该命令广播给所有的从服务器。这种一对多的关系就是观察者模式,其中观察者是各个从服务器,被观察者是主服务器。下面我们就通过jav

2020-07-23 00:35:54 344

原创 JWT验证的原理,以及在项目中实现JWT的验证登陆

因为之前实现的网关项目中存在以下的逻辑:租户需要在平台进行登陆租户在登陆之后获取到token之后才能通过网关的验证中间件进入到转发代理逻辑中不选择session的原因在这种登陆场景下,我们可以使用session来处理,session的处理流程如下:租户发起登陆请求,把用户名和密钥发送给转发代理服务器,服务器利用后台数据库中的数据进行验证后台服务器验证成功之后,利用服务器自己设置的租户session前缀+用户名+登陆时间这几个参数生成一个session并把session设置为Set-Cook

2020-07-22 13:39:23 2675 1

原创 Redis中的AOF持久化——《Redis设计与实现》读书笔记

Redis的AOF持久化特点:通过保存Redis服务器所执行的写命令来记录数据库状态与RDF的区别是RDF保存数据库的键值对持久化实现(三个步骤)1.追加服务器执行完一个命令之后会将命令写入到缓冲区aof_buf末尾2.文件写入服务器每执行完一个事件都会判断是否需要将aof_buf的内容写入保存到AOF文件里不同的appendfsync参数:always:每次都将aof缓冲区内容写入到AOF文件everysec:距离上次AOF写入超过1秒就写入到AOF中no:永远不保存3.

2020-07-22 00:05:45 302

原创 Redis中的RDB持久化——《Redis设计与实现》读书笔记

RDB持久化图片源文件RDB持久化Xmind源文件读者可以查看我之前的一些笔记,包含有文字的描述Redis中的压缩列表ziplist——《Redis设计与实现》读书笔记Redis中的字典——《Redis设计与实现》读书笔记Redis中的对象——《Redis设计与实现》读书笔记...

2020-07-20 15:45:59 115

原创 谈一谈Redis中的跳表

在阅读《Redis设计与实现》的时候,发现它在阐述跳跃表的原理的时候是简略而过,出于对技术的深究性,我决定还是深入理解一下跳表的原理,并整理讲述给大家听Redis中的跳表在Redis的有序集合中,它的底层数据结构是跳表+字典,字典用于存储键与值的映射关系,可以在查找键对应的值的时候使时间复杂度降到o(1)。而跳表的数据结构是为了可以实现ZRANGE等范围查询功能,因为跳表在范围查询里面效率非常高,这是为什么呢,下面我们就将一一剖析跳表这一数据结构从单链表到跳表对于一个单链表来讲,即便链表中存储的数

2020-07-20 01:09:20 1046

原创 Redis中的对象——《Redis设计与实现》读书笔记

由于对象这部分内容的文字比较长,就不作文本阐述了直接上思维导图Redis对象思维导图PNG文件Redis对象思维导图Xmind文件读者可以查看我之前的一些笔记,包含有文字的描述Redis中的压缩列表ziplist——《Redis设计与实现》读书笔记Redis中的字典——《Redis设计与实现》读书笔记...

2020-07-19 22:22:02 128

原创 实现服务注册与发现(Zookeeper介绍、安装以及使用)

ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.

2020-07-17 12:15:18 1008

原创 WebSocket的原理和golang实现WebSocket服务器

最近一直在做网关的项目,收获了不少关于网络协议的相关知识点,我打算把这些知识点都串起来完成一个大的项目,其中WebSocket就是其中的一个知识点WebSocket知识点Websocket 是服务器推送技术的一种,最大的特点是服务器可以主动向客户端推送消息,客户端也可以主动向服务器发送消息。WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocke

2020-07-16 19:50:30 2501 1

原创 HTTPS、HTTP1.1与HTTP2的区别、概念和联系(使用golang实现HTTP2服务器)

HTTPS是HTTP的加密传输版本,HTTP2是加密传输协议,所以HTTPS和HTTP2没有本质的联系HTTPS因为http的利用明文进行传输的,所以存在不安全性,https使用SSL\TLS协议对http报文进行加密传输http的默认端口为80,而https的默认端口为443在讲解https加密传输之前我们还需要先解释公钥和私钥公钥和私钥在现代密码体制中加密和解密是采用不同的密钥(公开密钥),也就是非对称密钥密码系统,每个通信方均需要两个密钥,即公钥和私钥,这两把密钥可以互为加解密。公钥是公开

2020-07-16 14:02:32 2123

原创 谈一谈go中的限流方法以及time/rate限速器

在高并发系统中有三个常见的利器:缓存、限流、降级缓存:提升系统访问的速度和增大处理的容量降级:当服务器的压力剧增时,可以根据业务策略进行降级、以此释放服务资源保证业务正常限流:通过对并发降速以达到拒绝服务、排队或等待、降级等处理限流器,从字面上理解就是用来限制流量,有时候流量突增比如秒杀活动,会将后端服务压垮,甚至直接宕机,使用限流器能限制访问后端的流量,起到一个保护作用,被限制的流量,可以根据具体的业务逻辑去处理,直接返回错误或者返回默认值等等限流方法目前主流的限流方法有两个:漏桶限流:

2020-07-15 16:52:50 2271

原创 Redis中的压缩列表ziplist——《Redis设计与实现》读书笔记 (包括思维导图及xmind源文件)

简介:压缩列表ziplist是为了节约内存而开发的,由一系列特殊编码的连续内存块组成的顺序型数据结构一个压缩列表可以包含多个节点一个节点保存一个字节数组或者一个整数值组成部分zlbytes:整个压缩列表占用的字节数zltail:表尾距离起始地址有多少字节zlen:压缩列表包含的节点数量entry:保存数据的节点、节点长度由节点的内容决定zlend:标记位0xFF,标记压缩列表末端例子表示这个压缩列表占用0x50个字节、尾部节点在0x3c处、节点个数为3个只要用开始指针 p 加

2020-07-14 22:04:57 204

原创 在mac下配置golang环境下的swagger,实现api文档的自动生成

身为一位后端程序员,后端api文档的编写是必要的,我们可以使用swag的自动生成来实现api文档的自动生成环境配置我使用的环境是macos和golang要使用swaggo,首先要下载一个swag命令行。go get github.com/swaggo/swag/cmd/swag我们可以使用命令ll -r $GOPATH/bin或者直接进入目录查看我们的bin目录下多了一个swag命令文件我们还需要编辑mac的环境变量才能在命令行里面使用swag命令使用vim编辑器编辑macos的环境

2020-07-12 18:41:13 2548 1

原创 go实现反向代理的四种负载轮询方法(随机、顺序、加权、哈希一致性)

基础知识点在之前的博文我们实现了反向代理,但是缺乏对应的轮询方法(可以查看我之前的博文)在反向代理过程中我们需要知道以下的Header头X-Forwarded-ForX-Real-IP$remote_addrX-Forwarded-For:记录最后连接实际服务器之前的整个代理过程,可能会被伪造比如以下例子,注意X-Forwarded-For的变化如果我们在客户端处设置Header的X-Forwarded-For为99.99.99.99,那么就可以实现伪造X-Real-IP请求的

2020-07-11 00:44:14 1124

原创 go实现反向代理服务器(附浅拷贝和深拷贝知识点)

概念正向代理正向代理是一种客户端代理技术,帮助客户端访问无法访问的服务器资源,可以隐藏客户端的真实ip反向代理服务器端的代理技术,帮助服务器负载均衡、缓存、安全校验,可以隐藏服务器的真实ip正向代理实现实现原理:正向代理服务器接收到客户端到request请求,把request拷贝为自己的request发送给服务器,并把服务器返回的数据包装给客户端type Pxy struct {}func (p *Pxy) ServeHTTP(rw http.ResponseWriter,req

2020-07-11 00:39:17 864

原创 go语言简易构建Tcp客户端和服务器

TCP实现tcp服务器func main() { //监听相当于java的ServerSocket listener,err:=net.Listen("tcp","0.0.0.0:9090") if err !=nil{ fmt.Printf("listen fail,err : %v\n",err) return } for{ conn,err:= listener.Accept() if err!=nil{ fmt.Printf("accept fail,err

2020-07-09 22:56:19 428

原创 Redis中的字典——《Redis设计与实现》读书笔记

字典简介因为C语言没有内置字典结构,所以Redis自己构建了字典的实现。字典在Redis应用十分广泛,对数据库的增、删、改操作都是在字典的操作之上的,比如:SET msg “hello world”。字典还是哈希键的底层实现之一,当一个哈希键包含的键值比较多或者键值对中对元素都是比较长对字符串时,Redis会使用字典作为哈希键底层实现。组成字典在Redis中由 dict.h/dict 定...

2020-04-28 12:34:02 258

原创 自己写一个Linux的shell程序

Linux下的Shell程序设计我们需要设计一个shell程序,目前实现的功能有如下:获取当前操作系统的用户名、当前路径、以及操作权限展示为提示符输入一系列的内部指令并执行:cd、exit、help以及无效指令输入一系列的外部指令并执行:ps、ls执行当前路径文件等利用管道标识符“||”将标识符的命令输出的内容作为标识符后面的命令的输入内容利用 < 和 >进行输入输出的重...

2020-04-26 16:14:25 3410 1

原创 自己写一个文法分类器

文法定义本文法分类器的实现语言是Java,可以对4种文法进行分类首先我们先定义文法文件的存储格式:我们的文法文件都是在一个txt文件中存储,txt的默认格式如下:S,A,B,Ca,b,cS->ABC,A->a,B->b,C->cS在我们定义的G = (VT , VN , P , S)中第一行对应VT,也就是我们的非终结符第二行对应VN,也就是我们的终...

2020-04-24 17:33:35 1254 2

原创 Java实现socket服务端与客户端(附加服务端线程池实现,Jmeter压测,服务器日志)

服务端实现(多线程版本)首先我们先设计我们的服务器端,让它可以接收客户端的socket连接。首先我们先新创建一个ServerSocket 作为该服务器对应的socket,并且设置它的端口号为2000,创建完毕之后,在控制台输出“准备就绪”的信息,并且打印出ServerSocket 的地址和端口号ServerSocket serverSocket = new ServerSocket(2000...

2020-03-29 23:09:44 855

原创 五大排序动画与Java代码实现(附加快排三种优化)

五大排序动画与Java代码实现(附加快排三种优化)选择排序:冒泡排序:插入排序:归并排序:快速排序:快排优化选择排序:选择排序的重点是“选择”,即每次选择出最小(大)的元素。在我们设置的整数的范围为0——n,规模为n的数组情景下,我们需要遍历n-1次数组,每次从排好序的下一个元素(i+1)开始遍历到最后一个元素,从这些元素中选取出最小的元素,让这个最小的元素与(i+1)处的元素进行交换,那么0...

2020-03-29 00:28:49 315

空空如也

空空如也

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

TA关注的人

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