Java与Python对比
Java语言与Python对比语法和风格Java是一种静态类型语言,所有的变量都需要显示的提前声明,并且有严格的语法和规范;
Python是一种动态类型语言,所有的变量类型都是在运行的时候才确定的,语法更加简洁和灵活
性能Java作为一种编译型语言,性能比较高;而Python作为一种解释型语言,其性能会比较慢。这一点从我平时在leetcode上刷题就可以看出来,相同的实现方式,往往Java速度会更快一些。
并发和多线程的支持Java中提供了完善的并发和多线程的处理能力;而Python由于全局解释器锁的原因,多线程并不能真正实现并行执行,更适合用于I/O密集型任务。其在处理CPU密集型的任务的性能不如Java
应用领域Java往往应用于例如服务器端开发、大数据处理和安卓领域
Python更多的用于科学计算、人工智能领域以及一些简单的web开发
生态系统和库二者生态系统都挺完善的,Java有例如Spring一系列的框架,Python也有诸如Django、Flask、FastAPI、Numpy、pandas等框架;二者的社区都很活跃。
面向对象Java是单继承的,但是可以通过实现接口的方式弥 ...
Ubuntu20.04安装FloodLight最新版本
Ubuntu20.04安装FloodLight最新版本
网上的很多教程尝试了一下都不对,并且很多都是基于Ubuntu14的旧版本系统,其中的Python环境大多是基于2.0的,由于本人所使用的系统是Ubuntu20.04,后再油管澳大利亚某个学校的网络教学视频的帮助下成功安装,在这里写下安装教程,希望能对后面学习的同学有所帮助。
系统环境:Ubuntu20.04
Python版本:3.8
第一步:安装必要的依赖文件这里网上的教程会让下载python-dev,注意不要下会将系统中原有的Python3.0的版本给修改导致Mininet无法运行。
1sudo apt install build-essential python-dev openjdk-8-jdk maven ant
第二步:下载FloodLight1git clone https://github.com/floodlight/floodlight.git
第三步:安装web子模块安装web子模块
123cd floodlightsudo git submodule initsudo git submodule up ...
SpringBoot项目快速搭建
快速创建SpringBoot项目
打开IDEA在File->New->Project中新建项目
点击左侧的Spring Initializr
输入以下信息:
Name 项目名称
Group 根据公司域名来,或者默认com.example【倒序域名】
Package Name 包名,项目的代码会在这个包下
JDK版本
Java 与上面JDK版本对应
点击Next,选择SpringBoot版本,注意JDK17仅支持SpringBoot3的版本,不支持2.0版本,然后因为我们需要开发web项目,所以需要勾选Web下的Spring Web,之后点击Create
等待片刻,即可完成项目脚手架的创建。
项目结构如下:
我们主要关注的是:
pom.xml:这里面是关于项目中所使用到的依赖坐标
application.yml:关于项目中的一些配置信息,如数据库配置、Redis配置等
我们在springbootquickstart包下创建controller文件夹,并在其中创建一个HelloController对象
123456789101112package com.ex ...
Centos服务器安装MySQL
Centos服务器安装MySQL
利用闲置服务器安装MySQL,用于项目练手
Linux版本:Centos7.9
MySQL版本:8.0.36
一、下载MySQL从Oracle官网下载最新版本的MySQL
1wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36-1.el7.x86_64.rpm-bundle.tar
在 /usr/local/src目录下创建一个mysql目录,进入目录后将下载的mysql解压到mysql目录下
12mkdir /usr/local/src/mysqltar -xvf mysql-8.0.36-1.el7.x86_64.rpm-bundle.tar -C /usr/local/src/mysql/
二、安装1yum install -y perl.x86_64
在mysql目录下执行yum安装命令,等待跑完安装成功
1yum install -y mysql-community-*.rpm
显示Complete!即为安装成功
三、启动1systemctl start ...
Springboot学习笔记
Springboot学习笔记基础篇配置文件采用.yml格式的配置文件相较于.property格式的配置文件来说,层级关系更清晰
yml配置信息的书写与获取
三方技术配置信息
Mybatis
自定义配置信息
邮件的相关配置信息
使用注解进行值的获取
1@ConfigurationProperties(prefix = "email")
注意:
值的前面必须有空格作为分隔符
使用空格作为缩进表示层级关系,相同层级左侧对齐
配置信息的获取
1234// 获取值@Value("${键名}")// 前缀@ConfigurationProperties(prefix = "email")
Springboot整合mybatisBean注册
如果要注册的bean对象来自于第三方(不是自定义的),是无法使用@Component及其衍生注解声明bean的
@Bean
@Import
Bean扫描
Springboot默认扫描启动类所在包及其子包下的内容,如果要扫描其他文件夹,可以手动添加注解@ ...
三次握手与四次挥手
TCPTCP是一种面向连接的协议,可以保证传输的可靠性
TCP是一种全双工的协议
三次握手三次握手的流程
为什么是三次而不是两次首先客户端给服务器端发送请求之后,当服务器端收到请求就可以确保客户端的发送功能是正常的
然后服务器端给客户端响应(seq=y, ack=x+1),当客户端收到消息之后,就可以确保服务器端的发送和接收功能都是正常的
此时客户端再给服务器端发送一条响应,那么服务器端就可以确保客户端的接收功能也是正常的。
如果说只进行两次握手,客户端给服务器端发送Hello,服务器端给客户端回一个hi,可能存在一个问题,这个消息并没有被客户端所接收,连接可能会存在数据丢失导致不可靠的问题。
四次挥手TCP通过四次挥手来保证数据完整传输的
四次挥手需要确保双方后面都不会再发送数据的情况下再进行断开连接
过程:
客户端给服务器端发送一个带有FIN结束标识和seq=1的断开连接的请求包,主要目的是告诉客户端我这边不再发送数据包了,但是可以接收数据。
服务器端会给客户端发送一个ack包,表示自己已经知道客户端不会再向自己发送数据了
服务端给客户端发送一个断开连接的请求包,告知客户端自己这边 ...
Python内置模块collections解析
Python内置模块collections解析python的collections模块提供了非常多方便的操作,例如
Counter
defaultdict()
OrderDict()
deque
双端队列
namedtuple()
下面将逐个介绍每一个具体类的用法
Counter类该类可以快速的进行统计,例如给定一个字符串之后,可以统计每个字符出现的次数,当然只要是可迭代【可哈希】的数据都是可以传给Counter中的,例如list,tuple等
12345from collections import Counterstring = "abcdeasdasdkjyhaksjdhkashd"myhash = Counter(string)print(myhash)
该类中提供了几个方法可以使用
most_common()
可以将字典中的元素按照出现次数组成一个元素,再按照出现次数从大到小排列成一个列表
例如:[(‘a’, 5), (‘d’, 5), (‘s’, 4), (‘k’, 3), (‘h’, 3), (‘j’, 2), (‘b’, 1), ( ...
常见限流算法
常见限流算法限流算法主要是为了防止系统过载或者应对突发流量,是一种用于控制数据流速度的技术。主要包括下面四种方法:
固定窗口限流算法
滑动窗口限流算法
漏桶限流算法
令牌桶限流算法
滑动窗口限流算法有时候用户的一些无意义或者非法操作,例如频繁的发送短信、频繁的修改个人信息等操作就是无意义或者非法的,因此我们要针对这些操作进行限流。
限流的主要核心思路就是使用redis的zset结合滑动窗口限流算法,
针对这些行为,我设计了一个通用的接口,思路上是使用时间窗口限流算法,具体实现我使用zset进行的。
比如用户五分钟内只能发送三条验证码,于是就将用户发送短信的行为设计为redis的key,格式为:
场景:行为:用户唯一标识,zset的score分数值为时间戳,value值也是时间戳。
具体的流程为:
当用户每次发生这样的限流行为,我就会在Redis中进行记录,
在业务处理中,使用Redis的api进行查询,本质上就是调用了Redis的zcount命令去统计,传入开始score值和结束score值,我们以当前时间戳作为结束分值,然后使用当前时间去减去限流时间,例如五分钟,求出五分钟 ...
HashMap底层源码分析
HashMap底层源码分析HashMap主要是用来存放键值对的,它基于哈希表的Map接口实现,是常用的Java集合之一,是非线程安全的。
HashMap可以存放null的Key和value,但是null作为键只能有一个,作为value可以有多个
方法名称
说明
V put(K key, V value)
添加元素
V remove(Object key)
根据键删除键值对元素
void clear()
移除所有的键值对元素
boolean containsKey(Object key)
判断集合是否包含指定的键
boolean containsValue(Object value)
判断集合是否包含指定的值
boolean isEmpty()
判断集合是否为空
int size()
集合的长度,也就是集合中键值对的个数
HashMap结构HashMap内部方法图标为m表示method
HashMap内部类图标为c表示class
HashMap内部属性图标为f表示field
1static class Node<K,V> imp ...
MySQL索引
MySQL索引什么是索引?索引是一种特殊的数据结构,由数据表中的一列或者多列组成,可以用来快速查询数据库中的某一特定值的记录。
索引的类型有哪些?按照数据结构的维度进行划分:
BTree索引
哈希索引
RTree索引
全文索引
对文本的内容进行分词,进行索引。目前只有CHAR、VARCHAR、TEXT列上可以创建全文索引。一般不会使用,效率较低,通常使用搜索引擎如ElasticSearch代替。
按照应用的维度划分:
单列索引
联合索引
多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
主键索引
加速查询+列值唯一(不可以有NULL)
普通索引
仅加速查询
唯一索引
加速查询+列值唯一(可以有NULL)
覆盖索引
一个索引包含或者说覆盖所有需要查询的字段值
全文索引
联合索引:
使用表中的多个字段创建索引,就是联合索引,也叫组合索引或者复合索引。
以score和name两个字段建立联合索引。
1ALTER TABLE `cus_order` ADD INDEX id_score_name(score, name);
最左匹配原则 ...