网站备案 内容php不用框架怎么做网站

当前位置: 首页 > news >正文

网站备案 内容,php不用框架怎么做网站,太平阳建设集团网站,江门阿里巴巴网站建设1、介绍一下数据库的三大范式 第一范式(1NF)#xff1a;属性不可分割#xff0c;即每个属性都是不可分割的原子项。(实体的属性即表中的列) 第二范式(2NF)#xff1a;满足第一范式#xff1b;且不存在部分依赖#xff0c;即非主属性必须完全依赖于主属性。(主属性即主键属性不可分割即每个属性都是不可分割的原子项。(实体的属性即表中的列) 第二范式(2NF)满足第一范式且不存在部分依赖即非主属性必须完全依赖于主属性。(主属性即主键完全依赖是针对于联合主键的情况非主键列不能只依赖于主键的一部分) 第三范式(3NF)满足第二范式且不存在传递依赖即非主属性不能与非主属性之间有依赖关系非主属性必须直接依赖于主属性不能间接依赖主属性。A - B, B -C, A - C 2、介绍一下数据库的隔离级别 事务的特性ACID 原子性Atomicity原子性是指一个事务中的操作要么全部成功要么全部失败如果失败就回滚到事务开始前的状态。 一致性Consistency一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态也就是说一个事务执行之前和执行之后都必须处于一致性状态。那转账举栗子A账户和B账户之间相互转账无论如何操作A、B账户的总金额都必须是不变的。 隔离性Isolation隔离性是当多个用户并发的访问数据库时如果操作同一张表数据库则为每一个用户都开启一个事务且事务之间互不干扰也就是说事务之间的并发是隔离的。再举个栗子现有两个并发的事务T1和T2T1要么在T2开始前执行要么在T2结束后执行如果T1先执行那T2就在T1结束后在执行。关于数据的隔离性级别将在后文讲到。 持久性Durability持久性就是指如果事务一旦被提交数据库中数据的改变就是永久性的即使断电或者宕机的情况下也不会丢失提交的事务操作。 事务的隔离性Isolation是指多个用户的并发事务访问同一个数据库时一个用户的事务不应该被其他用户的事务干扰多个并发事务之间要相互隔离。 如果不考虑隔离性会发生什么事呢 1.脏读 脏读是指一个事务在处理数据的过程中读取到另一个为提交事务的数据。 2.不可重复读 不可重复读是指对于数据库中的某个数据一个事务范围内的多次查询却返回了不同的结果这是由于在查询过程中数据被另外一个事务修改并提交了。 不可重复读和脏读的区别是脏读读取到的是一个未提交的数据而不可重复读读取到的是前一个事务提交的数据。 而不可重复读在一些情况也并不影响数据的正确性比如需要多次查询的数据也是要以最后一次查询到的数据为主。 3.幻读 幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作这时事务T2又对这个表中插入了一行数据项而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据会发现还有一行没有修改其实这行是从事务T2中添加的就好像产生幻觉一样这就是发生了幻读。 幻读和不可重复读都是读取了另一条已经提交的事务这点就脏读不同所不同的是不可重复读查询的都是同一个数据项而幻读针对的是一批数据整体比如数据的个数。 总的来说解决不可重复读的方法是锁行解决幻读的方式是锁表。 四种隔离级别解决了上述问题。 1.读未提交Read uncommitted 这种事务隔离级别下select语句不加锁。 此时可能读取到不一致的数据即“读脏 ”。这是并发最高一致性最差的隔离级别。 2.读已提交Read committed 可避免 脏读 的发生。 在互联网大数据量高并发量的场景下几乎 不会使用 上述两种隔离级别。 3.可重复读Repeatable read MySql默认隔离级别。 可避免 脏读 、不可重复读 的发生。 4.串行化Serializable 可避免 脏读、不可重复读、幻读 的发生。 以上四种隔离级别最高的是 Serializable 级别最低的是 Read uncommitted 级别当然级别越高执行效率就越低。像 Serializable 这样的级别就是以 锁表 的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读) 。 在MySQL数据库中支持上面四种隔离级别默认的为Repeatable read (可重复读) 而在 Oracle数据库 中只支持Serializable (串行化) 级别和 Read committed (读已提交) 这两种级别其中默认的为 Read committed读已提交 级别。 3、单例模式 1. 什么是单例模式 面试官问什么是单例模式时千万不要答非所问给出单例模式有两种类型之类的回答要围绕单例模式的定义去展开。 单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时为了防止频繁地创建对象使得内存飙升单例模式可以让程序仅在内存中创建一个对象让所有需要调用的地方都共享这一单例对象。 2. 单例模式的类型 单例模式有两种类型 懒汉式在真正需要使用对象时才去创建该单例类对象 饿汉式在类加载时已经创建好该单例对象等待被程序使用 懒汉式创建单例对象。 懒汉式创建对象的方法是在程序使用对象前先判断该对象是否已经实例化判空若已实例化直接返回该类对象否则则先执行实例化操作。 4、violate 的作用是什么 使用volatile关键字可以防止指令重排序使用volatile关键字修饰的变量可以保证其指令执行的顺序与程序指明的顺序一致不会发生顺序变换这样在多线程环境下就不会发生NPE异常了。 volatile还有第二个作用使用volatile关键字修饰的变量可以保证其内存可见性即每一时刻线程读取到该变量的值都是内存中最新的那个值线程每次操作该变量都需要先读取该变量。 总结 1单例模式常见的写法有两种懒汉式、饿汉式 2懒汉式在需要用到对象时才实例化对象正确的实现方式是Double Check Lock解决了并发安全和性能低下问题。 3饿汉式在类加载时已经创建好该单例对象在获取单例对象时直接返回对象即可不会存在并发安全和性能问题。 4在开发中如果对内存要求非常高那么使用懒汉式写法可以在特定时候才创建该对象 5如果对内存要求不高使用饿汉式写法因为简单不易出错且没有任何并发安全和性能问题。 6为了防止多线程环境下因为指令重排序导致变量报NPE需要在单例对象上添加volatile关键字防止指令重排序。 7最优雅的实现方式是使用枚举其代码精简没有线程安全问题且 Enum 类内部防止反射和反序列化时破坏单例。 5、synchronized 的实现方法、代码块、对象 synchronized关键字解决的是多个线程之间访问资源的同步性synchronized 翻译为中文的意思是同步也称之为同步锁。 synchronized的作用是保证在同一时刻被修饰的代码块或方法只会有一个线程执行以达到保证并发安全的效果。 特性 1原子性synchronized保证语句块内操作是原子的. 2可见性synchronized保证可见性通过“在执行unlock之前必须先把此变量同步回主内存”实现 3有序性synchronized保证有序性通过“一个变量在同一时刻只允许一条线程对其进行lock操作” 4重入性synchronized 是可重入锁也就是说允许一个线程二次请求自己持有对象锁的临界资源这种情况称为可重入锁。是因为 synchronized 锁对象有个计数器会随着线程获取锁后 1 计数当线程执行完毕后 -1直到清零释放锁。 Synchronized的四种状态(优化) 1无锁状态表示没有线程占用此锁。 2偏向锁一个线程一直访问此同步代码一种占用此锁那么该线程就会自动获取锁提高效率。 3轻量级锁当锁是偏向锁时此时又有其他的线程来抢占就会升级为轻量级锁未抢占到锁的线程就会通过自旋的形式尝试去获取锁提高性能。 4重量级锁当锁是重量级锁时未抢占到锁的线程自旋到一定次数(对CPU消耗大)还未拿到锁时就会升级为重量级锁此线程会等待操作系统的调动就不在主动的去抢占获取锁了。 对象结构 Synchronized锁的状态存储在锁对象的对象头里对象头中有一块区域为Mark Word用于存储对象运行时的数据比如hashcodeGC次数锁状态标识。32位操作系统Mark Word为32位64位操作系统Mark Word为64位。 锁的具体实现 线程代码进入到Synchronized代码块时会自动获取锁对象这时其他线程访问时会被阻塞直到Synchroinzed代码块执行完毕或抛出异常调用wait()方法都会释放锁对象。在进入Synchronized代码块时会将主内存的变量读取到自己的工作内存在退出的时候会把工作内存的更新值写入到主内存。Java中Synchronized通过在锁对象的对象头设置标记达到获取锁和释放锁的目的。

  1. 冲突对不同的关键字可能得到同一哈希地址即key1≠key2而fkey1fkey2这种现象称冲突collision。具有相同函数值的关键词对该哈希函数来说称作同义词synonym。 一 、哈希函数 1除留余数法(K%P P一般情况下取小于表长的最大素数 表长是100则p取97 若表长是25则p取23) 2数字分析法 3平方取中法 4直接定址法 二 、解决冲突的方法 1开放定址法1.线性探测法 1 2 3… 2.二次探测法 12 -12 22 -22 (2)再哈希法增加了不算的时间 不容易产生聚集现象 注意冲突只能减小 不可以避免 7.Switch case语句、常用情况 switch case 语句根据表达式的结果寻找匹配的case并执行case后面的语句一直到break为止如果没有遇到 break 那就接着执行下面的语句。如果所有的case都不匹配那么就执行default 后面的语句如果没有default那么程序就什么都不会执行直接跳过switch case 语句。 注意 1.switch case 语句的结果只能是整数int类型 2.控制表达式只能是整数型的结果 3.常量可以是常数也可以是常数计算的表达式 4.break 在程序中是代表 “结束” 的意思 8.结构体和共同体的区别 定义 结构体struct把不同类型的数据组合成一个整体自定义类型。 共同体union使几个不同类型的变量共同占用一段内存。 地址struct和union都有内存对齐结构体的内存布局依赖于CPU、操作系统、编译器及编译时的对齐选项。 结构体struct不同之处struct里每个成员都有自己独立的地址。sizeof(struct)是内存对齐后所有成员长度的加和。 共同体union当共同体中存入新的数据后原有的成员就失去了作用新的数据被写到union的地址中。sizeof(union)是最长的数据成员的长度。