lucene和ElasticSearch有什么区别
Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
倒排索引了解吗
倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引
Mycat是什么?
MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。
rabbitmq和Kafka有什么区别
Kafka是一种分布式的,基于发布/订阅的消息系统,能够高效并实时的吞吐数据,以及通过分布式集群及数据复制冗余机制(副本冗余机制)实现数据的安全
常用Message Queue对比
RabbitMQ
RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正因如此,它非常重量级,更适合于企业级的开发。同时实现了Broker构架,这意味着消息在发送给客户端时先在中心队列排队。对路由,负载均衡或者数据持久化都有很好的支持
nginx如何搭建https
申请CA证书
Nginx配置
CA证书审核通过后,将证书下载到本地,会得到一个zip包,里面有xxx.key和xxx.pem两个文件。
在Nginx的安装目录下创建cert目录,并将xxx.key和xxx.pem拷贝到该目录中。注意:如果是自己生成的CSR文件,应该只有一个xxx.key文件,将该文件拷贝进去就可以了。
redis搭建的是什么版本的
Redis借鉴了Linux操作系统对于版本号的命名规则:
版本号第二位如果是奇数,则为非稳定版本(例如2.7、2.9、3.1),如果是偶数,则为稳定版本(例如2.6、2.8、3.0、3.2),
当前奇数版本就是下一个稳定版本的开发版本,例如2.9版本是3.0版本的开发版本,所以我们在生产环境通常选取偶数版本的Redis。
1.Redis2.6
Redis2.6在2012年正是发布,经历了17个版本,到2.6.17版本,相对于Redis2.4,主要特性如下:
1)服务端支持Lua脚本。
2)去掉虚拟内存相关功能。
3)放开对客户端连接数的硬编码限制。
4)键的过期时间支持毫秒。
5)从节点支持只读功能。
6)两个新的位图命令:bitcount和bitop。
7)增强了redis-benchmark的功能:支持定制化的压测,CSV输出等功能。
8)基于浮点数自增命令:incrbyfloat和hincrbyfloat。
9)redis-cli可以使用—eval参数实现Lua脚本执行。
10)shutdown命令增强。
11)重构了大量的核心代码,所有集群相关的代码都去掉了,cluster功能将会是3.0版本最大的亮点。
12)info可以按照section输出,并且添加了一些统计项
13)sort命令优化
2.Redis2.8
Redis2.8在2013年11月22日正式发布,经历了24个版本,到2.8.24版本,相比于Redis2.6,主要特性如下:
1)添加部分主从复制的功能,在一定程度上降低了由于网络问题,造成频繁全量复制生成RDB对系统造成的压力。
2)尝试性的支持IPv6.
3)可以通过config set命令设置maxclients。
4)可以用bind命令绑定多个IP地址。
5)Redis设置了明显的进程名,方便使用ps命令查看系统进程。
6)config rewrite命令可以将config set持久化到Redis配置文件中。
7)发布订阅添加了pubsub。
8)Redis Sentinel第二版,相比于Redis2.6的Redis Sentinel,此版本已经变成生产可用。
3.Redis3.0(里程碑)
Redis3.0在2015年4月1日正式发布,相比于Redis2.8主要特性如下:
Redis最大的改动就是添加Redis的分布式实现Redis Cluster。
1)Redis Cluster:Redis的官方分布式实现。
2)全新的embedded string对象编码结果,优化小对象内存访问,在特定的工作负载下载速度大幅提升。
3)Iru算法大幅提升。
4)migrate连接缓存,大幅提升键迁移的速度。
5)migrate命令两个新的参数copy和replace。
6)新的client pause命令,在指定时间内停止处理客户端请求。
7)bitcount命令性能提升。
8)cinfig set设置maxmemory时候可以设置不同的单位(之前只能是字节)。
9)Redis日志小做调整:日志中会反应当前实例的角色(master或者slave)。
10)incr命令性能提升。
4.Redis3.2
Redis3.2在2016年5月6日正式发布,相比于Redis3.0主要特征如下:
1)添加GEO相关功能。
2)SDS在速度和节省空间上都做了优化。
3)支持用upstart或者systemd管理Redis进程。
4)新的List编码类型:quicklist。
5)从节点读取过期数据保证一致性。
6)添加了hstrlen命令。
7)增强了debug命令,支持了更多的参数。
8)Lua脚本功能增强。
9)添加了Lua Debugger。
10)config set 支持更多的配置参数。
11)优化了Redis崩溃后的相关报告。
12)新的RDB格式,但是仍然兼容旧的RDB。
13)加速RDB的加载速度。
14)spop命令支持个数参数。
15)cluster nodes命令得到加速。
16)Jemalloc更新到4.0.3版本。
5.Redis4.0
可能出乎很多的意料,Redis3.2之后的版本是4.0,而不是3.4、3.6、3.8。
一般这种重大版本号的升级也意味着软件或者工具本身发生了重大改革。下面是Redis4.0的新特性:
1)提供了模块系统,方便第三方开发者拓展Redis的功能。
2)PSYNC2.0:优化了之前版本中,主从节点切换必然引起全量复制的问题。
3)提供了新的缓存剔除算法:LFU(Last Frequently Used),并对已有算法进行了优化。
4)提供了非阻塞del和flushall/flushdb功能,有效解决删除了bigkey可能造成的Redis阻塞。
5)提供了memory命令,实现对内存更为全面的监控统计。
6)提供了交互数据库功能,实现Redis内部数据库的数据置换。
7)提供了RDB-AOF混合持久化格式,充分利用了AOF和RDB各自优势。
8)Redis Cluster 兼容NAT和Docker。
Redis为什么单线程还处理速度快?
完全基于内存,绝大部分请求是纯粹的内存操作,非常快速
数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的
采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
使用多路I/O复用模型,非阻塞IO
soa和微服务的区别?
微服务剔除SOA中复杂的ESB企业服务总线,所有的业务智能逻辑在服务内部处理,使用Http(Rest API)进行轻量化通讯
SOA强调按水平架构划分为:前、后端、数据库、测试等,微服务强调按垂直架构划分,按业务能力划分,每个服务完成一种特定的功能,服务即产品
SOA将组件以library的方式和应用部署在同一个进程中运行,微服务则是各个服务独立运行。
传统应用倾向于使用统一的技术平台来解决所有问题,微服务可以针对不同业务特征选择不同技术平台,去中心统一化,发挥各种技术平台的特长
SOA架构强调的是异构系统之间的通信和解耦合;(一种粗粒度、松耦合的服务架构)
微服务架构强调的是系统按业务边界做细粒度的拆分和部署。
单机系统演变为分布式系统,会涉及到哪些技术的调整?请从前面负载到后端详细描述。
1.输入设备的变化
(1)接收其他节点传来的信息时,该节点可以看做是输入设备;<br /> (2)传统意义上的人机交互的输入设备
2.输出设备的变化
(1)当系统中结点向其他节点传递信息时,该节点可以看作是输出设备。<br /> (2)传统意义上人机交互设备
3.控制器的变化
从传统的单机系统中,控制器指代的就是CPU中的控制器。但是在分布式系统中,我们要介绍的控制器不是像CPU中的控制器的电子元件,而是分布式系统中的控制方式。分布式系统中的控制器的主要作用是协调或控制节点之间的动作和行为。
分布式控制器则有五种:
通过中间的硬件或软件进行负载均衡地转发请求则是属于透明代理的方式,这种方式对于发起请求和处理请求的一方都是透明的->发起请求的一方以为是中间的代理提供了服务。处理请求的一方会因为是中间请求的服务。所以两个方都不需要知道对方的实现细节,只需要知道中间透明代理的地址就好了。
(1)硬件负载均衡器
(2)软件负载均衡器LVS
透明代理方式存在的两个不足:
(1)增加网络上流量和延迟的开销,因为中间控制器的存在而增加了一次代理的转发
(2)因为代理服务器的存在于每个请求的必经之路上,如果一旦出现问题,我们就需要考虑代理服务器的热备份,但是在切换过程中,当时没有完成的请求还是会受到影响。
透明代理最大的有点就是:直观,简单
(3)名称服务
名称服务与透明代理最大的区别在于:请求发起方和请求处理方哲两个集群中间没有代理服务器这样设备的存在,而是在请求发起方和请求处理方的直接连接。在请求发起方和请求处理方的直接连接的外部,有一个”名称服务“的角色,它的作用主要有两个,一个是收集提供服务器的地址信息另外一个就是提供这些地址给请求的发起方。名称服务器只起到了地址交换的作用,在发起请求的机器上,需要根据从名称服务得到的地址进行负载均衡的工作。相当与原本属于透明代理中的负载均衡器的职责被放到了名称服务和请求发起方上了
名称服务的优点:相比透明代理减少了网络开销,而且并不是在请求的必经之路上,提升了整个系统的鲁棒性。
缺点:升级代码较为困难
(4)规则服务器
规则服务和名称服务是类似的,因为请求发起服务器和请求处理服务器也是直接连接的。但与名称服务提供请求处理的服务器的地址方式不同,规则服务提供了一套规则给请求发起者,让请求发起者通过这套规则去选择请求处理者。
规则服务器的缺点是显而易见的:很容易出现负载分配不均衡
(5)Master Worker
存在一个Master节点来管理任务,由Master把任务分配给不同的Worker去进行处理。有意思的是,Master会在自身直接根据规则直接选择一个请求处理服务器的地址并且返回给请求发起者。
4.运算器的变化
在单机系统中,运算器是具体的电子元件,而在分布式系统中,运算器是由多个节点来组成的。单机的计算能力有上限,而分布式系统中的运算器是运用斗个节点的计算能力来协同完成整体的计算任务。多个节点在控制器的配合下对外提供服务,构成了分布式系统中的运算器。
5.存储器的变化
在单机系统中,我们一般把存储器分为内存和外存,内存的数据在机器断电,重启或OS崩溃的情况下会丢失,而外存是用于长久保存数据的。<br /> 在分布式系统中,所有的请求发起方通过对控制器的访问来获得对存储器的地址,逻辑上吧多个存储服务器看成是一个存储服务器<br />**持久化方式有哪些?**<br />1. plist属性列表方式<br />2. 偏好设置 本质还是plist属性列表的方式进行存储 Userdefault<br />3. NSCoding<br />NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法。前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码。<br />4. sqlite<br />SQLite:采用SQLite[数据库](http://lib.csdn.net/base/mysql)来存储数据。SQLite作为一中小型数据库,应用[**iOS**](http://lib.csdn.net/base/ios)中,跟前三种保存方式相比,相对比较复杂一些。<br /> <br />**消息队列有什么作用?(慢慢消费。秒杀,消峰限流)**<br />异步处理 应用解耦 流量削锋 日志处理 消息通讯<br />**Redis为什么单线程还处理速度快?**<br />完全基于内存,绝大部分请求是纯粹的内存操作,非常快速<br />数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的<br />采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗<br />使用多路I/O复用模型,非阻塞IO<br />