FastDFS是一个轻量级分布式文件系统, |
|
使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务 |
|
FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。 |
|
跟踪器主要做调度工作,在访问上起负载均衡的作用。 |
|
存储节点存储文件,完成文件管理的所有功能:就是这样的存储、同步和提供存取接口,FastDFS同时对文件的metadata进行管理。 |
|
所谓文件的meta data就是文件的相关属性,以键值对(key valuepair)方式表示,如:width=1024,其中的key为width,value为1024。 |
|
文件metadata是文件属性列表,可以包含多个键值对。 |
|
|
|
跟踪器和存储节点都可以由一台或多台服务器构成。(通常由两台老大跟踪器主机和备机和4台成对出现的小弟存储节点构成的)。 |
|
|
|
跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。(热部署)可以根据服务器的压力情况随时增加或减少。 |
|
具有了 冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能优点 |
|
|
|
|
|
shiro权限校验: |
|
Apache Shiro是Java的一个安全框架,相对于spring Security来说,功能削减了,但是入场不需要那么多的功能, |
|
所以一般权限校验shiro足够了 |
|
最简单的一个Shiro应用: |
|
1、应用代码通过Subject来进行认证和授权,而Subject又委托给SecurityManager;而Shiro不提供维护用户/权限, |
|
而是通过Realm让开发人员自己注入。 |
|
2、所以我们需要给Shiro的SecurityManager注入Realm,从而让SecurityManager能得到合法的用户及其权限进行判断。 |
|
Shiro的核心部分是SecurityManager,它负责安全认证与授权。Shiro本身已经实现了所有的细节,用户可以完全把它当做一个黑盒来使用。 |
|
SecurityUtils对象,本质上就是一个工厂类似Spring中的ApplicationContext。 |
|
Subject它是你目前所设计的需要通过Shiro保护的项目的一个抽象概念。通过令牌(token)与项目(subject)的登陆(login)关系,Shiro保证了项目整体的安全。 |
|
|
|
solr: |
|
solr是一个基于lucence的全文检索框架,不同于lucence是一堆jar,而solr是应用程序,是一个独立的企业级搜索应用服务器, |
|
solr整体上可以分为建立索引(将用户需要存储的词组或者段落进行分解成基本词元存储到solrhome中的data中)和搜索索引(通过用户搜索的词再solrhome中进行反向查询结果)的过程; |
|
这种对外提供类似于webservice的api接口,可同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。 |
|
结合AK分词器,进行对中文的切分, |
|
有效降低频繁访问数据库对数据库造成的压力。 |
|
|
|
redis: |
|
redis是一种key-value键值对形式的非关系型数据库, |
|
//redis是一个基于单进程单线的完全存在与内存中; |
|
//多余慢查询容易造成线程阻塞,因为是单线程所以采用轮巡机制进行处理多个客户端来的请求, |
|
//redis是一个基于单进程单线的完全存在与内存中;key-value键值对的缓存服务器; |
|
// 多余慢查询容易造成线程阻塞, |
|
// 因为是单线程所以采用轮训机制老保证同时处理多个客户端来的请求, |
|
redis有四种数据类型 |
|
String incr主键自增1 decr,主键自减1 在商品的添加时redis中就使用了这个 |
|
list 有序可重复 |
|
set 无序不可重复 hmset(商品sku存储是用到) treeset |
|
storeset 其中和set的区别是set无序,他有序 |
|
jedis的持久化 |
|
RDB和AOF |
|
其中RDB是快照的形式进行备份的,快速,但是容易丢失两次备份中间的数据,服务器宕机时,容易丢失数据 |
|
AOF是一日志形式追加进去的备份的,速度相对慢,但是相对RDB数据安全性较高,即使服务器宕机,也不会造成较大的损失。 |
|
|
|
优点: |
|
1 由于是全内存操作,所以读写性能很好,可以达到10w/s的频率。公司有项目使用redis,目前的访问频率是80w/s,通过适当的部署,线上运行一切ok。 |
|
2 支持数据持久化,支持AOF和RDB两种持久化方式 |
|
3 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。 |
|
4 数据结构丰富:除了支持string类型的value外还支持string、hash、set、sortedset、list等数据结构。 |
|
缺点: |
|
1 Redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。 |
|
2 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。 |
|
3 redis的主从复制采用全量复制,复制过程中主机会fork出一个子进程对内存做一份快照,并将子进程的内存快照保存为文件发送给从机,这一过程需要确保主机有足够多的空余内存。若快照文件较大,对集群的服务能力会产生较大的影响, |
|
而且复制过程是在从机新加入集群或者从机和主机网络断开重连时都会进行,也就是网络波动都会造成主机和从机间的一次全量的数据复制,这对实际的系统运营造成了不小的麻烦。 |
|
4 Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。 |
|
|
|
|
|
FreeMark页面静态化 |
|
相对于动态页面,静态页面具有页面跳转速度快,无延时等特点,能增加用户的体验,所有在开发是尽量使用静态页面,而不使用动态页面, |
|
对于一些页面本来就是动态页面但是里面数据很少更改。比如电商中的商品详情页,一旦商品上架,一般不会进行更改,这个时候就可以考虑将其进行静态化处理, |
|
freemark采用的是 模板 + 数据模型 = 输出 的形式 , |
|
将页面中所需要的样式写入到 FreeMarker模板文件中,然后将页面所需要的数据进行动态绑定并放入到Map中,然后通过FreeMarker的模板解析类process()方法完成静态页面的生成。 |
|
//流的写入过程 指定编码UTF-8 |
|
out = new OutputStreamWriter(new FileOutputStream(f), "UTF-8"); |
|
//利用配置文件指定模板路径 读取具体模板对象 |
|
Template template = conf.getTemplate("productDetail.html"); |
|
//将模板+对象进行静态化输出 |
|
template.process(root, out); |
|
|
|
|
|
同步 重要在于共享数据的多线程访问: |
|
同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息, |
|
那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去; |
|
异步是指进程不需要一直等下去, |
|
而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。 |
|
|
|
异步 Java AIO: |
|
|
|
Java NIO: |
|
NIO是基于块(Block)的,它以块为基本单位处理数据 (硬盘上存储的单位也是按Block来存储,这样性能上比基于流的方式要好一些) |
|
为所有的原始类型提供(Buffer)缓存支持 |
|
增加通道(Channel)对象,作为新的原始 I/O 抽象 |
|
支持锁(我们在平时使用时经常能看到会出现一些.lock的文件,这说明有线程正在使用这把锁,当线程释放锁时,会把这个文件删除掉,这样其他线程才能继续拿到这把锁)和内存映射文件的文件访问接口 |
|
提供了基于Selector的异步网络I/O |
|
|
|
数据库死锁: |