Java进阶(一):HashMap
1.概念HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
HashMap实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。
HashMap是无序的,即不会记录插入的顺序。
HashMap继承于AbstractMap,实现了Map、Cloneable、 java.io.Serializable接口。
HashMap的key与value类型可以相同也可以不同,可以使字符串(String)类型的key和value,也可以是整型(Integer)类型的key和value。
HashMap位于java.util包中,使用前需要引用它,语法格式如下:
1import java.util.HashMap
以下实例我们创建一个HashMap对象map,整型(Integer)的key和字符串(String)类型的value.
1HashMap<Integer, String> map = new HashMap<>();
2.操作2.1 添加元素HashMap 类提供 ...
Java进阶(一):ArrayList
1.概念ArrayList类是一个可以动态修改的数组,与普通数组的区别就是它没有固定大小的限制,可以添加或删除元素。ArrayList继承了AbstractList接口,并实现了List接口。
ArrayList类位于java.util包中,使用前需要引用它,语法格式如下:
123import java.util.ArrayList; // 引入 ArrayList 类ArrayList<E> objectName =new ArrayList<>(); // 初始化
E : 泛型数据类型,用于设置objectName的数据类型,只能为引用数据类型。
objectName: 对象名。
常用的引用类型
ArrayList中的元素实际上是对象,<E>只能是引用数据类型,这时我们需要使用到基本类型的包装类。基本类型对应的包装类表如下:
基本类型
引用类型
boolean
Boolean
byte
Byte
short
Short
int
Int
long
Long
float
Float
double
Doub ...
秒杀场景常用解决方案
1.场景我们现在要卖100件下面这个婴儿纸尿裤,然后我们根据以往这样秒杀活动的数据经验来看,目测来抢这100件纸尿裤的人可能有10万人。这么大的请求量,直接打到数据库,数据库会崩溃掉。我们在开始之前应该先思考下会出现哪些问题:
高并发带来的数据错乱问题
超卖
恶意请求
链接暴露
数据库压力大
…
整体流程图:
2.考虑因素2.1 服务单一原则现在的设计都是微服务的设计思想,分布式的部署方式。
2.2 秒杀链接加盐我们上面说了链接要是提前暴露出去可能有人直接访问url就提前秒杀了,那又有小伙伴要说了我做个时间的校验就好了,但是知道链接的地址比起页面人工点击的还是有很大优势。我知道url,可以通过程序不断获取最新的北京时间,可以达到毫秒级别的,我就在00毫秒的时候请求,绝对比人工点的成功率大太多,而且可以一毫秒发送N次请求,搞不好你卖100个产品我全拿了。
2.2.1 如何避免把URL动态化,就连写代码的人都不知道,你就通过MD5之类的加密算法加密随机的字符串去做url,然后通过前端代码获取url后台校验才能通过。
2.3 Redis集群之前说过单机的Redis顶不住,秒杀是读多 ...
Go底层探索(三):切片
@注:以下内容来自《Go语言底层原理剖析》、《Go语言设计与实现》书中的摘要信息,本人使用版本(Go1.19)与书中不一致,源码路径可能会有出入。
1.介绍切片是Go语言中常用的数据类型之一,使用方式和数组一样,但是其长度不固定,我们可以向切片中追加元素,它会在容量不足时自动扩容。
1.1 声明在Go语言中,切片类型的声明方式和数组类似,不过由于切片的长度是动态的,所以声明时只需要指定切片中的元素类型。
12[]int[]interface{}
从切片的定义,我们可以推测出,切片在编译期间生成的类型只会包含切片中的元素类型,即int或interface{}等,cmd/compile/internal/types.NewSlice就是编译期间用于创建切片类型的函数。
12345678910111213141516171819202122func NewSlice(elem *Type) *Type { if t := elem.cache.slice; t != nil { if t.Elem() != elem ...
Go底层探索(二):字符串
1.介绍
@注:以下内容来自《Go语言底层原理剖析》书中的摘要信息,本人使用版本(Go1.19)与书中不一致,源码路径可能会有出入。
字符串在编程语言中无处不在,程序的源文件本就是由众多字符组成。在程序开发中的存储、传输、日志打印等环节,都离不开字符串的显示、表达和处理。因此,字符和字符串是编程中最基本的知识,不同的编程语言对于字符串的结构、处理有所差异。
1.1 字符串的长度在编程语言中,字符串是一种重要的数据结构,通常由一系列字符组成,字符串一般有两种类型:
一种是在编译时指定长度,不能修改
一种是具有动态的长度,可以修改
在Go中,字符串不能被修改,只能被访问。
错误示例
123var str = "hello world!"// 这里想把e改成o,不支持str[1] = 'o'
1.2 字符串的终止方式字符串的终止有两种方式:
一种是 C 语言中的隐式声明,以字符 "\0" 为终止符
一种是 Go 语言中的显式声明
2.结构&内存2.1 数据结构Go 语言运行时字符串 string 的结构如下:
1 ...
php扩展(四):jwt
介绍PHP 中编码和解码 JSON Web令牌(JWT)。elasticsearch 第三方提供的库如下(截止到2023.03.02):
包
文档
star数量
说明
firebase/php-jwt
https://github.com/firebase/php-jwt/blob/main/README.md
8.6k
firebase提供
安装安装此扩展包的首选方法是通过 composer,这里演示的版本为 6.3.0。
composer require firebase/php-jwt:6.3.0
查看源码
集成代码操作类封装文件位置:src/EncryptTools.php
1234567891011121314151617181920212223242526272829303132333435363738<?phpnamespace PhpTools;use PhpTools\Encrypt\PhpJWT;use stdClass;/** * @Description: 轻量级加解密 * @Class EncryptTools * @Packa ...
Go底层探索(一):编译器
1.什么是RPC
@注: 以下内容来自本人学习《Go语言底层原理剖析》书中的摘要信息。另外这本书中使用的Go是老版本,我使用的版本是Go1.19,有时候源码路径可能会不一样
编译器是一个大型且复杂的系统,一个好的编译器会很好地结合形式语言理论、算法、人工智能、系统设计、计算机体系结构及编程语言理论。
Go 语言的编译器遵循了主流编译器采用的经典策略及相似的处理流程和优化规则(例如经典的递归下降的语法解析、抽象语法树的构建)。另外,Go 语言编译器有一些特殊的设计,例如内存的逃逸等;
1.1 为什么要了解Go语言编译器?通过了解Go语言编译器,不仅可以了解大部分高级语言编译器的一般性流程与规则,也能指导我们写出更加优秀的程序。
1.2 三阶段编译器在经典的编译原理中,一般将编译器分为编译器前端、优化器和编译器后端。这种编译器被称为三阶段编译器(three-phase compiler)。
编译器前端: 专注于理解源程序、扫描解析源程序并进行精准的语义表达;
优化器(中间阶段): 编译器会使用多个 IR 阶段、多种数据结构表示代码,并在中间阶段对代码进行多次优化。例如:识别冗余代码、识 ...
Go扩展包(三十一):rocketmq
介绍本文将会介绍两种rocketmq扩展包,如下(截止到2022.10.04):
包
文档
Star 数量
说明
apache/rocketmq-client-go
https://github.com/apache/rocketmq-client-go
979
apache官方提供
aliyunmq/mq-http-go-sdk
https://github.com/aliyunmq/mq-http-go-sdk
50
aliyun.mq提供
下载12345// rocketmq-client-gogo get -u github.com/apache/rocketmq-client-go/v2@v2.1.0// 阿里云mq-http-go-sdkgo get -u github.com/aliyunmq/mq-http-go-sdk@v1.0.3
封装代码基于 rocketmq-client-go 的生产者封装文件位置:app/rocketmqpkg/produce.go
1234567891011121314151617181920212 ...
php扩展(三):阿里云RocketMQ
介绍PHP 连接阿里云 RocketMQ 需要通过SDK进行连接。aliyun.mq 官方提供的基于 HTTP协议 的SDK如下(截止到2022.09.30):
包
文档
star数量
说明
aliyunmq/mq-http-php-sdk
https://github.com/aliyunmq/mq-http-php-sdk/blob/master/README.md
69
aliyun.mq官方提供
安装安装此扩展包的首选方法是通过composer。
composer require aliyunmq/mq-http-sdk:1.0.3
配置查看源码
创建客户端:文件位置:src/Client/RocketmqClient.php
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950<?phpnamespace PhpTools\Client;use Exception;use MQ\MQClient;class Rock ...
RPC编程(六):gRPC中的截取器
介绍gRPC 中的截取器,类似中间件( middleware )的功能,可以做一些前置校验的工作,比如登陆验证、日志记录、异常捕获等。
流程梳理gRPC 中的 grpc.UnaryInterceptor 和 grpc.StreamInterceptor 分别对普通方法和流方法提供了截取器的支持。这里主要编写普通方法的截取器。
步骤一: 编写 proto 文件。
步骤二: 生成 Go 代码。
步骤三:编写服务端代码,并为 grpc.UnaryInterceptor 的参数实现一个函数。
步骤五:编写客户端代码。
步骤六: 运行测试。
编写 proto文件:go-advanced/grpc/4/proto/intercept.proto
123456789101112131415syntax = "proto3";option go_package = "server/interceptservice";message Param { string query = 1;}message Result { int3 ...
RPC编程(五):gRPC中的token认证
介绍gRPC 为每个 gRPC 方法调用提供了 token 认证支持,可以基于用户传入的 token 判断用户是否登录、以及权限…,实现 token认证的前提是,需要定义一个结构体,并实现 grpc.PerRPCCredentials 接口。
grpc.PerRPCCredentials123456type PerRPCCredentials interface { // 返回需要认证的必要信息 GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) // 是否使用安全链接(TLS) RequireTransportSecurity() bool}
步骤梳理
步骤一: 编写 proto 文件。
步骤二: 生成 go 代码。
步骤三: 实现 grpc.PerRPCCredentials 接口。
步骤四: 编写验证 token 方法。
步骤五: 实现被调用的方法 Test 。
步骤六: 编写服务端代码。
步骤七: 编写客户端代码。
步骤八 ...
RPC编程(四):protobuf语法学习
介绍ProtoBuf 是 Protocol Buffers 的简称,它是Google开发的一种数据描述语言,于2008年开源。 ProtoBuf 刚开源时的定位类似于 XML、JSON等数据描述语言,通过附带工具生成代码并实现将结构化数据序列化的功能。
在序列化结构化数据的机制中, ProtoBuf 是灵活、高效、自动化的,相对常见的 XML、JSON ,描述同样的信息, ProtoBuf 序列化后数据量更小、序列化/反序列化速度更快、更简单。
XML、JSON、ProtoBuf对比
json : 一般的 web 项目中,最流行的主要还是 json 。因为浏览器对于 json 数据支持非常好,有很多内建的函数支持。
xml : 在 webservice 中应用最为广泛,但是相比于 json ,它的数据更加冗余,因为需要成对的闭合标签。 json 使用了键值对的方式,不仅压缩了一定的数据空间,同时也具有可读性。
protobuf : 是后起之秀,是谷歌开源的一种数据格式,适合高性能,对响应速度有要求的数据传输场景。因为 profobuf 是二进制数据格式,需要编码和解码。数据本 ...
RPC编程(三):gRPC快速入门
什么是gRPCgRPC 是一个高性能、开源、通用的 RPC 框架,由 Google 推出,基于 HTTP2协议标准设计开发,默认采用 Protocol Buffers 数据序列化协议,支持多种开发语言。 gRPC提供了一种简单的方法来精确地定义服务,并且为客户端和服务端自动生成可靠的功能库。
gRPC技术栈最底层为 TCP 或 Unix 套接字协议,在此之上是 HTTP/2 协议的实现,然后在 HTTP/2 协议之上又构建了针对 Go 语言的 gRPC 核心库( gRPC 内核+解释器)。应用程序通过 gRPC插件生成的 Stub 代码和 gRPC 核心库通信,也可以直接和 gRPC 核心库通信。
前置准备安装 protoc
下面示例是在 mac环境 中安装。
12345# 安装➜ ~ brew install protobuf# 安装后查看版本➜ ~ protoc --versionlibprotoc 3.17.3
安装插件
安装插件的目的是为了将 protobuf 文件,生成 Go 代码
12➜ ~ go install google.golang.org/protob ...
Yii2集成(二):yar
介绍Yar 是一个 RPC 框架,它提供了一种简单易用的方式来在 PHP 应用程序之间进行通信,同时它还提供了对远程服务进行多个调用的能力。
特征
快速、简单
并发 RPC 调用
支持多种数据打包器(php、json、msgpack 内置)
支持多种传输协议(http、https、TCP)
详细的调试信息
扩展地址如以下,截止到(2022.09.10):
包
文档
Star 数量
说明
laruence/yar
https://github.com/laruence/yar/blob/master/README.md
1.4k
鸟哥提供
安装安装yarYar 是一个 PECL 扩展,可以简单地通过以下方式安装:pecl install yar
在 Linux 中编译 Yar123$ /path/to/phpize$ ./configure --with-php-config=/path/to/php-config/$ make && make install
可用的配置说明
123--with-curl=DIR--enable(disabl ...
php扩展(二):elasticsearch
介绍PHP 原生代码连接 elasticsearch 需要通过客户端进行连接。elasticsearch 官方提供的客户端如下(截止到2022.09.12):
包
文档
star数量
说明
elastic/elasticsearch-php
https://github.com/elastic/elasticsearch-php/blob/master/README.md
5k+
elasticsearch官方提供
安装安装此扩展包的首选方法是通过composer,并保证客户端版本和服务器端版本一致。这里服务器端的 elasticsearch 版本为 7.13.3。
composer require elasticsearch/elasticsearch:"v7.17.0"
配置查看源码
ClientBuilder 安装后,使用该类连接到 Elasticsearch 。本地的 Elasticsearch 正在运行, IP和端口为:127.0.0.1:9200。可以使用以下代码创建客户端:
文件位置:src/Client/ElasticCli ...