项目的相关疑点解答
solr1、简述 solrSolr 是一个 Java 开发的基于 Lucene 的企业级开源全文搜索平台,它采用的是反向索引,即从关键字到文档的映射过程。Solr 的资源以文档为对象进行存储,每个文档由一系列的字段构成,每个字段表示资源的一个属性。文档的字段可以被索引,以提供高性能的搜索效率。一般情况下文档都包含一个能唯一表示该文档的 id 字段?? 2、介绍一下 solr 的倒排索引讲述倒排索引之前,先来解释几个关于倒排索引的术语:
倒排索引的原理:假设文档集合包含五个文档,每个文档内容如图所示,在图中最左端一栏是每个文档对应的文档编号。我们的任务就是对这个文档集合建立倒排索引。 中文和英文等语言不同,单词之间没有明确分隔符号,所以首先要用分词系统将文档自动切分成单词序列。solr 中有一种分词器就是 IK Analyzer 中文分词器。这样每个文档就转换为由单词序列构成的数据流,为了系统后续处理方便,需要对每个不同的单词赋予唯一的单词编号,同时记录下哪些文档包含这个单词,在如此处理结束后,我们可以得到倒排索引。 简单总结:倒排索引它记录的是词,和词所存在的文档 id 的所有列表。通过这种索引结构的存储方式,其查询速率可想而知。 将文档内容用用 solr 自带分词器进行分词,然后作为索引,用二分法将关键字与排序号的索引进行匹配,静儿查找到对应文档。 3、查找算法和排序算法常用的排序算法的时间复杂度和空间复杂度
查找算法时间复杂度
4、为什么要使用 Solr当我们访问项目邮轮旅游模块的热门航线搜索时的时候,我们可以根据我们随意所想的内容输入关键字就可以查找到相关的内容。之所以能够如愿查找出来,是因为 solr 全文检索工具的实现。由于 solr 是基于 Lucene 实现的,而 Lucene 采用了次元匹配和切分词。举个例子:厦门-日本,Lucene 的切分词可以切分成:厦门、日本、厦日、日门等词,所以我们搜索的时候都是能够所搜得到的。solr 还有一种专门是切分中文的分词器叫 IKAnalyzer。 5、Solr 和 Elasticsearch 的区别?共同点:Solr 和 Elasticsearch 都是基于全文搜索引擎 Lucene 实现的。 不同点:
实时搜索:实时搜索是说用户对于搜索的结果是实时变化的。 传统搜索:传统搜索是从静态数据库中筛选出符合条件的结果,这种结果往往是不可变的、静态的。 Memcached许多 Web 应用都将数据保存到数据库中,应用服务器从中读取数据并在浏览器中显示。随着应用系统业务量的增长和用户的增加,对数据库的访问更加频繁和集中,服务器的压力越来越大、性能逐渐下降,会出现网页显示延迟甚至服务器崩溃等重大影响。这时就该是用 Memcached 了,通过减少数据库的访问次数,以提高动态 Web 应用的速度、提高可扩展性。 1、Memcached 简介memcached 是一个高性能的分布式内存缓存服务器,用于动态 Web 应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态 Web 的速度、提高可扩展性。memcached 基于一个存储键/值对的 HashMap。 2、Memcached 分布式算法(1) 余数哈希根据服务器台数的余数进行哈希,求得键的哈希值,再处理服务器台数,根据余数选择服务器。 缺点:当添加或者一处服务器时,缓存重组的代价太大。当添加服务器,要进行重哈希,会导致原来的服务器序号变了,下一次找不到访问数据,Memcached 命中率下降,那么就增加了数据库服务器的负载。 (2) 一致性哈希一致性哈希是将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数 H 的值空间是 0~(2^32 - 1) (即哈希值是一个 32 位的无符号整型),这个哈希空间为环。然后让每台机器站一个扇形空间。
举例: 3、Memcached 的数据清除算法LRU。每个 slab 会维护一个队列,刚插入的数据在队头,经常 get 的数据也会移动到队头,这样较老或者访问较少的数据在队尾。该算法从队尾开始淘汰。当 slab 分配不到足够的内存是,首先会检查队尾是否有过期数据,如果有的话会直接将其覆盖为新的对象,如果没有,会开始淘汰队尾的对象。 slab 是一个内存块,它是 memcached 一次申请内存的最新单位。slab 的大小固定为 1M (1048576 Byte),一个 slab 由若干个大小相对的 chunk 组成。每个 chunk 都保存了一个 item 结构体、一堆 key 和 value。 4、Memcached 内存管理机制参考于:Slab Allocator内存管理原理 Slab Allocation 的原理相当简单。它首先从操作系统申请一大块内存,并将其分割成各种尺寸的块 Chunk,并把尺寸相同的块分成组 Slab Class。其中,Chunk就是用来存储 key-value 数据的最小单位。每个 Slab Class 的大小,可以在 Memcached 启动的时候通过制定 Growth Factor 来控制。假定下图中 Growth Factor 的取值为 1.25,所以如果第一组 Chunk 的大小为 88 个字节,第二组 Chunk 的大小就为 112 个字节,依此类推。 当 Memcached 接收到客户端发送过来的数据时首先会根据收到数据的大小选择一个最合适的 Slab Class,然后通过查询 Memcached 保存着的该 Slab Class 内空闲 Chunk 的列表就可以找到一个可用于存储数据的Chunk。当一条数据库过期或者丢弃时,该记录所占用的 Chunk 就可以回收,重新添加到空闲列表中。从以上过程我们可以看出 Memcached 的内存管理制效率高,而且不会造成内存碎片,但是它最大的缺点就是会导致空间浪费。因为每个 Chunk都分配了特定长度的内存空间,所以变长数据无法充分利用这些空间。如图所示,将 100 个字节的数据缓存到 128 个字节的 Chunk 中,剩余的 28 个字节就浪费掉了。 5、描述一下 Memcached 的工作流程
Redis 和 Memcached:什么时候选择 Redis,什么时候选择 Memcached?有持久化需求或者对数据结构和处理有高级要求的应用,选择 Redis,其他简单的 key/value 存储,选择 Memcached。对于两者的选择需要看具体的应用场景,如果需要缓存的数据只是 key-value 这样简单的结构是,则还是采用 Memcached,它也足够的稳定可靠。如果涉及到存储、排序等一系列复杂的操作时,毫无疑问是 Redis。 Redis 和 memcached 有什么区别?为什么单线程的 Redis 比多线程的 memcached 效率要高得多(为什么 Redis 是单线程的但是还可以支撑高并发)?参考链接区别:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 分析我的java代码发送的HTTP流量的最佳方法?
- java – 运行可执行jar文件的最小unix权限是什么?
- 在javadoc编译期间如何禁止警告(代码库范围内)?
- java – 静态块使用中的抽象类
- java – TouchScreen诺基亚C5 -J2ME的命令操作按钮和滚动在
- Jdbc连接数据库基本步骤详解
- java 8:LongAdder和LongAccumulator是AtomicLong的首选吗?
- java – 有没有比调用Arrays.asList更好的替代List initali
- jodd-cache集锦
- Java各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,Jav
- Java实现BASE64编码和解码的方法
- java – 检测JDialog的大小调整
- Hibernate Criteria接口 setMaxResults方法:设置
- 在localhost上使用openid4java开发和测试混合goo
- Java OutOfMemory异常:加载zip文件时出现mmap错
- 如何评论已经包含/ *评论(Java)的整个代码块?
- java – 如何在我的Lucene应用程序中使用ASCIIFo
- java 中设计模式(值对象)的实例详解
- jsf – com.sun.faces.config.ConfigureListener
- Java Language Keywords(java中的关键字)