自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 网络爬虫技术概述

1、爬虫概述1.1、什么是爬虫网络爬虫,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。通俗的讲,就是一种能够自动获取网页内容并可以按照指定规则提取相应内容的程序。1.2、爬虫原理那么网络爬虫是从哪抓取,又是按照怎么样的规则呢?首先,我们需要了解URL。URL在日常网络中无处不在,www.baidu.com, www.taobao.com,简单来说,网络地址就是URL。网络爬虫就是从URL进行爬取。即爬虫的内容就是具体地址下的内容,如淘宝下的销售信息。那么,是如何通过URL进行爬取

2021-09-03 23:10:23 7604

原创 Go-数组原理

1.概述数组是Go语言中的基本类型之一,通常可以用以下方式来表示一个数组。Go语言的数组与Java一样,在初始化的时候就需要指定数组的大小,并且确认之后就无法修改。编译期间通过NewArray函数初始化,两个参数elem和bound分别表示元素类型以及数组的大小。2.初始化Go语言有两种不同的初始化方式,分别是显式的指定数组大小,另外一种是[…]声明数组,数组大小显式指定在类型检查阶段数组大小就会被提取出来,然后通过newArray方法创建数组。而[…]方式编译器会在cmd/compile/i

2021-08-06 11:11:25 242

原创 Go-切片

结构切片的定义与数组十分相似,不过切片的长度与容量都是动态的,下面是切面的数据结构:其中Data是指向数组的指针,Len为长度,Cap为容量。初始化切片有3种初始化的方式:通过下标的方式获得数组或者切片的一部分:arr[0:3] or slice[0:3]使用这种方式创建编译器会将arr[0:3] or slice[0:3]等语句转换成下列的操作创建新切片的时候会有4个参数,分别是元素类型,数组的指针,切片大小和容量。这也和上面提到的结构是一致的。另外,可以发现,使用下标创建的切片并不是拷贝原

2021-08-06 11:10:39 168

原创 Go-哈希表

设计原理哈希表是计算机科学中最重要的数据结构之一,在Java,python,Go等语言中都是哈希表的实现,这主要是由于他提供了键值之间映射,从而读写性能达到了O(1),十分优秀。哈希函数实现哈希表的关键点在于哈希函数的选择,好的哈希函数能够大大减少哈希冲突,提升读写效率。常见的哈希函数有MD5,SHA等。完美的哈希函数是将每一个键散列到不同的位置,但是实际使用中是几乎不可能的,因此哈希表还需要解决哈希冲突的问题。哈希冲突解决哈希冲突有两种常用的方法,一是开放地址法:当发生哈希冲突时,就会将键值对写

2021-08-06 11:10:08 499

原创 Redis-缓存一致性,缓存穿透,缓存击穿,缓存雪崩

缓存问题一致性在使用缓存的过程中往往会由于不正确的使用方式,导致缓存和后端数据库数据不一致。但是并不是一定需要强一致性,需要根据业务场景来判断,缓存共有多种使用模式,常用三种 Cache Aside Pattern, Cache Through Pattern 和 Cache Back Pattern(具体介绍可以参考这篇文章Things You Should Know About Database Caching)。在缓存+数据库的架构中,缓存和数据库的操作总

2021-08-06 11:08:17 153

原创 Go-协程原理

Go 语言在并发编程方面有强大的能力,谈到 Go 语言调度器,绕不开的是操作系统、进程与线程这些概念,线程是操作系统调度时的最基本单元,而 Linux 在调度器并不区分进程和线程的调度,它们在不同操作系统上也有不同的实现,但是在大多数的实现中线程都属于进程。多个线程可以属于同一个进程并共享内存空间。因为多线程不需要创建新的虚拟内存空间,所以它们也不需要内存管理单元处理上下文的切换,线程之间的通信也正是基于共享的内存进行的,与重量级的进程相比,线程显得比较轻量。虽然线程比较轻量,但是在调度时也有比较大的额外

2021-08-06 11:07:20 519

原创 Go-Mutex锁机制

MutexGo 语言的sync.Mutex由两个字段state和sema组成。其中state表示当前互斥锁的状态,而sema是用于控制锁状态的信号量。type Mutex struct {state int32sema uint32}状态state的最低三位表示当前锁的状态,默认情况下都是0mutexLocked:表示是否上锁mutexWoken:表示有协程被唤醒了mutexStarving:表示当前锁是否处于饥饿状态剩下的位表示了排队规模,即正在等待队列中的协程数量正常模式和饥饿

2021-08-06 11:06:36 199

原创 Go内存对齐

什么是内存对齐?现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问, 这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是内存对齐。为什么要内存对齐1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。2.性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在

2021-08-06 11:05:43 89

原创 内存分配器

前言           内存空间包含两个重要区域:栈区(Stack)和堆区(Heap)。函数调用的参数、返回值以及局部变量大都会被分配到栈上,这部分内存会由编译器进行管理;不同编程语言使用不同的方法管理堆区的内存,C++ 等编程语言会由工程师主动申请和释放内存,Go 以及 Java 等编程语言会由工程师和编译器共同管理,堆中的对象由内存分配器分配并由垃圾收集器回收。因此这里主要讨论堆中的内存。设计原理    内

2021-08-06 11:04:55 219

原创 Go进阶-协程GMP模型

Go 语言在并发编程方面有强大的能力,谈到 Go 语言调度器,绕不开的是操作系统、进程与线程这些概念,线程是操作系统调度时的最基本单元,而 Linux 在调度器并不区分进程和线程的调度,它们在不同操作系统上也有不同的实现,但是在大多数的实现中线程都属于进程。多个线程可以属于同一个进程并共享内存空间。因为多线程不需要创建新的虚拟内存空间,所以它们也不需要内存管理单元处理上下文的切换,线程之间的通信也正是基于共享的内存进行的,与重量级的进程相比,线程显得比较轻量。虽然线程比较轻量,但是在调度时也有比较大的额外

2021-06-18 16:09:18 294

原创 Go基础-协程

一个进程在启动的时候,会创建一个主线程,这个主线程结束的时候,程序进程也就终止了,所以一个进程至少有一个线程,这也是我们在main函数里,使用goroutine的时候,要让主线程等待的原因,因为主线程结束了,程序就终止了,那么就有可能会看不到goroutine的输出。go语言中并发指的是让某个函数独立于其他函数运行的能力,一个goroutine就是一个独立的工作单元,Go的runtime(运行时)会在逻辑处理器上调度这些goroutine来运行,一个逻辑处理器绑定一个操作系统线程,所以说goroutine

2021-06-18 14:39:47 135

原创 List.get().add()报错 UnsupportedOperationException

1.问题描述今天在做算法的时候用到了list.add()方法,结果报了UnsupportedOperationException 错误List<List<String>> res = new ArrayList<>();//中间代码省略res.get(key).add(str);2.分析去网上查了之后基本上都是由于使用了Arrays.asList()方法导致的报错,而我并没有使用这个方法。经过调试之后发现,问题出在get方法返回的list。由于我传入的对象是

2020-09-23 14:54:38 655

空空如也

空空如也

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

TA关注的人

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