发表于: 2017-09-26 21:59:29

3 901


今天完成的事情:

整理任务知识点

memcache和redis,这两个都属于NoSQL,我们用到的都是它们的缓存机制,先来说缓存吧

缓存算是现代计算机中的一种机制,一般计算机都有L1缓存,L2缓存,那么这是什么意思呢?

计算机的CPU对RAM(内存)的访问大约在60纳秒内完成,这已经很快了,但和cpu的处理速度比还是差非常多。我们在主板上增加容量很小但速度很快的SRAM存储器,它的访问速度大约在30纳秒,它比内存快了一倍,这就叫做L2缓存。我们在CPU上直接构造容量更小但速度更快的存储器,那么系统将直接以CPU的速度进行访问,这就是L1缓存。某些CPU又带有两级缓存,这种情况下SRAM就变成了L3缓存。

还有一种说法,内存可以作为速度更慢的硬盘的缓存,而硬盘可以作为最慢的介质(互联网连接)的缓存。

关于缓存的一些速度对比

L1缓存——以全速微处理器速度进行的存储器访问(10纳秒,大小为4-16千字节)

L2缓存——SRAM类型的存储器访问(大约20到30纳秒,大小为128-512千字节)

内存——RAM类型的存储器访问(大约60纳秒,大小为32-128兆字节)

硬盘——机械装置,较慢(大约12毫秒,大小为1-10千兆字节)

互联网——极慢(在1秒和3天之间,大小不限)

数据库缓存特性:

1、性能优越

相比于去数据库中查找,缓存基本上是储存在内存的,访问速度快

2、应用场景

针对数据库的CRUD,缓存技术主要体现在“查”上。在大多数情况下数据库层次压力80%来自查询。缓存可以大大减轻数据库压力,减少数据库操作。

3、数据一致性

在大多数应用缓存的场景中,对数据一致性的要求都非常低,容忍度可以是5分钟,也可以是5小时。如果一定要求实时性的数据,那么就不应该加缓存。

4、高可用

缓存为数据库抵挡了很多的压力,同时提供了良好的访问速度,并且自身不容易崩溃。

再来说一下NoSQL和关系型数据库

传统关系型数据库有很多,例如MySQL,Oracle,Microsoft SQL Server

关系型的意思就是采用了关系模型来构建数据的数据库

这里关系模型就是指二维表格模型,而关系型数据库就是由二维表及其之间的联系所组成的一种数据组织。

优点:

1、易于理解,贴近逻辑世界

2、使用方便,用SQL语句进行操作

3、易于维护,数据完整性减少了数据不一致的概率

缺点:

1、高并发读写能力差,由于数据存储在硬盘上,硬盘I/O就是瓶颈

2、海量数据读写差,在一张包含海量数据的表中进行CRUD效率是非常低的

3、低扩展性和可用性,数据库是最难进行横向扩展的,当要进行数据库扩容之类操作的时候,往往需要停机维护和数据迁移

4、对web网站来说,一些不需要的特性:

事务一致性:关系型数据库在对事务一致性的维护有很大的开销,而网站中对数据一致性要求很低

读写实时性:同理,对很多web应用来说,数据在短时间内不一致是可以忍受的

复杂的SQL,多表联查:大数据量的web系统都很忌讳多个大表的关联查询,以及复杂的数据分析类型的复杂SQL报表查询,往往更多的是简单的单表主键查询,SQL功能极大的弱化了。

NoSQL

菲关系型数据库,听名字的意思是没有关系的数据库,其实正确来说应该是“Not Only SQL”

不只是SQL

数据库事务必须具备的ACID特性,Atomic原子性,Consistency一致性,Isolation隔离性,Durability持久性。这些NoSQL可以都不具备。

非关系型数据库提出另一种理念,例如,以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,这样就不会局限于固定的结构,可以减少一些时间和空间的开销。

优点:

1、成本低,现在的NoSQL基本都是开源软件,部署简单

2、查询速度快,将数据储存在缓存中

3、扩展性能好

缺点

1、不支持SQL语句

2、不提供关系型数据库对事务的处理

区别:

这两种基本上互为优缺点,主要在于应用的场景不一样

在web网页应用中,尤其是SNS应用中,传统关系型数据库的性能就遇到了瓶颈。首先对一致性要求就很低,两个用户看到的内容不一样是可以容忍的,关系型数据库最大的特性就此无用武之地。而为了维护一致性关系型数据库付出的代价是读写性能较差,像微博,facebook这样的网站对高并发读写能力要求很高。关系型数据库固定的表结构导致其扩展性能差,SNS网站的升级和功能增加是很频繁的,每一次变动基本都以为着数据结构的巨大变动,这一点关系型数据库也难以胜任。

而在一些需要海量数据持久化储存,或者对数据一致性要求很高的场景,比如银行,就需要使用关系型数据库。

再来是memcache和redis

memcache只支持简单的数据结构,不能进行数据持久化,但它采用的是多线程机制,可以同时处理多个请求。

redis支持多种复杂数据结构,可以数据硬盘持久化,它是单线程结构,自己封装了一个简单的事件处理框架。

在处理小规模数据redis的性能要高于memcache,而在数据量很大时,redis略有逊色。但因为redis采用异步非阻塞I/O模式,差别不大。

实际上同步与异步是针对应用程序与内核的交互而言的。同步过程中进程触发IO操作并等待或者轮询的去查看IO操作是否完成。异步过程中进程触发IO操作以后,直接返回,做自己的事情,IO交给内核来处理,完成后内核通知进程IO完成。
阻塞和非阻塞,简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,否则就可以理解为非阻塞。

Nginx负载均衡

1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 
2、指定权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 
3、IP绑定 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。 
5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 

ip_hash

采用了hash算法,即散列算法。就是把任意长度的输入转换成固定长度的输出,该输出就是散列值。之前我研究过MD5算法,就是一种hash算法。若结构中存在和关键字K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数(Hash function),按这个事先建立的表为散列表对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称碰撞。

HTTP和HTTPS

HTTP协议用于web浏览器和网站服务器之间传递信息,并且是以明文方式发送,没有任何的加密措施。HTTPS就是安全版的HTTP协议,加上了一层SSL。HTTPS协议的主要作用可以分为两类,一种是建立了一个信息安全通道,来保证数据传输的安全性;另一种是确认网站的真实性。



返回列表 返回列表
评论

    分享到