【NoSQL数据库简介】
常见的关系型数据库如:MySQL、Oracle、RDBMS等存在的问题:
①.高并发时的性能问题。当数据库处于高负荷运转时,关系型数据库的性能会遇到瓶颈,这个时候的数据库操作会变得更加的费时,虽然可以使用 memcached 解决,但是也会带来 hash 不一致等问题。
②.扩展性。当要给数据增加一个字段时,需要更改大量的表结构,这变相地增加了维护成本。
③.恢复时速度缓慢。当一个关系型数据库的数据存储很多长文本或者大数据时,恢复数据的过程会变的更缓慢。
而 NoSQL 的优势就在于解决以上问题,首先当数据之间解除关系依赖后,NoSQL 的数据库可以轻易地部署在分布式系统上,这样通过多台机器可以分担单一机器的高负荷,解决高负荷下的性能瓶颈问题。同时,由于数据之间无关系,所以可以随时增加或删除字段。还有,就是因为结构简单,它的反应能力比关系型数据库快多了。因此 NoSQL 有着高扩展性、分布式计算、低成本、架构的灵活性、半结构化数据等特点。
在挑选数据库时,还是得分具体情况,如果你的业务量小,那么关系型非关系型数据库都随便选,挑自己最顺手的。而当业务量扩大后,就需要分场景处理了,有的业务可能有复杂的数据关联,这种就离不开关系型数据库,而有的地方只是简单的 key-value 数据,那么就果断地上 NoSQL。
常见的NoSQL数据库有Redis、MongoDB、HBase等。
NOSQL 数据库一般都是 Key-Value 形式的,它的查询不需要 SQL 语句支持,只能通过 Key 来查询。这种数据库是未来的趋势,而且大多数都免费,并且 Json 数据格式应该已经成为互联网最流行的数据格式,对 Java 以及 JavaScript 都极其友好。
【数据恢复的原理】
要说数据恢复,就得先看下数据丢失的方式,主要分两种,一种是存储介质损坏导致的数据丢失,另一种就是数据从存储介质上删除。如果你遇上了第一种情况,比如说硬盘丢了、碎了,硬盘上有坏掉的扇区这种物理性的损坏,那么你基本上可以和这些数据告别了;但是,如果你只是不小心将文件从回收站里清除了,或者手贱格式化硬盘了,这些是逻辑上的删除,那么还是有可能恢复回来的。
大部分文件系统是这样设计的,一部分是索引区,另一部分是数据区。当我们新加一个文件时,先往索引区里添加一条文件索引信息,然后往数据区里写入文件的完整内容。当删除一个文件时,一般只会将它的信息从索引区里删除,而数据区里的内容却不做删除,只是标记为无人使用,如果有新的文件写入系统,那么这些被标记无人使用的区域很有可能被新文件覆盖掉。
所以,当我们手贱误删了一些文件后,想要恢复它们是有可能的,就是需要保证没有其它的数据进来,将误删的文件数据覆盖掉。所以,如果发现误删文件,那么从那一刻起就要时刻注意不要写入新的文件,否则,你数据被覆盖后,找谁都帮不了你的忙。
【分布式计算的基础:MapReduce】
MapReduce 是由 Google 提出的一个分布式计算模型,简单的说,就是把大量的数据分解成独立的单元执行 (Map) , 然后将结果归并在一起(Reduce)。
数据库索引,对数据库里的某个属性的所有值进行排序,从而加快查询速度,是一种典型的空间换时间的思想。
所谓「埋点」
就是在正常的功能逻辑中添加统计逻辑。
所谓「上报」
并不是每统计到一次事件或者状态就会发起数据上报,客户端统计到的数据会先暂时存储在内存或者磁盘上,当用户启动、退出应用程序的时候,或者在其他更合适的时机,将当前周期统计到的事件批量上报到服务器,这样做的目的主要是考虑到与服务器多次建立连接的性能损耗和流量问题(相同大小的数据分多次发送比一次发送要消耗更多流量),另外客户端在上报具体的统计事件之外,还会将标识用户的 ID 一并上报,后续用于计算用户相关的数据如日使用用户和留存率等。
其他
对CPU性能影响主要的因素还是CPU的架构,可以说影响是决定性的。
我们经常听到的CPU架构有arm,x86,x64,手机中使用普遍的就是arm架构的CPU了,而PC选用的是x86/x64。这是使用场景决定的,手机小,可用空间紧张,散热困难,电量堪忧,注定不能像 PC 活那么潇洒,而 arm 架构的 CPU 使用的精简指令集就是为低功耗设计的,当然论性能 Intel 的x86/x64 肯定更强劲,当然发热和耗电也会很强劲,如果硬要塞进手机,估计只能一直插着电源,带着隔热手套用。
ARM 实在是无处不在。我们用的智能手机、平板、智能手表,无论是苹果三星,还是小米魅族,用的绝大部分都是 ARM 架构的处理器。当前正火的物联网技术,目前也是 ARM 处理器的天下。
固态硬盘(SSD)是近几年渐渐被普及的新产品,相比 HDD(传统的机械硬盘) 来说,固态硬盘的这个「盘」字就有点名不副实了。SSD 用闪存替代了 HDD 的「磁碟」来作为存储介质,直接通过电流来写入、读取数据,摒弃了 HDD 中的机械操作过程,并且 SSD 的读和写可以将一个完整数据拆成多份,在主控的控制下并行操作,这样就大大提高了读写的吞吐量。
目前市面上实现无线充电的套件都是以电磁感应的方式传输能量的。看上去无线充电很美好,但是还是有一些缺点阻碍了它的发展,比如说充电距离不够远,需要靠近充电装置才能维持充电。还有就是能量转换率不高,由于电磁感应方式充电的能量转换率只有70%左右,还有 30%的能量以热能的方式散发,因此有的手机经过无线充电后后背有一些发烫。
如果你的手机不支持无线充电,又想使用无线充电带来的方便,那么你可以使用无线充电的卡贴,在你的手机背后贴上一个线圈,同时将电流输向USB 入口,这种设计真是太机智了。
我们知道 APK 是 Android 系统上的应用安装包,但这玩意儿是怎么来的呢?
APK 文件其实和一般的压缩文件没什么两样,右键解压到 xxx 就能拔去它的狼皮。我们来看看有些什么:

这是一个最简单的 APK 文件结构了,AndroidManifest 包含了软件的一些基本信息,例如版本号什么的,同时它也是程序间能够互相调用的基础,比如微信在里面声明了weixin://这样的协议头,那么其它应用就能通过这个协议头调用微信的功能(当然还有别的调用方式),可以认为它是程序的门面。
classes.dex 可是程序员的心血,没日没夜敲的代码全在里面呢。
当然还有饱含设计师的心血的资源文件夹 res,打开 res 能看到里面还有很多的文件夹,drawable 里面有设计师切的图片,xml 文件描述的动画效果,各种界面布局等等。为了方便程序使用,需要为这些资源建立一个索引,这便是 resources.arsc。
为了防止盗版应用,签名信息也不可少,就剩下 META-INF 了,就是它了。
从一堆代码+资源到一个可以安装执行的 APK 的过程其实就是程序员常说的打包了,这是一个如同流水线般的过程。
了解了 APK 里面的文件后,打包的过程就可以与这些文件对应起来。首先要处理代码以外的资源文件,比如对可以拉伸的图做一些调整,检查各种 xml 的描述文件是否合法,以及为这些资源文件生成供程序查找的索引。然后开始处理代码部分了,把代码的原始文件(自己的&别人的)一起编译成 class 文件,一般情况下程序员是不希望别人通过反编译轻易看懂自己的代码的,所以还要混淆这些 class文件,简言之就是把原始命名什么的弄得很奇怪,让人看不懂(混淆不是必须的),再转换成一个 Android 能执行的 dex 文件,故名 classes.dex。现在有代码有资源了,但 APK 还不能发布,它现在就像一份没有签字的文件,所以这最后一步就是应用签名了,原理就是公钥私钥的老套路了,总之签了名就标识了发布者,防止应用被篡改。
Xposed 是 Android 系统上的一套 Hook 框架,通过它可以在不修改原App 的情况下,修改 App 中函数的行为,使得第三方开发者也可以对 App 做一些定制化的改动。
热补丁,可以做到线上推送一段修补 BUG 的代码,终端无需更新版本,直接运行。
客户端的增量更新
将程序按照模块拆散,代码分散到各个模块当中,那么,只需要保证程序的主体是一个足够健壮的模块加载器(负责加载各个模块),当需要更新时,只需要找到需要更新的的模块,下载并替换掉,下次程序主体启动后就可以直接加载更新后的模块。
传统的 app 架构里,通常是 app 主动向服务器请求数据,服务器被动的提供数据。
从技术上来讲,实现一个推送系统需要服务器端和终端的配合。一种方法是轮询,也就是不停的向服务器发起请求。另一种方法是服务器和 app 建立一个长时间连接的通道,通过这个通道,不仅 app可以向服务器请求数据,服务器也可以向 app 发送数据,看起来非常完美,但是如果 app 被用户关闭的话,通道就断掉了。好在 android 系统给 app提供了一个这样的环境,app 可以启动一个后台服务来维持这个通道,即使app 被关掉了,服务依然可以运行,通道依然还在工作。
Android Debug Bridge(adb)的中文名称是 Android 调试桥接器,是Android 的程序猿日常工作中必不可少的工具之一。
缓存系统经常分为两级,称为一级缓存,二级缓存。
一级缓存也叫内存缓存,二级缓存也叫硬盘缓存(手机 App 中,在 Sd 卡上)。很显然,一级缓存存取速度更快,程序退出数据就消失,不可一直保留,且多占了一些内存,容易被人叨逼叨的说程序占内存大,把系统拖慢了,其实这是非常合理的一种以空间换取时间的程序设计。二级缓存容量可以更大,速度要慢一些,程序下次启动时候,依然可以使用。
Android 应用是用 Java 代码编写的,Java 是解释性语言,编译生成的文件是字节码文件,最终是运行在Java 虚拟机上的,Java 虚拟机是干啥的呢?它就是个翻译,负责将字节码文件解释成对应平台能够读懂的语言。Java 应用走到哪,都得带上这个翻译,这沟通效率就可想而知了。相比之下 IOS 的应用则没有这种困扰,它们可以直接和机器沟通。从这个层面上讲,Android 应用有先天劣势,始终会慢一拍。
ping 是 TCP/IP 协议族中的一部分,它的原理是向目标 IP 地址发送一个数据包,如果对方返回一个同样大小的数据包,则证明连通。并且整个过程能够测试时延。
如果你使用了邮件客户端,那么你一定在 POP、IMAP、SMTP 这些名词中纠结过,现在我们来捋一捋:
POP 的大名是 Post Office Protocol,中文是邮局协议,听起来高大上,但是它很弱,只是支持从邮件服务器上将用户的邮件下载到本地。
IMAP 是另一种从邮件服务器下载邮件的协议,它比 POP 要强大一些,它在从服务器获取邮件的时候,可以选择先获取标题和摘要,当你想看具体内容时,再去拉取正文,同时,它还可以将你对邮件处理的一些状态(如标记为已读、删除)同步给服务器,这样你在另外一个客户端上就不用再处理一次了。
说完收邮件,那么接下来就是发送邮件了,一封邮件从客户端到自己的邮箱服务器,再从自己的邮箱服务器到对方的邮箱服务器,都是使用的SMTP(Simple Mail Transfer Protocol)协议进行传输的,它是一种「推」的协议,将邮件推送给服务器。
HTTP状态码说明

ajax 是一项用于异步拉取数据并展示在当前页面的技术,这对于需要延迟加载数据还有触发式加载数据好处大大的,当前的绝大多数网页为了速度快,都会用到这项技术。
静态网页不需要后台程序干预处理,直接由服务器返回,实现为静态网页后,一般不需要维护,因为数据不需要更新。动态网页一般需要程序处理(asp,jsp,php,python,ruby 等等),并由数据库提供数据支撑。不要以 URL 来判断一个网页是静态还是动态,而应该看页面的属性。
网络爬虫的作用就是抓取某个指定网页的数据并存储在本地,而 Google、百度两家公司的主要收入来源都是搜索引擎,搜索引擎的数据,都是网络爬虫没日没夜地从互联网上抓取回来的,所以说网络爬虫就是他们的黄金矿工。
忘记密码后,为什么是重置密码,而不是直接反馈原来的密码?
让我们先来看看服务器是如何保存密码的:
后台不能明文存密码(安全性),加密的密码也不可以(先不说技术上能否破解加密,从人员管理角度来讲,如果是加密的密码,掌握后台服务器管理权限的人自然能够知道解密的密钥,这本身就已经非常不安全了,特别是金融行业。)
密码要安全,首先要保证原始密码经过算法转换后的值是唯一确定的,且是不可逆的(比如经常听说的 MD5,SHA 算法),就是说如果经过算法转换后的值相同,那么就认为输入的密码也是相同,但是没有办法通过得到的值去反推原始密码,即使是服务器的管理员也是不知道的。
一般内存还会分为物理内存和虚拟内存,简单点理解,物理内存就是你实际的内存大小,是给用户看的数字。虚拟内存是给操作系统里的应用程序看的,有时候物理内存只有 2GB,但是应用程序需要 4GB,怎么办呢?那就虚构一块出来,然后通过内存的换页机制,其实就是拆了东墙补西墙,蒙混过关。
重构就是在保留现有功能的基础上,重新梳理软件中的代码结构,让原本杂乱无章的代码重新具有可读性、结构性和可扩展性,增加软件的开发效率,优化程序的性能。
SDK 是 SoftWare Development Kit 的简称,中文叫做「软件开发工具包」,SDK 是一整套工具的集合,这套工具是基于当前系统或者平台的开发工具。
API 是 Application Programming Interface 的简写,中文称为「应用程序编程接口」,简单理解一个 API 就是一个函数,这个函数提供了某一样特殊的能力,比如一个 API 是用来吐出某一个地理坐标下天气的能力,这就是一个 API,API 也常被成为 API 函数。API 通常暴露了一个系统的某一项能力。
在应用开发中,系统暴露的能力是以 SDK 的形式发行交给开发者的,所以 SDK 中一般封装了很多 API,这些 API 就对应着系统或平台的能力。
API 又分为「公有 API」和「私有 API」,公有 API 是系统以 SDK 形式暴露出来,对所有开发者可见。私有 API 一般是系统内部使用或者仅限于系统自带的一些应用程序使用,不允许应用程序开发者使用的。
计算机所有程序都是在内存中运行,内存越大,能并行跑的程序越多,电脑越流畅。
程序员做了很多个程序,质量良莠不齐,有的用的内存资源多,有的用的少,但这还不是最关键的。申请了内存资源,但却不还回来,导致内存被消耗殆尽,后面电脑产生了死机,蓝屏,运行缓慢,卡顿等各种奇怪现象,这种由于程序员申请了内存,但没有释放内存,导致内存一直处于被消耗的状态,称为「内存泄漏」。
MD5 英文翻译过来为:信息摘要算法第五版的缩写。它主要解决的问题是,对一个文件或字符串生成一个唯一标识,比如对abcde 生成 MD5 码:那世界上就真的只有 abcde 能生成这个码,MD5 算法保证了一个字符串生成的 MD5 码是唯一的,一旦唯一,就可以做很多事情了。
GUID 英文翻译过来叫全局唯一标识符,是一个 128 位的数字标识符,它能保证在一个计算机集群中,不会存在两个唯一的值。特别适合做身份或帐号。有很多产品要满足用户不登陆也要满足基本需求,比如一些新闻客户端,但是仍然需要对这一个用户服务好,建立这个用户的画像,数据模拟出这个用户的喜好与倾向,当然需要有这样一个用户身份和标识。
账号登陆的三个问题:
a.登录成功之后,前端做了啥?
就拿普通的客户端来说,登录成功之后,首先会收到一个回调。在处理「登录成功」的逻辑里,首先要做的就是把服务器返回来的「票据」存到硬盘上。票据拿到之后,理论上来讲就算登录成功了,你可以去用这个新鲜的票据去拉取用户的一些信息了。
b.下次自动登录,需要告诉服务器吗?
这个并不是必须的。前面也说了,第一拿到票据,就说明登录成功了,服务器上也有了相应的记录。下次用户启动 APP 或者打开你的页面,一检查硬盘发现票据还在,管他三七二十一,直接告诉用户已经登录成功了。用户其实并不知道这个登录成功是怎么回事儿的,只要你把头像,登录状态给他显示出来,他就认为已经登录了。所以登录的时候,只要前端有合法的票据,就算是「已经登录」的状态。这个和我们平时的认知是不一样的,一般都会认为自动登录时,会把保存下来的账号密码再去服务器校验一次,进而担心密码如果保存下来的话会不会被破解,实际上是没有必要的。
c.票据失效了怎么办?
票据都有保质期,当过了「过期时间」,不需要用户输入账号密码重新登录,你只需要拿着「刷新票据」向服务器换一个新的票据就好了。
当然,「刷新票据」也是有过期的,这个稍微长一点,一般是一个月。「刷新票据」过期之后,你就再也不能悄悄的去服务器换个新票据了,只能要求用户重新输入账号密码,重新走这个流程。所以你经常会遇到,一打开APP 提示你登录失效,就是「刷新票据」过期了。
「AR」(增强现实)主要是对真实世界的信息扩展,而「VR」则是旨在提供一个沉浸感极强甚至难以区分真假的「虚拟世界」。
网友评论