高并发和缓存
高并发:N个客户端同时访问,就会产生一个高并发;
高并发(分情况):
查询:加入缓存(数据库压力转移),负载均衡(同一份数据放到多台服务器上,当您访问的时候,我会把你路由在每台机器上,平均的让你把流量导到某台机器上,然后由他直接和你对应执行 ,我把一台机器上处理的任务,平均的分布在N台机器上进行处理),radis(基于内存的数据库,内存速度快,容易丢数据,空间小,比较贵)
插入更新:消息队列msmq(流量销分)
查询:加入缓存(数据库压力转移),负载均衡(同一份数据放到多台服务器上,当您访问的时候,我会把你路由在每台机器上,平均的让你把流量导到某台机器上,然后由他直接和你对应执行 ,我把一台机器上处理的任务,平均的分布在N台机器上进行处理),radis(基于内存的数据库,内存速度快,容易丢数据,空间小,比较贵)
插入更新:消息队列msmq(流量销分)
硬件:把硬盘换成SSD,固态硬盘,建立硬盘矩阵,同时多个硬盘,类似硬盘的分布式,N个硬盘同时写同时读,一个硬盘读的慢,十个硬盘读的快,硬盘的高速阵列;
队列特点:先进先出;
分布式(秒杀):把任务分别放到不同计算机上,进行执行,进而达到更快的执行任务的目的;
缓存:缓存主要是为了提高数据的读取速度,访问这条数据,先在缓存中查找,没有去数据库查找,找到后插入缓存中。
缓存弊端:数据更新不及时,如果缓存中数据存储量小,去数据库的访问量大,有可能会引发缓存穿透。
缓存弊端:数据更新不及时,如果缓存中数据存储量小,去数据库的访问量大,有可能会引发缓存穿透。
缓存穿透:你访问的数据都不在缓存当中,缓存还没有建立,刚启动服务器,你访问的每一个都会不经过缓存都访问到数据库上,这样会引发一个巨大的问题假死;
缓存穿透解决:提前把数据加载到缓存当中,如果我不知道那些需要加载到缓存当中,我可以预先把10%的数据加载到缓存当中,压力就会下来,缓存预加载;
sql优化:减少表join,查询的时候指定列,查询*,添加索引;
大数据:数据库中大量的数据
大数据解决:分表分库(按业务逻辑分,表分区,hash分表也叫hashmap把主键通过hash算法转化为大数然后取模对应的数量,服务器数量,表数量,来命中相应的服务器,或者相应的表),在适当的时候引入nosql数据库(hbase,mongodb),分服务,建立集群
关系型数据库如何解决大数据:分表分库,分服务,分服务器(建立集群),表分区(把一个表分为多个物理的区域,进行存储)
大数据:数据库中大量的数据
大数据解决:分表分库(按业务逻辑分,表分区,hash分表也叫hashmap把主键通过hash算法转化为大数然后取模对应的数量,服务器数量,表数量,来命中相应的服务器,或者相应的表),在适当的时候引入nosql数据库(hbase,mongodb),分服务,建立集群
关系型数据库如何解决大数据:分表分库,分服务,分服务器(建立集群),表分区(把一个表分为多个物理的区域,进行存储)
hashtable:也叫散列;
编码的时候:常用的hash算法,比如在md5加密,把字符串转化为一个大的数,MD5加密就是一种hash算法,把你的字符串进行不可逆转换为一颗大数,转换为一个大的文本,然后通过一个指定的问题转换为指定长度的字符串,md5是一种hash算法;
hashmap:hash取模这个算法叫做hashmap算法,hash路由根据hash命中对应的存储空间,键值对,根据你的key极快的找到你的value,分表分库,比如这个表有一亿条数据,有主键,主键是不重复的,是唯一的,我根据主键,然后采取一定的hash算法,把它转化成一个大数,我觉得一亿条数据对数据库太大了,我把它分为一百个表,一个表分一百万条,查询速度就会变快,存的时候,每个表都有一个主键,我把主键转成hash算法把它转为一个大数,比如用户主键lzh,通过特殊hash算法转为1008,然后进行取模,结果为8,它存在第八个表,然后利用lzh再查,一百万条数据查询速度是很快的,瞬间就命中,这个叫做hash分表,这个和业务无关;
hash多个同时命中一个:根据hash算法,一万条数据,有好几个命中同一个空位,如果有一个命中后存在它里面,如果有第二个,就使用链表,后面存前面的key值,如此类推,如果链表达到一定长度,性能影响,hashtable就会扩容;
equals比较:每个对象都会生成一个hashcode,对象与对象比较用hashcode,判断是否相等;
红黑树和索引有关,B+树下面就是红黑树
索引碎片产生的原因:每添加一条数据,添加的时间长,索引就会重排,重排的时候会引发索引碎片,增删都会引发索引碎片。
hadoop:超大型数据集的应用程序,是一个框架;
缓存穿透:查询一个并不存在的数据,然后把压力施加给数据库;