本文将为您提供关于nova后端命令汇总的详细介绍,我们还将为您解释一的相关知识,同时,我们还将为您提供关于2019Java面试汇总(一)、2021年最新PHP面试、笔试题汇总(一)、AndroidSt
本文将为您提供关于nova 后端命令汇总的详细介绍,我们还将为您解释一的相关知识,同时,我们还将为您提供关于2019Java面试汇总(一)、2021 年最新 PHP 面试、笔试题汇总(一)、Android Studio 错误信息汇总(一)、ansible常用模块知识汇总(一)的实用信息。
本文目录一览:- nova 后端命令汇总(一)(nova常用命令)
- 2019Java面试汇总(一)
- 2021 年最新 PHP 面试、笔试题汇总(一)
- Android Studio 错误信息汇总(一)
- ansible常用模块知识汇总(一)
nova 后端命令汇总(一)(nova常用命令)
首先我们来看 nova CLI 的使用方式,通过 nova help 命令,可以得到如下信息:
usage: nova [--version] [--debug] [--os-cache] [--timings] [--os-region-name <region-name>] [--service-type <service-type>] [--service-name <service-name>] [--os-endpoint-type <endpoint-type>] [--os-compute-api-version <compute-api-ver>] [--endpoint-override <bypass-url>] [--profile HMAC_KEY] [--insecure] [--os-cacert <ca-certificate>] [--os-cert <certificate>] [--os-key <key>] [--timeout <seconds>] [--os-auth-type <name>] [--os-auth-url OS_AUTH_URL] [--os-domain-id OS_DOMAIN_ID] [--os-domain-name OS_DOMAIN_NAME] [--os-project-id OS_PROJECT_ID] [--os-project-name OS_PROJECT_NAME] [--os-project-domain-id OS_PROJECT_DOMAIN_ID] [--os-project-domain-name OS_PROJECT_DOMAIN_NAME] [--os-trust-id OS_TRUST_ID] [--os-default-domain-id OS_DEFAULT_DOMAIN_ID] [--os-default-domain-name OS_DEFAULT_DOMAIN_NAME] [--os-user-id OS_USER_ID] [--os-username OS_USERNAME] [--os-user-domain-id OS_USER_DOMAIN_ID] [--os-user-domain-name OS_USER_DOMAIN_NAME] [--os-password OS_PASSWORD] <subcommand> ...
其中前面的部分是需要加载的一些环境变量,包括租户名称、用户 ID、密码等,为了对其进行相应的权限验证和审核功能,其中 CLI 命令的主要包括以下内容,这里是 nova 7.1.0 版本:
add-fixed-ip
给虚拟机添加一个 ip 地址。
add-secgroup
给虚拟机添加一个安全组规则。
agent-create
创建一个新的 agent。
agent-delete
删除一个已经存在的 agent。
agent-list
列举所有的 agent 信息。
agent-modify
修改已经存在的 agent 信息。
aggregate-add-host
向指定的主机集合里添加计算节点。
aggregate-create
创建一个新的主机集合。
aggregate-delete
删除指定主机集合。
aggregate-list
列举所有主机集合的信息。
aggregate-remove-host
将计算节点从指定主机集合中删除。
aggregate-set-metadata
更新制定主机集合的元数据信息,主要指 az 信息。
aggregate-show
显示一个主机集合的详细信息。
aggregate-update
更新一个主机集合的名称或者其可用域信息。
availability-zone-list
列举所有的可用域信息。
backup
通过创建一个 backup 类型的快照来备份虚拟机。
boot
启动虚拟机命令。
cell-capacities
得到一个指定 cell 的容量或者得到所有 cell 的容量。
cell-show
显示一个指定 cell 的详细信息。
clear-password
从元数据中清除 admin 密码,然而并不会修改虚拟机密码。
cloudpipe-configure
更新 cloudpipe instance VPN IP/port 。
cloudpipe-create
基于指定的项目创建一个 cloudpipe instance。
cloudpipe-list
列举所有的 cloudpipe instances。
console-log
获得一台虚拟机的操作台日志。
delete
直接关闭并删除一个或者多个虚拟机。
diagnostics
获取虚拟机 CPU、内存等的使用情况。
dns-create
根据 domain、名字和 IP 创建一个 DNS。
dns-create-private-domain
创建一个指定的私有的 DNS domain。
dns-create-public-domain
创建一个指定的公有的 DNS domain。
dns-delete
删除一个指定的 DNS。
dns-delete-domain
删除一个指定的 DNS domain。
dns-domains
列举出可用的 DNS domains。
dns-list
列举 dns 信息。
evacuate
从坏的计算节点上修复虚拟机。
fixed-ip-get
获得 ip 的信息。
fixed-ip-reserve
预留 Ip。
fixed-ip-unreserve
撤销预留 IP。
flavor-access-add
给指定的租户增加套餐允许。
flavor-access-list
针对指定的套餐查看允许信息。
flavor-access-remove
针对指定的租户删除套餐允许。
flavor-create
创建套餐。
flavor-delete
删除一个指定的套餐。
flavor-key
为套餐设置或者取消 extra_spec。
flavor-list
列举出所有可用的套餐。
flavor-show
显示指定套餐的信息。
floating-ip-associate
给虚拟机分配一个浮动 IP。
floating-ip-bulk-create
创建 floating IP 段 (限定 nova-network)。
floating-ip-bulk-delete
删除 floating IP 段 (限定 nova-network)。
floating-ip-bulk-list
列举 floating IP 段 (限定 nova-network)。
floating-ip-create
为当前租户分配一个浮动 IP。
floating-ip-delete
删除浮动 IP。
floating-ip-disassociate
解绑浮动 IP。
floating-ip-list
列举浮动 IP。
floating-ip-pool-list
列举浮动 IP 池。
force-delete
强制删除虚拟机。
get-mks-console
获得虚拟机 MKS 控制台。
get-password
获取虚拟机的 admin 密码, 此操作调用元数据服务来请求元数据信息,并不是从虚拟机里读取其密码信息。
get-rdp-console
获得虚拟机 rdp 控制台。
get-serial-console
获得虚拟机 serial 控制台。
get-spice-console
获得虚拟机 spice 控制台。
get-vnc-console
获取虚拟机 vnc 控制台。
host-action
开启、关闭或者重启计算节点。
host-describe
显示计算节点的描述信息。
host-evacuate
从坏的计算节点上修复所有虚拟机。
host-evacuate-live
将指定计算节点上的所有虚拟机热迁移到其他可用的计算节点上。
host-list
列举所有节点以及服务。
host-meta
设置或者删除一台计算节点上所有虚拟机的元数据。
host-servers-migrate
将指定计算节点上的所有虚拟机冷迁移到其他可用的计算节点上。
host-update
更新节点的状态信息。
hypervisor-list
列举出所有计算节点的信息。
hypervisor-servers
列举出一个计算节点下的所有虚拟机。
hypervisor-show
显示一台计算节点的详细信息。
hypervisor-stats
获取所有计算节点的统计信息。
hypervisor-uptime
获取计算节点的更新时间。
image-create
通过虚拟机快照创建一个镜像。
image-delete
删除镜像。
image-list
获取镜像列表。
image-meta
设置或者删除镜像的元数据信息。
image-show
显示镜像的详细信息。
instance-action
显示虚拟机操作。
instance-action-list
显示虚拟机操作列表。
interface-attach
给虚拟机挂载一块网卡。
interface-detach
从虚拟机上卸载一块网卡。
interface-list
获取虚拟机上所有挂载的网卡。
keypair-add
创建密钥对。
keypair-delete
根据名字删除密钥对。
keypair-list
针对一个用户列举其密钥对。
keypair-show
显示密钥对的详细信息。
limits
显示账户最多能够容纳虚拟机、内存以及文件等的大小。
list
列举所有虚拟机。
list-extensions
列举所有可用的扩展服务。
list-secgroup
列举所有的安全组。
live-migration
热迁移。
live-migration-abort
终止热迁移动作。
live-migration-force-complete
加速热迁移完成。
lock
锁定虚拟机,非 admin 用户无法解锁被锁定的虚拟机。
meta
设置或者删除虚拟机的元数据。
migrate
冷迁移。
migration-list
获取迁移列表。
network-associate-host
给 host 分配网络。
network-associate-project
给租户分配网络。
network-create
创建一个网络。
network-delete
通过标签或者 ID 删除网络。
network-disassociate
回收网络。
network-list
获取网络列表。
network-show
显示指定网络。
pause
暂停虚拟机。
quota-class-show
显示配额类的配额。
quota-class-update
更新配额类的配额。
quota-defaults
针对租户默认配额。
quota-delete
删除配额,将恢复默认配额。
quota-show
显示用户或者租户的配额情况。
quota-update
更新用户或者租户的配额情况。
reboot
重启虚拟机。
rebuild
关闭、重传镜像并重启虚拟机。
refresh-network
更新虚拟机网络信息。
remove-fixed-ip
从虚拟机上移除固定 IP。
remove-secgroup
从虚拟机上移除安全组规则。
rescue
重启虚拟机进入修复模式,从初始镜像或者指定镜像启动,挂载的当前的启动盘作为第二块盘。
reset-network
重置虚拟机网络。
reset-state
重置虚拟机状态。
resize
调整配置。
resize-confirm
确认调整配置。
resize-revert
取消调整配置,恢复到之前的状态。
restore
重载一个软删除的虚拟机。
resume
恢复虚拟机。
scrub
删除绑定在一个租户下的网络和安全组
secgroup-add-default-rule
为新的租户增加默认的安全组规则(限定于 nova-network)。
secgroup-add-group-rule
为安全组增加新的组规则。
secgroup-add-rule
安全组增加一条新的规则。
secgroup-create
创建一个新的安全组。
secgroup-delete
删除一个安全组。
secgroup-delete-default-rule
删除默认的安全组规则(限定于 nova-network)。
secgroup-delete-group-rule
为安全组删除组规则。
secgroup-delete-rule
安全组删除一条规则。
secgroup-list
安全组列表。
secgroup-list-default-rules
列举默认安全组规则。
secgroup-list-rules
列举安全组规则。
secgroup-update
更新安全组规则。
server-group-create
创建 server_group。
server-group-delete
删除 server_group。
server-group-get
获得 server_group。
server-group-list
获取 server_group 信息。
server-migration-list
获取指定虚拟机的迁移列表。
server-migration-show
获取一台虚拟机的迁移情况。
server-tag-add
获取虚拟机的 tag。
server-tag-delete
删除虚拟机的 tag。
server-tag-delete-all
删除虚拟机的所有 tag。
server-tag-list
获取虚拟机的 tag 列表。
server-tag-set
设置虚拟机的 tag 信息。
service-delete
删除服务。
service-disable
Disable 服务。
service-enable
Enable 服务。
service-force-down
强制使服务 down。
service-list
获取所有的服务,并通过 host & binary 过滤。
set-password
设置虚拟机的 admin 密码。
shelve
shelve 虚拟机。
shelve-offload
从计算节点移除 shelve 的虚拟机。
show
显示指定虚拟机的详细信息。
ssh
ssh 到虚拟机。
start
开启虚拟机。
stop
停止虚拟机。
suspend
挂起虚拟机
trigger-crash-dump
触发 crash dump。
解锁虚拟机。
unpause
取消暂停。
unrescue
重启虚拟机从正常状态。
unshelve
unshelve 虚拟机。
update
更新虚拟机的名字或者描述部分。
usage
为指定的租户显示器资源使用情况。
usage-list
列举所有租户的使用情况。
version-list
列举所有 API 的版本信息。
virtual-interface-list
显示一台虚拟机上的所有网卡信息。
volume-attach
给一台虚拟机挂载云硬盘。
volume-attachments
列举虚拟机上挂载的所有云硬盘。
volume-detach
从虚拟机上卸载云硬盘。
volume-update
更新云硬盘的挂载信息。
x509-create-cert
为用户创建一个 X59 证书。
x509-get-root-cert
获得 X509 根证书。
bash-completion
打印出所有命令的可选项。
help
显示帮助信息。
baremetal-interface-list
显示绑定到指定裸机节点的网卡。
baremetal-node-list
显示所有裸机节点的列表。
baremetal-node-show
显示指定裸机节点的信息。
net
使用 tenant-network-show 代替。
net-create
使用 tenant-network-create 代替。
net-delete
使用 tenant-network-delete 代替。
net-list
使用 tenant-network-list 代替。
tenant-network-create
创建租户网络。
tenant-network-delete
删除租户网络。
tenant-network-list
显示租户下的网络列表。
tenant-network-show
显示一个租户下的网络情况。
今天就讲到这里,下次将会从功能方面对这些命令进行划分,然后讲解常见命令的具体使用方法。敬请期待。
2019Java面试汇总(一)
- String,StringBuffer,StringBuilder的区别是什么?String为什么是不可变的?
可变性
String类中使用的是final关键字修饰字符数组保存字符串,private final char value[],所以String对象是不可变的。
StringBuffer和StringBuilder都继承AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组来保存字符串 char[] value,但是没有用final关键字修饰,所以两种对象是可变的。
线程安全性
String中的对象是不可变的,因此也可以理解成线程安全的。
AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
(引申一道题:i++是线程安全的吗?=============>线程不安全)
性能
每次对String类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String对象,这个过程中会重新开辟内存空间,对内存空间极大的浪费。
StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
因此:由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
总结
1.少量数据:适用String
2.单线程操作字符串缓冲区下操作大量数据: 适用StringBuilder
3.多线程操作字符串缓冲区下操作大量数据: 适用StringBuffer
- 构建器Constructor是否可被override?
java中,父类的私有属性和构造方法都不能被继承,所以Constructor也就不能被重写,但是可以重载,所有可以看到一个类中有多个构建函数的情况。
- 重写和重载的区别
重写:重写是子类对父类的允许访问的方法的实现过程进行重新编写,发生在子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。另外,如果父类方法访问修饰符为 private 则子类就不能重写该方法。也就是说方法提供的行为改变,而方法的外貌并没有改变。
重载:同一个类中,方法名相同,参数类型不同,个数不同,顺序不同,方法返回值和访问修饰符不同。eg:构建函数。
- Java面向对象的三大特性(继承,封装,多态)
封装:封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,(get,set)。
继承:继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码。
多态:多态指的是同一个方法调用,由于对象不同可能会有不同的行为。
- 自动装箱与拆箱(JDK1.5引入)
装箱:将基本类型用它们对应的引用类型包装起来;
拆箱:将包装类型转换为基本数据类型;
基本类型与引用类型:
基础数据类型:它们存储的都是数据量比较小的数据,只需要1个或者少量几个字节就可以了,因此,这些数据类型的变量的二进制就直接保存着他们的值。
引用数据类型:它主要用来指向某个对象,对象保存的数据一般都比较大。
基本数据类型 引用数据类型
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
- 静态方法内调用一个非静态成员为什么是非法的?
普通的方法调用都是通过”对象名.方法名“来调用,即需要一个对象,然而静态方法可以不通过对象进行调用,因此不能调用其他非静态变量,也不能访问非静态变量的成员。
- 对象的相等与指向他们的引用相等,两者有什么不同?
对象的相等,比的是内存中存放的内容是否相等。而引用相等,比较的是他们指向的内存地址是否相等。
- == 与 equals的区别
== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型=比较的是值,引用数据类型=比较的是内存地址)。
equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。
public class test1 {
public static void main(String[] args) {
String a = new String("ab"); // a 为一个引用
String b = new String("ab"); // b为另一个引用,对象的内容一样
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 从常量池中查找
if (aa == bb) // true
System.out.println("aa==bb");
if (a == b) // false,非同一对象
System.out.println("a==b");
if (a.equals(b)) // true
System.out.println("true");
if (37 == 37.0) { // true
System.out.println("true");
}
}
}
String 中的 equals 方法是被重写过的,因为 object 的 equals 方法是比较的对象的内存地址,而 String 的 equals 方法比较的是对象的值。
当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象。
- hashCode 与 equals
面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?”
hashCode()介绍
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。
散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)
为什么要有 hashCode
我们先以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode: 当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自我的Java启蒙书《Head first java》第二版)。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。
通过我们可以看出:hashCode() 的作用就是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode()在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。
hashCode()与equals()的相关规定
如果两个对象相等,则hashcode一定也是相同的
两个对象相等,对两个对象分别调用equals方法都返回true
两个对象有相同的hashcode值,它们也不一定是相等的
因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖
hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)
10.线程,进程,程序的基本概念及关系
线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。
程序是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。
进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。
参考:https://github.com/Snailclimb...
2021 年最新 PHP 面试、笔试题汇总(一)
读在前面:
面向对象编程和面向对象设计的五个基本原则「SOLID」
单一职责原则(Single Responsibility Principle)
开放封闭原则(Open Closed Principle)
里氏替换原则(Liskov Substitution Principle)
接口隔离原则(Interface Segregation Principle)
依赖反转原则(Dependency Inversion Principle)
1. 单一职责原则规定一个类有且仅有一个理由使其改变。换句话说,一个类的边界和职责应当是十分狭窄且集中的。我很喜欢的一句话 "在类的职责问题上,无知是福"。一个类应当做它该做的事,并且不应当被它的任何依赖的变化所影响。
2. 开放封闭原则,又称开闭原则,规定代码对扩展是开放的,对修改是封闭的。
3. 里氏替换原则规定对象可以被其子类的实例所替换,并且不会影响到程序的正确性。
4. 接口隔离原则规定,不应该强制接口的实现依赖于它不使用的方法。
5. 依赖反转原则,它规定高层次的代码不应该依赖低层级的代码。换句话说,高层次的代码应该依赖抽象接口,抽象接口就像是「中间人」一样,负责连接着高层次和低层次代码。这个原则的另一层意思是,抽象接口不应该依赖具体实现,但具体实现应该依赖抽象接口
一、秒杀(商品超卖,高并发,同一用户多次抢购)
后端:redis + 队列
redis 队列实现,三个队列(库存队列,排队队列,抢购结果队列)
用户先进入排队队列,先进先出,判断是否已经在抢购结果队列,如果在,则直接下一个,如果不在,将用户信息加入抢购结果队列,库存 - 1,等待数据库空闲时,将抢购结果写入数据库
前端:
面对高并发的抢购活动,前端常用的三板斧是【扩容】【静态化】【限流】
扩容:加机器,这是最简单的方法,通过增加前端池的整体承载量来抗峰值。
静态化:将活动页面上的所有可以静态的元素全部静态化,并尽量减少动态元素。通过 CDN 来抗峰值。
限流:一般都会采用 IP 级别的限流,即针对某一个 IP,限制单位时间内发起请求数量。或者活动入口的时候增加游戏或者问题环节进行消峰操作。
有损服务:在接近前端池承载能力的水位上限的时候,随机拒绝部分请求来保护活动整体的可用性。
二、订单模块(同一订单,多家商户结算问题)
订单拆分:用户支付后,将订单拆分,生成子订单
三、用户下单
先判断有没有登录
点击下单,生成唯一订单号,状态为未支付
四、接口安全
使用 HTTP 的 POST 方式,对固定参数 + 附加参数进行数字签名,使用的是 md5 加密,比如:我想通过标题获取一个信息,在客户端使用 信息标题 + 日期 + 双方约定好的一个 key 通过 md5 加密生成一个签名 (sign), 然后作为参数传递到服务器端,服务器端使用同样的方法进行校验,如何接受过来的 sign 和我们通过算法算的值相同,证明是一个正常的接口请求,我们才会返回相应的接口数据。
五、如何处理负载、高并发
1、HTML 静态化
其实大家都知道,效率最高、消耗最小的就是纯静态化的 html 页面,所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。
2、图片服务器分离
把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如七牛云
3、数据库集群和库表散列及缓存
数据库的并发连接为 100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如 memcache、redis。
4、镜像:
尽量减少下载,可以把不同的请求分发到多个镜像端。
5、负载均衡:
Apache 的最大并发连接为 1500,只能增加服务器,可以从硬件上着手,如 F5 服务器。当然硬件的成本比较高,我们往往从软件方面着手。
负载均衡 (Load Balancing) 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力,同时能够提高网络的灵活性和可用性。目前使用最为广泛的负载均衡软件是 Nginx、LVS、HAProxy。
六、修改会话的生存时间
1. 在 php.ini 中 设置 session.gc_maxlifetime = 1440 // 默认时间
2. 代码实现;
$lifeTime = 24 * 3600; //保存一天
session_set_cookie_params($lifeTime);
session_start();
七、PHP 的垃圾收集机制
PHP 可以自动进行内存管理,清除不再需要的对象。PHP 使用了引用计数 (referencecounting) 这种单纯的垃圾回收 (garbagecollection) 机制。每个对象都内含一个引用计数器,每个 reference 连接到对象,计数器加 1。当 reference 离开生存空间或被设为 NULL,计数器减 1。当某个对象的引用计数器为零时,PHP 知道你将不再需要使用这个对象,释放其所占的内存空间
八、正则的引擎
正则引擎主要可以分为两大类:一种是 DFA,一种是 NFA。
一般而论,DFA 引擎则搜索更快一些。但是 NFA 以表达式为主导,更容易操纵,因此一般程序员更偏爱 NFA 引擎!
可以使用是否支持忽略优先量词和分组捕获来判断引擎类型:支持 NFA, 不支持 DFA
九、对一个大文件进行逐行遍历,如下方法性能较高的是?
写一个实现了 IteratorAggregate 接口的类,通过该类使用 foreach 遍历。
(使用 IteratorAggregate 可将文件打开后通过移动指针的方式逐行遍历,不受文件大小影响。使用 file_get_contents 处理大文件很容易导致 PHP 内存溢出;调用 exec 会产生额外的进程,影响性能;其他人写的类库质量不一定高。)
十、读取文件加锁和解锁
$fp = fopen("lock.txt","w+");
if (flock($fp,LOCK_EX)) {
//获得写锁,写数据
fwrite($fp, "write something");
// 解除锁定
flock($fp, LOCK_UN);
} else {
echo "file is locking...";
}
fclose($fp);
十一、array_merge () 数组合并函数
定义:array_merge () 函数把一个或多个数组合并为一个数组。(您可以向函数输入一个或者多个数组。)
注释:如果两个或更多个数组元素有相同的键名,则最后的元素会覆盖其他元素。
如果两个数组都是索引数组,则不会覆盖
如果您仅向 array_merge () 函数输入一个数组,且键名是整数,则该函数将返回带有整数键名的新数组,其键名以 0 开始进行重新索引。
该函数与 array_merge_recursive () 函数之间的不同是在处理两个或更多个数组元素有相同的键名的情况。array_merge_recursive () 不会进行键名覆盖,而是将多个相同键名的值递归组成一个数组。
示例;
$a1=array("red","green");
$a2=array("blue","yellow");
$a3=array("CC","DD");
$b1=array("a"=>"sa","b"=>"sb");
$b2=array("a"=>"qa","b"=>"qb");
$b3=array("a"=>"wa","c"=>"ww");
print_r(array_merge($a1,$a2)); //Array ( [0] => red [1] => green [2] => blue [3] => yellow )
print_r(array_merge($a1,$a2,$a3)); //Array ( [0] => red [1] => green [2] => blue [3] => yellow [4] => CC [5] => DD )
print_r(array_merge($b1,$b2)); //Array ( [a] => qa [b] => qb )
print_r(array_merge($b1,$b2,$a3)); // Array ( [a] => qa [b] => qb [0] => CC [1] => DD )
print_r(array_merge($b1,$b2,$b3)); // Array ( [a] => wa [b] => qb [c] => ww )
十二、获取文件扩展名
//plan A
function get_ext(string $url){
//$url = ''http://www.sina.com.cn/abc/de/fg.html?id=1&ajksfg&aakzsdfj'';
$a = parse_url($url); //Array ( [scheme] => http [host] => www.sina.com.cn [path] => /abc/de/fg.html [query] => id=1&ajksfg&aakzsdfj )
$file = basename($a[''path'']); //fg.html
$b = explode(''.'',$file);
return array_pop($b);
}
//plan B
function get_ext(string $url){
//$url = ''http://www.sina.com.cn/abc/de/fg.html?id=1&ajksfg&aakzsdfj'';
$a = basename($url); //fg.html?id=1&ajksfg&aakzsdfj
$b = explode(''?'',$a);; //Array ( [0] => fg.html [1] => id=1&ajksfg&aakzsdfj )
$ext = explode(''.'',$b[0]);
return array_pop($ext);
}
十三、遍历一个文件夹下的所有文件和子文件夹
function my_scandir($dir){
$files = array();
if(is_dir($dir)){
if ($handle = opendir($dir)){
while (($file = readdir($handle))!= false){
if ($file != "." && $file != "..") {
if (is_dir($dir."/".$file)){
$files[$file] = my_scandir($dir."/".$file);
} else{
$files[] = $dir."/".$file;
}
}
}
closedir($handle);
return $files;
}
}
}
十四、编写一个函数,递归遍历,实现无限分类
function tree($arr,$pid=0,$level=0){
static $list = array();
foreach ($arr as $v) {
//如果是顶级分类,则将其存到$list中,并以此节点为根节点,遍历其子节点
if ($v[''parent_id''] == $pid) {
$v[''level''] = $level;
$list[] = $v;
tree($arr,$v[''cat_id''],$level+1);
}
}
return $list;
}
十五、获取上月的最后一天
function get_last_month_last_day($date = ''''){
if ($date != '''') {
$time = strtotime($date);
} else {
$time = time();
}
$day = date(''j'',$time);//获取该日期是当前月的第几天
return date(''Y-m-d'',strtotime("-{$day} days",$time));
}
十六、php 中 WEB 上传文件的原理是什么,如何限制上传文件的大小?
上传文件的表单使用 post 方式,并且要在 form 中添加 enctype=‘multipart/form-data’。
一般可以加上隐藏域:,位置在 file 域前面。
value 的值是上传文件的客户端字节限制。可以避免用户在花时间等待上传大文件之后才发现文件过大上传失败的麻烦。
使用 file 文件域来选择要上传的文件,当点击提交按钮之后,文件会被上传到服务器中的临时目录,在脚本运行结束时会被销毁,所以应该在脚本结束之前,将其移动到服务器上的某个目录下,可以通过函数 move_uploaded_file () 来移动临时文件,要获取临时文件的信息,使用 $_FILES。
限制上传文件大小的因素有:
客户端的隐藏域 MAX_FILE_SIZE 的数值(可以被绕开)。
服务器端的 upload_max_filesize,post_max_size 和 memory_limit。这几项不能够用脚本来设置。
自定义文件大小限制逻辑。即使服务器的限制是能自己决定,也会有需要个别考虑的情况。所以这个限制方式经常是必要的。
十七、双引号和单引号的区别
双引号解释变量,单引号不解释变量
双引号里插入单引号,其中单引号里如果有变量的话,变量解释
双引号的变量名后面必须要有一个非数字、字母、下划线的特殊字符,或者用 {} 讲变量括起来,否则会将变量名后面的部分当做一个整体,引起语法错误
双引号解释转义字符,单引号不解释转义字符,但是解释’\ 和 \
能使单引号字符尽量使用单引号,单引号的效率比双引号要高(因为双引号要先遍历一遍,判断里面有没有变量,然后再进行操作,而单引号则不需要判断)
十八、常用的超全局变量
$_GET ----->get 传送方式
$_POST ----->post 传送方式
$_REQUEST -----> 可以接收到 get 和 post 两种方式的值
$GLOBALS -----> 所有的变量都放在里面
$_FILES -----> 上传文件使用
$_SERVER -----> 系统环境变量
$_SESSION -----> 会话控制的时候会用到
$_COOKIE -----> 会话控制的时候会用到
十九、echo、print_r、print、var_dump 之间的区别
* echo、print 是 php 语句,var_dump 和 print_r 是函数
* echo 输出一个或多个字符串,中间以逗号隔开,没有返回值是语言结构而不是真正的函数,因此不能作为表达式的一部分使用
* print 也是 php 的一个关键字,有返回值 只能打印出简单类型变量的值 (如 int,string),如果字符串显示成功则返回 true,否则返回 false
* print_r 可以打印出复杂类型变量的值 (如数组、对象)以列表的形式显示,并以 array、object 开头,但 print_r 输出布尔值和 NULL 的结果没有意义,因为都是打印 "\n",因此 var_dump () 函数更适合调试
* var_dump () 判断一个变量的类型和长度,并输出变量的数值
二十、对于大流量网站,采用什么方法来解决访问量的问题
确认服务器硬件是否能够支持当前的流量
数据库读写分离,优化数据表
优化 SQL 语句
禁止外部盗链
控制大文件的下载
使用不同主机分流主要流量
使用流量分析统计
本文分享自微信公众号 - 码农编程进阶笔记(lxw1844912514)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。
Android Studio 错误信息汇总(一)
今天遇到一个简单的错误信息提示,特记录如下,方便日后查找:
错误信息一:
2020-02-02 13:27:48.472 20534-20534/com.example.helloworld1 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.helloworld1, PID: 20534
android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.helloworld1/com.example.helloworld1.gridview.GridViewActivity}; have you declared this activity in your AndroidManifest.xml?
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1827)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1531)
at android.app.Activity.startActivityForResult(Activity.java:4405)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767)
at android.app.Activity.startActivityForResult(Activity.java:4363)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:754)
at android.app.Activity.startActivity(Activity.java:4702)
at android.app.Activity.startActivity(Activity.java:4670)
at com.example.helloworld1.MainActivity$Onclick.onClick(MainActivity.java:108)
at android.view.View.performClick(View.java:5642)
at android.view.View$PerformClick.run(View.java:22485)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6211)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:793)
该错误信息中的 ***have you declared this activity in your AndroidManifest.xml?***明确指出“在 AndroidManifest.xml 文件中没有声明相关activity”
修改如下:
在 AndroidManifest.xml 文件中 添加相关activity即可
<activity android:name=".gridview.GridViewActivity"></activity>
错误信息二:
2020-02-02 16:14:15.819 16410-16410/com.example.helloworld1 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.helloworld1, PID: 16410
java.lang.NullPointerException: Argument must not be null
at com.bumptech.glide.util.Preconditions.checkNotNull(Preconditions.java:31)
at com.bumptech.glide.util.Preconditions.checkNotNull(Preconditions.java:25)
at com.bumptech.glide.RequestBuilder.into(RequestBuilder.java:651)
at com.example.helloworld1.gridview.MyGridViewAdapter.getView(MyGridViewAdapter.java:68)
at android.widget.AbsListView.obtainView(AbsListView.java:2486)
at android.widget.GridView.onMeasure(GridView.java:1065)
at android.view.View.measure(View.java:19913)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6247)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
at android.view.View.measure(View.java:19913)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6247)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
at android.view.View.measure(View.java:19913)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6247)
at androidx.appcompat.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:401)
at android.view.View.measure(View.java:19913)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6247)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:19913)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6247)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
at android.view.View.measure(View.java:19913)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6247)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:759)
at android.view.View.measure(View.java:19913)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2279)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1370)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1623)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1258)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6468)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:908)
at android.view.Choreographer.doCallbacks(Choreographer.java:720)
at android.view.Choreographer.doFrame(Choreographer.java:655)
at android.view.Choreographer$FramedisplayEventReceiver.run(Choreographer.java:894)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6211)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:793)
2020-02-02 16:14:15.849 16410-16410/? I/Process: Sending signal. PID: 16410 SIG: 9
每次都是进入当前页面程序就崩溃,界面闪退,
当注释掉网络图片部分即可运行成功。
各种尝试后,发现其实问题很简单,当前页面 imageView 所对应的关联 id 取错了
//错误id:
holder.imageView = (ImageView) convertView.findViewById(R.id.iv_item);
//正确id:
holder.imageView = (ImageView) convertView.findViewById(R.id.iv_grid);
小结:
Android Studio 中 不同的layout布局文件 id名称可重复使用,但每个layout布局文件中的id不能重复,并且在 Activity.java 文件中一定要取对应的布局文件中的相关控件id,否则可能会导致程序崩溃、闪退等错误。
ansible常用模块知识汇总(一)
所有的模块都可以使用下面的命令查看参数:
ansible-doc -s 模块名 //查询某个模块的参数
ansible-doc -l //查看所有模块
模块一:ping
ping模块用来检测主机群是否存活,连通。要用的参数比较少,常用的使用:
ansible test -m ping -uroot
//也可以不用-u指定用户
模块二:fetch
作用:从远端主机群拉去一个文件
使用该模块必须要指定参数src和dest:
//拉去远端的fstab文件到本地/tmp下
ansible test -m fetch -a "src=/etc/fstab dest=/tmp/"
来看下结果:
192.168.247.180 | SUCCESS => {
"changed": false, //因为我自己之前拉过,已经存在了,所以不会改变
"checksum": "b6b5928e637bd4fe64c1c97b0d04e78f8bb5c3f1",
"dest": "/tmp/192.168.247.180/etc/fstab", 在/tmp下生成一个主机目录,这样同时拉去多个就不会混淆
"file": "/etc/fstab",
"md5sum": "beb1c2fe999a9d9a6ca3805e22d1253f"//会生成hash值,判断文件有没有改变的依据,如果你改动了文件,hash值不同就会覆盖
模块三:copy
作用:把本地主机的文件复制到远程主机,作用和fetch相反
常用参数:
src:源文件或目录
dest: 目标路径或文件
force:yes或者no,默认 yes。表示强制覆盖
backup:备份。当远程主机已经存在同名文件时,如果backup为yes表示先把远程文件备份,再复制。如果为no表示不备份直接复制。
owner:拷贝到远程主机后文件或者目录的属主
group:属组
mode:传过去之后的权限
ansible testA -m copy -a "src=/tmp/ddd.txt dest=/tmp/ backup=yes owner=root group=root mode=0644"
模块四:file
作用:对文件和目录的相关操作,比如删除,创建,修改权限等。
常用参数:
path:要操作的目标文件,这里也可以理解为dest,必要参数。
state:指定对文件进行何种操作,常有的touch,directory,link,hard,absent。
src:该参数在创建软硬链接的时候需要指定指向哪个文件。
force:强制参数,文件不存在则生成,已存在则覆盖。
owner:指定文件的属主
group:属组
mode:指定权限
recurse:相当于chmod -R,递归修改目录中文件的属性。
示例:
创建文件
ansible testA -m file -a "path=/tmp/ddd.txt state=touch"
//创建文件,如果存在就会更新时间戳
创建目录
ansible testA -m file -a "path=/tmp state=directory"
给/tmp/a.txt做软链接指向/etc/passwd
ansible testA -m file -a "path=/tmp/a.txt src=/etc/passwd state=link"
硬链接
ansible testA -m file -a "path=/tmp/b.txt src=/etc/passwd state=hard"
删除/tmp/a.txt
ansible testA -m file -a "path=/tmp/a.txt state=absent"
修改文件的属主
ansible testA -m file -a "path=/tmp/aaab.txt owner=MysqL"
修改权限
ansible testA -m file -a "path=/tmp/aaab.txt mode=0644"
模块五:blockinfile
作用:追加,更新文本内容
常用参数:
path:必须参数,指定要操作的文件
block:这里就是要追加等操作具体的内容。
marker:标记,对于ansible插入的内容,会有两行标记,分别在追加内容的上面和下面有begin和end。可以自定义标记。
state:present和absent。默认是前者追加插入,后者是删除追加的内容。
insertafter:插入时默认在放文本最后面,该参数指定添加在某一行后面,支持正则表达式。
backup:是否在修改文件之前先把文件进行备份
create:当操作文件不存在时,是否创建对应文件。
示例:
追加内容
ansible testA -m blockinfile -a ''path=/tmp/aaab.txt block="systemctl start httpd\nsystemctl stop httpd"''
//查看/tmp/aaab的内容
1111 //这个是插入之前的,下面是插入的内容
# BEGIN ANSIBLE MANAGED BLOCK
systemctl start httpd
systemctl stop httpd
# END ANSIBLE MANAGED BLOCK
不指定state,也可以删除追加的内容,block为空
ansible testA -m blockinfile -a ''path=/tmp/aaab.txt block=""''
自定义标记
ansible testA -m blockinfile -a ''path=/tmp/aaab.txt block="systemctl start httpd\nsystemctl stop httpd" marker="#{mark} service to start"''
//mark是个变量,就是标记中的begin和end
查看文本内容
1111
#BEGIN service to start
systemctl start httpd
systemctl stop httpd
#END service to start
absent删除追加的内容
ansible testA -m blockinfile -a ''path=/tmp/aaab.txt marker="#{mark} service to start" state=absent''
将追加内容放在开头
ansible testA -m blockinfile -a ''path=/tmp/aaab.txt block="2222" marker="#{mark} service to start" insertbefore=BOF''
查看文本内容
#BEGIN service to start
2222
#END service to start
1111
模块六:lineinfile
作用:确保某一行在指定文本中,或者确保从文本中删除,还可以正则表达式替换文本内容
path:必要参数,指定要操作的文件
line:指定操作的文本内容
regexp:使用正则表达式,当替换文本时如果有多行被匹配,默认替换最后一个匹配到的行,删除文本时,默认匹配到的全部删除。
state:默认present,还有一个absent删除。
backrefs:当使用正则的时候,如果没有匹配到默认在文本最后面追加该内容,使用该参数为yes后,则不追加。该参数还有一个分组的作用,yes时,line中就可以对regexp中的分组进行引用。
insertafter:指定插入的位置,EOF表示插入到末尾,如果设置成正则,就插入到该正则之后。
insertbefore:BOF为最前面,设置了正则的话,正则之前。该参数和上面的insertafter在backrefs为yes时无效。
backup:是否修改前备份
create:不存在时是否创建
示例:
在远程机器上创建一个实验用的文本
cat aaab.txt
1111
2222
aaa1
bbb1
确保某一行在文本中,如果存在不做任何操作,不存在则追加在最后面
ansible testA -m lineinfile -a ''path=/tmp/aaab.txt line="1111"''
//1111在文本中,所以文本不会有变化
ansible testA -m lineinfile -a ''path=/tmp/aaab.txt line="3333"''
//文本中没有3333,所以添加在文本的最后一行
替换。将文本中11开头的行替换成change,如果内有则添加到最后
ansible testA -m lineinfile -a ''path=/tmp/aaab.txt regexp="^11" line="change"''
使用backrefs。没有匹配到也不会追加。
ansible testA -m lineinfile -a ''path=/tmp/aaab.txt regexp="^4444" line="test" backrefs=yes''
删除所有change的行
ansible testA -m lineinfile -a ''path=/tmp/aaab.txt line="change" state=absent''
总结
以上是小编为你收集整理的ansible常用模块知识汇总(一)全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
原文地址:https://blog.csdn.net/qq_37369726/article/details/104845212
今天的关于nova 后端命令汇总和一的分享已经结束,谢谢您的关注,如果想了解更多关于2019Java面试汇总(一)、2021 年最新 PHP 面试、笔试题汇总(一)、Android Studio 错误信息汇总(一)、ansible常用模块知识汇总(一)的相关知识,请在本站进行查询。
本文标签: