面试题

相比select、poll系统调用,epoll有如下优点:

1.支持一个进程打开的socket描述符(FD)不受限制,仅受限于操作系统的最大文件句柄数。
select最大的缺陷是单个进程所打开的FD是有一定限制的,它由FD_SETSIZE设置,默认值是1024。可以选择修改这个宏后重新编译内核,但这对带来网络效率的下降。也可以选择多进程的方案(传统的Apache方案)来解决这个问题,但进程的创建成本,以及进程间的数据交换需要进行考虑。
epoll具体支持的FD上线值可以通过cat /proc/sys/fs/file-max查看,这个值和系统的内存关系比较大。

2.I/O效率不会随着FD数目的增加而线性下降。
当拥有一个很大的socket集合时,由于网络延时或者链路空闲,任一时刻只有少部分的socket是“活跃”的,但select/poll每次调用都会线性扫描全部的集合,导致效率线性下降。而epoll只会对活跃的socket进行操作-只有活跃的socket才会主动调用callback函数,所以只需要遍历那些被内核I/O事件异步唤醒而加入Ready队列的FD集合。

3.使用mmap加速内核与用户空间的消息传递
epoll通过内核和用户空间mmap同一块内存来实现的。mmap()系统调用允许存放在块设备上的文件或信息的一部分映射到进程的部分地址空间。

1.Hive数据倾斜可能是什么原因造成的?如果解决?
2.Hive的group by 底层是怎么实现的
3.日常的数据分析中,如何保证捞出来的数据是正确的?
4.Hive的优化有哪些方法?
5.行存储和列存储的区别?
6.执行一个Hive语句的流程是怎么样的?

1.为什么用zookeeper
2.spark Shuffle机制?
3.sortShuffle与HashShuffle区别是什么?
4.spark中的RDD的Partition数是由什么决定的?
5.Direct和Receiver的区别在哪?
6.spark内存模型是怎样的?
7.checkpoint是怎么做的,或者说使用在什么地方?
8.数据仓库模型是怎样的?
9.简单介绍下flink任务提交流程
10.你们数据传输之间的接口大体是如何设计的?
11.scala和java有什么区别?
12.spark有什么可优化的点
13.spark集群是基于什么模式?
14.假如Executor内存是10个G,也配置了off-heap,这时候出现了oom问题,除了增大executor内存之外,还有没有其他的解决方法?
15.对于2T的数据,在spark-submit提交参数中,executor个数,内存和CPU的个数是怎么样的一个配置标准?
16.使用git时,之前的1.0版本正在运行,出现了bug,现在正在开发2.0版本,这个时候应该怎么做?
17.DataFrame与SQL比有什么优势?
18.A LeftJoin B A假如有100行,join之后结果有没有可能超过100行?
19.原始数据有用户,订单id,金额,要对这数据进行groupby,这个过程要执行多少个任务,及怎样的一个执行步骤
20.在spark任务提交的过程中task数是由什么来决定的
21.spark core中提供了哪些核心加载函数
22.mapPartition和map算子相比,具体优化了哪些点?
23使用Avg()对金额求平均,执行了多少个动作,怎么执行的?怎么提高求平均值的速度?
24.时间窗口函数如何做到这个时间的窗口值依赖上个时间的窗口值
25.flume配置需要关注哪些点?
26.flink中KeyBy做词分组,是怎样的一个模式
27.JVM调优
28.oom如何处理
29.jvm有哪几种配置模式,假如JVM配置了G1模式,会有年轻代吗
30.jstat查看进程命令
31.kafka0.8版本的offset存在哪里
32.在资源有限的情况下,一万维的矩阵乘以一万维的矩阵应该怎么处理?

问题:

某公司网站有个用户注册系统, 用户需要提供 name, email和phone 三个信息进行注册. 但有人会注册多个账号,

假设:
1. 如果email一样, 其他两栏信息中任意一项不同, 仍算作同一个人
2. 如果phone一样, 其他两栏信息中任意一项不同, 仍算作同一个人
3. name相同不一定是同一人

比如下面这个例子可以被认为是同一个人:

{user1, email1, phone1}
{user2, email2, phone2}
{user3, email1, phone2}

你的任务是在给定所有的用户注册信息后, 计算去重后的用户数.

自定义一个类,重写hashcode和equal方法,然后使用hashset去重,获取hashset大小即可。

简历上如何编写擅长的技术领域:

1,Spark 精通SparkSQL ,Spark CORE,Spark Streaming原理及调优,阅读过Spark Core和Spark Streaming源码。
2,kafka 掌握消费者两种消费模式的区别,与spark Streaming整合的两种方式区别,编写过netty+kafka的高性能producer。
3,hbase 掌握rowkey设计的要点,hbase热点处理,预分区,运行原理,内存调优,故障处理等。
4,hive 熟练使用HQL,掌握常见数据倾斜调优等。
5,数据库 熟练使用redis,mysql,mongodb等,了解不同数据库的使用场景。
6,主要编程语言是java,scala。熟练掌握java多线程,高并发,nio,netty等。
7,对于大数据框架,可以熟练使用flume,sqoop,oozie等
8,完整的hadoop HA集群搭建,监控,告警,运维等。

没有对比就没有伤害的
  1. Map

Map 用于保存具有映射关系的数据,因此Map 集合里保存着两组值,一组用于保存Map 里的Key ,另外一组用于保存Map 里的Value。

Map 中的key 和 value 都可以是任何引用类型的数据。

Map 中的Key 不允许重复,即同一个Map 对象的任何两个Key 通过equals 方法比较都返回false 。

key 和 Value 之间存在单向一对一关系,即通过指定的Key 总能找到唯一的,确定的Value 。

  1. HashMap 和 HashTable

HashMap 和 Hashtable 是Map 接口的两个典型实现类。

区别:

HashTable 是一个古老的Map 实现类,不建议使用。

HashTable 是一个线程安全的Map 实现,但HashMap 是线程不安全的。

HashTable 不允许使用null 作为key 和 value ,而HashMap 可以。

与HashSet 集合不能保证元素的顺序一样,HashTable、HashMap 也不能保存其中key-value 的顺序。

HashTable 、HashMap 判断两个key 相等的标准是:两个key 通过equals 方法返回true,HashCode 值也相等。

HashTable 、HashMap 判断两个Value 相等的标准是:两个Value 通过equals 方法返回true 。

  1. LinkedHashMap

LinkedHashMap 是HashMap 的子类。

LinkedHashMap 可以维护Map 的迭代顺序:迭代顺序与key-value 对的插入顺序一致。

4.TreeMap

TreeMap 存储key-value 时,需要根据key 对key-value 进行排序。TreeMap 可以保证所有的key-value 处于有序顺序。

TreeMap 的Key 排序:

自然排序:TreeMap 的所有key必须实现Comparable 接口,而且所有的key 应该是同一个类的对象,否则将会抛出ClassCastException 。

定制排序:创建TreeMap 时,传入一个Comparator 对象,该对象负责对TreeMap 中的所有key 进行排序。此时不需要Map 的Key 实现Comparable 接口。

面试题 Java 8的hashmap和jdk7,6主要区别?面试 | Java8 HashMap原理这篇文章可以看到最大变化就是由原来的数组➕链表的结构变成了数组➕链表➕红黑树的结构。链表会自动向红黑树转变,由转换阈值默认貌似是8,当然也受数组大小的限制,要大于最小值,默认是64。面试会问的

对比 Hashtable、HashMap、TreeMap 有什么不同?谈谈你对 HashMap 的掌握。

典型回答
Hashtable、HashMap、TreeMap 都是最常见的一些 Map 实现,是以键值对的形式存储和操作数据的容器类型。

Hashtable 是早期 Java 类库提供的一个哈希表实现,本身是同步的,不支持 null 键和值,由于同步导致的性能开销,所以已经很少被推荐使用。

HashMap 是应用更加广泛的哈希表实现,行为上大致上与 HashTable 一致,主要区别在于 HashMap 不是同步的,支持 null 键和值等。通常情况下,HashMap 进行 put 或者 get 操作,可以达到常数时间的性能,所以它是绝大部分利用键值对存取场景的首选,比如,实现一个用户 ID 和用户信息对应的运行时存储结构。

TreeMap 则是基于红黑树的一种提供顺序访问的 Map,和 HashMap 不同,它的 get、put、remove 之类操作都是 O(log(n))的时间复杂度,具体顺序可以由指定的 Comparator 来决定,或者根据键的自然顺序来判断。

对比 Vector、ArrayList、LinkedList 有何区别?

典型回答
这三者都是实现集合框架中的 List,也就是所谓的有序集合,因此具体功能也比较近似,比如都提供按照位置进行定位、添加或者删除的操作,都提供迭代器以遍历其内容等。但因为具体的设计区别,在行为、性能、线程安全等方面,表现又有很大不同。

Vector 是 Java 早期提供的线程安全的动态数组,如果不需要线程安全,并不建议选择,毕竟同步是有额外开销的。Vector 内部是使用对象数组来保存数据,可以根据需要自动的增加容量,当数组已满时,会创建新的数组,并拷贝原有数组数据。

ArrayList 是应用更加广泛的动态数组实现,它本身不是线程安全的,所以性能要好很多。与 Vector 近似,ArrayList 也是可以根据需要调整容量,不过两者的调整逻辑有所区别,Vector 在扩容时会提高 1 倍,而 ArrayList 则是增加 50%。

LinkedList 顾名思义是 Java 提供的双向链表,所以它不需要像上面两种那样调整容量,它也不是线程安全的。

今天我要问你的问题是,int 和 Integer 有什么区别?谈谈 Integer 的值缓存范围。

典型回答
int 是我们常说的整形数字,是 Java 的 8 个原始数据类型(Primitive Types,boolean、byte 、short、char、int、float、double、long)之一。Java 语言虽然号称一切都是对象,但原始数据类型是例外。

Integer 是 int 对应的包装类,它有一个 int 类型的字段存储数据,并且提供了基本操作,比如数学运算、int 和字符串之间转换等。在 Java 5 中,引入了自动装箱和自动拆箱功能(boxing/unboxing),Java 可以根据上下文,自动进行转换,极大地简化了相关编程。

关于 Integer 的值缓存,这涉及 Java 5 中另一个改进。构建 Integer 对象的传统方式是直接调用构造器,直接 new 一个对象。但是根据实践,我们发现大部分数据操作都是集中在有限的、较小的数值范围,因而,在 Java 5 中新增了静态工厂方法 valueOf,在调用它的时候会利用一个缓存机制,带来了明显的性能改进。按照 Javadoc,这个值默认缓存是 -128 到 127 之间。

谈谈 Java 反射机制,动态代理是基于什么原理?

典型回答
反射机制是 Java 语言提供的一种基础功能,赋予程序在运行时自省(introspect,官方用语)的能力。通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。

动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都是利用类似机制做到的,比如用来包装 RPC 调用、面向切面的编程(AOP)。

实现动态代理的方式很多,比如 JDK 自身提供的动态代理,就是主要利用了上面提到的反射机制。还有其他的实现方式,比如利用传说中更高性能的字节码操作机制,类似 ASM、cglib(基于 ASM)、Javassist 等

今天我要问你的问题是,理解 Java 的字符串,String、StringBuffer、StringBuilder 有什么区别?

典型回答
String 是 Java 语言非常基础和重要的类,提供了构造和管理字符串的各种基本逻辑。它是典型的 Immutable 类,被声明成为 final class,所有属性也都是 final 的。也由于它的不可变性,类似拼接、裁剪字符串等动作,都会产生新的 String 对象。由于字符串操作的普遍性,所以相关操作的效率往往对应用性能有明显影响。

StringBuffer 是为解决上面提到拼接产生太多中间对象的问题而提供的一个类,我们可以用 append 或者 add 方法,把字符串添加到已有序列的末尾或者指定位置。StringBuffer 本质是一个线程安全的可修改字符序列,它保证了线程安全,也随之带来了额外的性能开销,所以除非有线程安全的需要,不然还是推荐使用它的后继者,也就是 StringBuilder。

StringBuilder 是 Java 1.5 中新增的,在能力上和 StringBuffer 没有本质区别,但是它去掉了线程安全的部分,有效减小了开销,是绝大部分情况下进行字符串拼接的首选。

对比 Hashtable、HashMap、TreeMap 有什么不同?谈谈你对 HashMap 的掌握。

典型回答
Hashtable、HashMap、TreeMap 都是最常见的一些 Map 实现,是以键值对的形式存储和操作数据的容器类型。

Hashtable 是早期 Java 类库提供的一个哈希表实现,本身是同步的,不支持 null 键和值,由于同步导致的性能开销,所以已经很少被推荐使用。

HashMap 是应用更加广泛的哈希表实现,行为上大致上与 HashTable 一致,主要区别在于 HashMap 不是同步的,支持 null 键和值等。通常情况下,HashMap 进行 put 或者 get 操作,可以达到常数时间的性能,所以它是绝大部分利用键值对存取场景的首选,比如,实现一个用户 ID 和用户信息对应的运行时存储结构。

TreeMap 则是基于红黑树的一种提供顺序访问的 Map,和 HashMap 不同,它的 get、put、remove 之类操作都是 O(log(n))的时间复杂度,具体顺序可以由指定的 Comparator 来决定,或者根据键的自然顺序来判断。

谈谈 final、finally、 finalize 有什么不同?

典型回答
final 可以用来修饰类、方法、变量,分别有不同的意义,final 修饰的 class 代表不可以继承扩展,final 的变量是不可以修改的,而 final 的方法也是不可以重写的(override)。

finally 则是 Java 保证重点代码一定要被执行的一种机制。我们可以使用 try-finally 或者 try-catch-finally 来进行类似关闭 JDBC 连接、保证 unlock 锁等动作。

finalize 是基础类 java.lang.Object 的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。finalize 机制现在已经不推荐使用,并且在 JDK 9 开始被标记为 deprecated。

请对比 Exception 和 Error,另外,运行时异常与一般异常有什么区别?

典型回答
Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。

Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类。Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。

Error 是指在正常情况下,不大可能出现的情况,绝大部分的 Error 都会导致程序(比如 JVM 自身)处于非正常的、不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如 OutOfMemoryError 之类,都是 Error 的子类。

Exception 又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。前面我介绍的不可查的 Error,是 Throwable 不是 Exception。

不检查异常就是所谓的运行时异常,类似 NullPointerException、ArrayIndexOutOfBoundsException 之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求。

谈谈 MySQL 支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?

典型回答
所谓隔离级别(Isolation Level),就是在数据库事务中,为保证并发数据读写的正确性而提出的定义,它并不是 MySQL 专有的概念,而是源于ANSI/ISO制定的SQL-92标准。

每种关系型数据库都提供了各自特色的隔离级别实现,虽然在通常的定义中是以锁为实现单元,但实际的实现千差万别。以最常见的 MySQL InnoDB 引擎为例,它是基于 MVCC(Multi-Versioning Concurrency Control)和锁的复合实现,按照隔离程度从低到高,MySQL 事务隔离级别分为四个不同层次:

读未提交(Read uncommitted),就是一个事务能够看到其他事务尚未提交的修改,这是最低的隔离水平,允许脏读出现。

读已提交(Read committed),事务能够看到的数据都是其他事务已经提交的修改,也就是保证不会看到任何中间性状态,当然脏读也不会出现。读已提交仍然是比较低级别的隔离,并不保证再次读取时能够获取同样的数据,也就是允许其他事务并发修改数据,允许不可重复读和幻象读(Phantom Read)出现。

可重复读(Repeatable reads),保证同一个事务中多次读取的数据是一致的,这是 MySQL InnoDB 引擎的默认隔离级别,但是和一些其他数据库实现不同的是,可以简单认为 MySQL 在可重复读级别不会出现幻象读。

串行化(Serializable),并发事务之间是串行化的,通常意味着读取需要获取共享读锁,更新需要获取排他写锁,如果 SQL 使用 WHERE 语句,还会获取区间锁(MySQL 以 GAP 锁形式实现,可重复读级别中默认也会使用),这是最高的隔离级别。

至于悲观锁和乐观锁,也并不是 MySQL 或者数据库中独有的概念,而是并发编程的基本概念。主要区别在于,操作共享数据时,“悲观锁”即认为数据出现冲突的可能性更大,而“乐观锁”则是认为大部分情况不会出现冲突,进而决定是否采取排他性措施。

反映到 MySQL 数据库应用开发中,悲观锁一般就是利用类似 SELECT … FOR UPDATE 这样的语句,对数据加锁,避免其他事务意外修改数据。乐观锁则与 Java 并发包中的 AtomicFieldUpdater 类似,也是利用 CAS 机制,并不会对数据加锁,而是通过对比数据的时间戳或者版本号,来实现乐观锁需要的版本判断。

我认为前面提到的 MVCC,其本质就可以看作是种乐观锁机制,而排他性的读写锁、双阶段锁等则是悲观锁的实现。

有关它们的应用场景,你可以构建一下简化的火车余票查询和购票系统。同时查询的人可能很多,虽然具体座位票只能是卖给一个人,但余票可能很多,而且也并不能预测哪个查询者会购票,这个时候就更适合用乐观锁。

考点分析
今天的问题来源于实际面试,这两部分问题反映了面试官试图考察面试者在日常应用开发中,是否学习或者思考过数据库内部的机制,是否了解并发相关的基础概念和实践。

我从普通数据库应用开发者的角度,提供了一个相对简化的答案,面试官很有可能进一步从实例的角度展开,例如设计一个典型场景重现脏读、幻象读,或者从数据库设计的角度,可以用哪些手段避免类似情况。我建议你在准备面试时,可以在典型的数据库上试验一下,验证自己的观点。

其他可以考察的点也有很多,在准备这个问题时你也可以对比 Java 语言的并发机制,进行深入理解,例如,随着隔离级别从低到高,竞争性(Contention)逐渐增强,随之而来的代价同样是性能和扩展性的下降。

数据库衍生出很多不同的职责方向:

数据库管理员(DBA),这是一个单独的专业领域。

数据库应用工程师,很多业务开发者就是这种定位,综合利用数据库和其他编程语言等技能,开发业务应用。

数据库工程师,更加侧重于开发数据库、数据库中间件等基础软件。

后面两者与 Java 开发更加相关,但是需要的知识和技能是不同的,所以面试的考察角度也有区别,今天我会分析下对相关知识学习和准备面试的看法。

另外,在数据库相关领域,Java 工程师最常接触到的就是 O/R Mapping 框架或者类似的数据库交互类库,我会选取最广泛使用的框架进行对比和分析。

知识扩展
首先,我来谈谈对数据库相关领域学习的看法,从最广泛的应用开发者角度,至少需要掌握:

数据库设计基础,包括数据库设计中的几个基本范式,各种数据库的基础概念,例如表、视图、索引、外键、序列号生成器等,清楚如何将现实中业务实体和其依赖关系映射到数据库结构中,掌握典型实体数据应该使用什么样的数据库数据类型等。

每种数据库的设计和实现多少会存在差异,所以至少要精通你使用过的数据库的设计要点。我今天开篇谈到的 MySQL 事务隔离级别,就区别于其他数据库,进一步了解 MVCC、Locking 等机制对于处理进阶问题非常有帮助;还需要了解,不同索引类型的使用,甚至是底层数据结构和算法等。

常见的 SQL 语句,掌握基础的 SQL 调优技巧,至少要了解基本思路是怎样的,例如 SQL 怎样写才能更好利用索引、知道如何分析SQL 执行计划等。

更进一步,至少需要了解针对高并发等特定场景中的解决方案,例如读写分离、分库分表,或者如何利用缓存机制等,目前的数据存储也远不止传统的关系型数据库了。

上面的示意图简单总结了我对数据库领域的理解,希望可以给你进行准备时提供个借鉴。当然在准备面试时并不是一味找一堆书闷头苦读,我还是建议从实际工作中使用的数据库出发,侧重于结合实践,完善和深化自己的知识体系。

接下来我们还是回到 Java 本身,目前最为通用的 Java 和数据库交互技术就是 JDBC,最常见的开源框架基本都是构建在 JDBC 之上,包括我们熟悉的JPA/Hibernate、MyBatis、Spring JDBC Template 等,各自都有独特的设计特点。

Hibernate 是最负盛名的 O/R Mapping 框架之一,它也是一个 JPA Provider。顾名思义,它是以对象为中心的,其强项更体现在数据库到 Java 对象的映射,可以很方便地在 Java 对象层面体现外键约束等相对复杂的关系,提供了强大的持久化功能。内部大量使用了Lazy-load等技术提高效率。并且,为了屏蔽数据库的差异,降低维护开销,Hibernate 提供了类 SQL 的 HQL,可以自动生成某种数据库特定的 SQL 语句。

Hibernate 应用非常广泛,但是过度强调持久化和隔离数据库底层细节,也导致了很多弊端,例如 HQL 需要额外的学习,未必比深入学习 SQL 语言更高效;减弱程序员对 SQL 的直接控制,还可能导致其他代价,本来一句 SQL 的事情,可能被 Hibernate 生成几条,隐藏的内部细节也阻碍了进一步的优化。

而 MyBatis 虽然仍然提供了一些映射的功能,但更加以 SQL 为中心,开发者可以侧重于 SQL 和存储过程,非常简单、直接。如果我们的应用需要大量高性能的或者复杂的 SELECT 语句等,“半自动”的 MyBatis 就会比 Hibernate 更加实用。

而 Spring JDBC Template 也是更加接近于 SQL 层面,Spring 本身也可以集成 Hibernate 等 O/R Mapping 框架。

关于这些具体开源框架的学习,我的建议是:

从整体上把握主流框架的架构和设计理念,掌握主要流程,例如 SQL 解析生成、SQL 执行到结果映射等处理过程到底发生了什么。

掌握映射等部分的细节定义和原理,根据我在准备专栏时整理的面试题目,发现很多题目都是偏向于映射定义的细节。

另外,对比不同框架的设计和实现,既有利于你加深理解,也是面试考察的热点方向之一。

今天我从数据库应用开发者的角度,分析了 MySQL 数据库的部分内部机制,并且补充了我对数据库相关面试准备和知识学习的建议,最后对主流 O/R Mapping 等框架进行了简单的对比。

内部类是使用场景

内部类特别适合类比较小,相对独立,而在逻辑上又非常依赖外部类的地方。使用时不能想用内部类而使用内部类,而必须按实际情况来。比如一个类有几十个字段,就不太适合做内部类使用。不然会显得外部类过于庞大臃肿。不方便后期回复。所以内部类使用原则就是适用于短小精悍。对于匿名内部类,通常只能创建一个对象。现实中是否会存在这样的场景呢?答案是肯定的。显示场景中会出现使用一个只有一两个方法的接口的对象。而且这个对象只使用一次就够了。那么这种情况就非常适合于匿名内部类。既省了命名资源,又方便维护。

又翻了以前的文章,建议那些准备找工作或者准备培训的可以先读读:

1,java 公众号入门教程就可以获得教程。
2,hadoop高可用集群的安装部署,cm等框架部署hadoop集群等
3,mapreduce会写,比如倒排索引,二次排序,三种join的方式
4,hive基本使用,hive优化。
5,hbase的基本使用,rowkey设计,region设计,数据读写的过程。
6,Kafka生成消费者java代码编写,高并发模式,flume与Kafka结合的两种方式:kafkasource和Kafkasink,spark streaming结合Kafka的使用及两种模式,Kafka建议版本0.8.2及0.10都进行测试。
7,spark core,spark sql,spark streaming基本使用及调优。
这些都可以在浪尖公众号找到资料的。本星球也会帮助你成就spark三件套,kafka,hbase,spark。

拼多多面试贴

hadoop读写流程
数据丢失怎么处理
spark mr过程
数据倾斜
hive udf
项目问答
数据仓库建设流程
hive高阶函数

kafka的message包括哪些信息

一个Kafka的Message由一个固定长度的header和一个变长的消息体body组成header部分由一个字节的magic(文件格式)和四个字节的CRC32(用于判断body消息体是否正常)构成。当magic的值为1的时候,会在magic和crc32之间多一个字节的数据:attributes(保存一些相关属性,比如是否压缩、压缩格式等等);如果magic的值为0,那么不存在attributes属性

body是由N个字节构成的一个消息体,包含了具体的key/value消息

PV,UV

PV是网站分析的一个术语,用以衡量网站用户访问的网页的数量。对于广告主,PV值可预期它可以带来多少广告收入。一般来说,PV与来访者的数量成正比,但是PV并不直接决定页面的真实来访者数量,如同一个来访者通过不断的刷新页面,也可以制造出非常高的PV。

PV、UV、IP之间的区别与联系 - 以德糊人 - ——挨踢民工 Playkid——

1、什么是PV值

PV(page view)即页面浏览量或点击量,是衡量一个网站或网页用户访问量。具体的说,PV值就是所有访问者在24小时(0点到24点)内看了某个网站多少个页面或某个网页多少次。PV是指页面刷新的次数,每一次页面刷新,就算做一次PV流量。

度量方法就是从浏览器发出一个对网络服务器的请求(Request),网络服务器接到这个请求后,会将该请求对应的一个网页(Page)发送给浏览器,从而产生了一个PV。那么在这里只要是这个请求发送给了浏览器,无论这个页面是否完全打开(下载完成),那么都是应当计为1个PV。

2、什么是UV值

UV(unique visitor)即独立访客数,指访问某个站点或点击某个网页的不同IP地址的人数。在同一天内,UV只记录第一次进入网站的具有独立IP的访问者,在同一天内再次访问该网站则不计数。UV提供了一定时间内不同观众数量的统计指标,而没有反应出网站的全面活动。通过IP和cookie是判断UV值的两种方式:

用Cookie分析UV值

当客户端第一次访问某个网站服务器的时候,网站服务器会给这个客户端的电脑发出一个Cookie,通常放在这个客户端电脑的C盘当中。在这个Cookie中会分配一个独一无二的编号,这其中会记录一些访问服务器的信息,如访问时间,访问了哪些页面等等。当你下次再访问这个服务器的时候,服务器就可以直接从你的电脑中找到上一次放进去的Cookie文件,并且对其进行一些更新,但那个独一无二的编号是不会变的。

PV、UV、IP之间的区别与联系 - 以德糊人 - ——挨踢民工 Playkid——

3、IP即独立IP数

IP可以理解为独立IP的访问用户,指1天内使用不同IP地址的用户访问网站的数量,同一IP无论访问了几个页面,独立IP数均为1。但是假如说两台机器访问而使用的是同一个IP,那么只能算是一个IP的访问。

IP和UV之间的数据不会有太大的差异,通常UV量和比IP量高出一点,每个UV相对于每个IP更准确地对应一个实际的浏览者。

①UV大于IP

这种情况就是在网吧、学校、公司等,公用相同IP的场所中不同的用户,或者多种不同浏览器访问您网站,那么UV数会大于IP数。

②UV小于IP

在家庭中大多数电脑使用ADSL拨号上网,所以同一个用户在家里不同时间访问您网站时,IP可能会不同,因为它会根据时间变动IP,即动态的IP地址,但是实际访客数唯一,便会出现UV数小于IP数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值