Sphinx搜索引擎的介绍

生活中的单例

中国(China),位于东亚,是一个以华夏文明为主体、中华文化为基础,以汉族为主要民族的统一多民族国家,通用汉语。中国疆域内的各个民族统称为中华民族,龙是中华民族的象征。古老的中国凭借自身的发展依旧美丽的屹立于东方民族之林,闪耀着她动人的光彩,世界上只有一个中国,任何部分都是祖国不可分割的一部分,今天我们的设计模式就从伟大的祖国开始说起---单例模式。

详解单例模式

单例模式是什么?跟我们的祖国有着怎样的关系呢?首先我们来看一下单例,从“单例”字面意思上理解为—一个类只有一个实例,所以单例模式也就是保证一个类只有一个实例的一种实现方法。官方定义:确保一个类只有一个实例,并提供一个全局访问点。在学习的过程中,我们需要把握三个主要的关键点,一、某个类只能有一个实例;二、它必须自行创建这个实例;三、它必须自行向整个系统提供这个实例。来看一下单例模式的结构图:

       实现方法

一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。

代码实现

第一版(基本代码)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;  

namespace 单例模式基本模型
{
    class Program
    {
        //客户端
        static void Main(string[] args)
        {
            Singleton Instance1 = Singleton.GetInstance();
            Singleton Instance2 = Singleton.GetInstance();  

            if (Instance1 == Instance2)
            {
                Console.WriteLine("两个实例是一模一样的实例。");
            }  

        }
    }
    class Singleton
    {
        private static Singleton instance;  

        //构造方法采用private,外界便无法用new创建该类的实例
        private Singleton()
        { }  

        //该方法提供一个获得该类实例的全局访问点,是唯一的
        public static Singleton GetInstance()
        {
            //如果实例不存在,则返回一个新实例,否则返回原实例。
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
}  

但是上述代码存在一些缺点,线程不安全,多线程情况下,多个线程同时访问Singleton,调用GetInstance()方法,同时判断instance==null,得到真值,导致创建多个实例,这不符合单例模式的基本原则。那我们要怎么办捏,为了解决以上缺点,我们来看改进的代码(一下版本的)

第二版(多线程时的单例)

class Singleton
    {
        private static Singleton instance=null;
        //创建一个静态只读的进程辅助对象
        private static readonly object ProgressLock = new object();  

        //构造方法采用private,外界便无法用new创建该类的实例
        private Singleton()
        { }  

        //该方法提供一个获得该类实例的全局访问点,是唯一的
        public static Singleton GetInstance()
        {
            lock (ProgressLock)
            {  

                if (instance == null)
                {
                    instance = new Singleton();
                }
            }  

            return instance;
        }
    }  

每次调用GetInstance()方法都需要lock,这种做法是会影响性能的,所以我们需要对这个类进行改良。

第三版(双重锁定)

class Singleton
    {
        private static Singleton instance=null;
        //创建一个静态只读的进程辅助对象
        private static readonly object ProgressLock = new object();  

        //构造方法采用private,外界便无法用new创建该类的实例
        private Singleton()
        { }  

        //该方法提供一个获得该类实例的全局访问点,是唯一的
        public static Singleton GetInstance()
        {
            if (instance == null)
            {
                lock (ProgressLock)
                {  

                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }  

            return instance;
        }
    }

上述构造方式只有在实例未被创建的时候才加锁,避免了每次调用GetInstance()方法都加锁损失性能的问题。但是相对于后面的做法,她仍然有着美中不足的地方。

第四版(静态初始化)

//sealed关键字防止派生
    public sealed class Singleton
    {
        //在第一次引用类的成员时创建实例,公共语言运行库负责处理变量的初始化
        private static readonly Singleton instance=new Singleton();  

        //构造方法采用private,外界便无法用new创建该类的实例
        private Singleton()
        { }  

        public static Singleton GetInstance()
        {
            return instance;
        }
    }  

这种方式是在自己被加载时就将自己实例化,称为饿汉式。由于有.NetFramework 进行初始化,所以我们对实例化机制的控制权较少,没办法和其他实现一样实现延迟初始化。在上面三种形式中,您能够在实例化之前使用非默认的构造函数或执行其他任务。

  第五版(完全延迟加载实例化)

public sealed class Singleton
 {
        private Singleton()
        {
        }
        public static Singleton GetInstance()
        {
            return Nested.instance;
        }
        class Nested
        {
            static Nested()
            {
            }
            internal static readonly Singleton instance = new Singleton();
        }
    }
        

  写在后面的话

前三版编程方法,因为会面临多线程访问安全的问题,需要做双重锁定这样的处理才可以保证安全,但能够在实例化之前使用非默认的构造函数或执行其他任务,第四版(静态初始化方式)是类一加载就实例化的对象,占用系统资源,所以到底实用哪一种方式,视具体情况而定.

Sphinx搜索引擎的介绍

时间: 2024-08-26 15:38:41

Sphinx搜索引擎的介绍的相关文章

【搜索引擎Jediael开发笔记1】搜索引擎初步介绍及网络爬虫

详细可参考 (1)书箱:<这就是搜索引擎><自己动手写网络爬虫><解密搜索引擎打桩实践> (2)[搜索引擎基础知识1]搜索引擎的技术架构 (3)[搜索引擎基础知识2]网络爬虫的介绍 (一)搜索引擎的开发一般可分为以下三大部分 1.数据采集层:一般使用爬虫获取互联网的数据,重要的开源项目有Heritrxi 2.数据分析处理层:将从互联网上获取到的数据进行提取归类.分词.语义分析得出索引得内容,等待用户查询使用,重要的开源项目有Lucene 3.视图层:也用户的交互界面,如

搜索引擎技术介绍

引言 早些时候分享过一份关于搜索引擎技术的PPT,这篇文章基本上是基于原来框架,在内容上做了一些改进和扩充. 主要是对搜索引擎技术的各方面做一些简单的介绍和入门的指引. 索引 1. 需求与历史 2. 搜索产品简单介绍 3. 搜索技术 3.1 系统 3.2 数据 3.3 算法 4. 开源方案 5. 现状与未来 需求与历史 搜索引擎的诞生源自互联网最根本的用途之中的一个:信息获取.在搜索引擎出现之前,互联网缺少入口,用户往往须要自己记住实用的站点和网页. 为了满足这样的需求,最早的"搜索引擎&quo

[转载] 搜索引擎技术介绍

转载自http://backend.blog.163.com/blog/static/202294126201252872124208/ 需求与历史 搜索引擎的诞生源自互联网最根本的用途之一:信息获取.在搜索引擎出现之前,互联网缺少入口,用户往往需要自己记住有用的网站和网页. 为了满足这种需求,最早的“搜索引擎”,即分类目录浏览式的引擎便出现了,Yahoo就是其中的代表. 当时只是把一些有用的网站通过分类的方式手工组织起来,便于用户找到有用的信息. 能够手工组织也是基于早年整个互联网的网站数量也

sphinx搜索引擎优化及测试

原创,转载请务必保留作者及本文出处(连接形式). 2年前工作中的内容,已成过眼烟云,分享一下,欢迎交流. 1.之前的优化效果 之前对sphinx线程处理,网络IO做了很多优化(netty.epoll.libevent),索引部分也做了优化,从目前测试结果来看,性能提升已经到了瓶颈,尤其是全部搜索,线程调度,网络 IO优化对于这种查询方式帮助很小.对于单节点性能提升,还得从索引本身查询算法入手优化.sphinx的属性过滤对性能本身有很大影响,但是优化空间不 是很大,读取的属性是离散的,不像索引是可

sphinx搜索引擎索引结构优化

原创,转载请以连接形式标明作者和出处! 2年前工作中的内容,已成过眼烟云,分享一下,欢迎交流. sphinx的倒排索引采用紧凑的磁盘存储方式,其docid采用增量压缩方式存储与.spd文件中. sphinx2.0.1官方版本的.spd文件有三种数据结构: 结构1>[ DocID + (Attr) + HitPosList_Offset + FieldCount + HitCount ] + [-] + - DocID:4或8字节, 增量压缩值(与前一个DocID的差值) (Attr):属性内容,

Sphinx全文索引详细介绍及其安装例子

Sphinx全文索引(要lanmp环境哦) 比如:你要搜索乐杨俊,能后通过php程序去sphinx创建的索引表里面搜索相应的记录,sphinx找到后在去MySQL数据库里面select * from nameTable where name='乐杨俊':搜索速度大大提升---sphinx是夹在PHP和MySQL中间的 详细的走整理出了个文档,在我的资源里面去下载即可,过程很详细,及其PHP操作sphinx的案例

全文搜索引擎 Elasticsearch 介绍

全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选. 它可以快速地储存.搜索和分析海量数据.维基百科.Stack Overflow.Github 都采用它. Elastic 的底层是开源库 Lucene.但是,你没法直接用 Lucene,必须自己写代码去调用它的接口.Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用. 原文地址:https://www.cnblogs.com/jacksonxi

阿里搜索引擎技术介绍

iSearch4性能优化之路.pptx iSearch5商品搜索特色功能.pptx iSearch5实现原理之实时搜索.pptx isearch5性能优化.pptx iSearch5调度系统.pptx iSearch演变历程.pptx OpenSearch.pptx SP-技术报告.pptx 广告实时引擎.pptx 搜索离线生产集群中的流计算.ppt 淘宝搜索业务架构优化.pptx 淘宝搜索离线系统介绍-技术报告.pptx

[搜索引擎]Sphinx的介绍和原理探索

What/Sphinx是什么 定义 Sphinx是一个全文检索引擎. 特性 索引和性能优异 易于集成SQL和XML数据源,并可使用SphinxAPI.SphinxQL或者SphinxSE搜索接口 易于通过分布式搜索进行扩展 高速的索引建立(在当代CPU上,峰值性能可达到10 ~ 15MB/秒) 高性能的搜索 (在1.2G文本,100万条文档上进行搜索,支持高达每秒150~250次查询) Why/为什么使用Sphinx 遇到的使用场景 遇到一个类似这样的需求:用户可以通过文章标题和文章搜索到一片文