一种缓存系统数据存取方法
技术领域
本发明涉及一种数据存取方法,尤其是涉及一种缓存系统数据存取方法。
背景技术
信息技术的发展便利了人民的生活,改变了人们的生活方式,人们产生的数据量正在日益膨胀。对于传统的数据存储系统来说,快速处理这些庞大的数据正在变得越来越困难,大量的数据会导致处理能力有限的存储系统无法应付,产生的结果便是耗时巨大,难以满足人们对快速处理数据的要求,因此需要寻找新的技术改进,以提高存储系统处理大量数据的能力。
如今越来越多的数据存储系统开始使用缓存技术。缓存能够快速响应用户写入、读取数据的操作,是数据存储系统与用户交换数据的中间介质,它可分为写缓存和读缓存。写缓存用于接收用户发来的数据,用户将数据发送给写缓存后,数据存储系统便将写缓存中的数据逐步接收并写入到磁盘中。读缓存用于让用户能快速访问存储系统中的数据,存储系统把用户经常需要获取的数据写入读缓存中,用户便可直接读取读缓存中的数据,而无需直接和底层存储系统打交道。但当多个用户同时发送大量数据给数据存储系统时,存储系统如何快速从写缓存上接收数据并写入读缓存,又成为一个问题。
一个有效且通用的方法便是使用多线程并发访问的方式,提高数据的访问速度。但当多个线程具有共用的独占式资源时,各个线程往往会由于需要访问这些共用的资源而进行加锁、解锁操作,以保证对这些资源的独占。而加锁、解锁、使用独占式资源又会带来新的问题,一个线程在使用独占式资源时,其它线程必须等待其使用结束、释放相关的锁之后才能占用该资源,这就造成了线程为获得独占式资源而等待的现象,而且,当一个线程使用完独占式资源并释放锁时,其它线程为了获得该资源而发生的“锁竞争”现象也会导致一定的性能开销。这样,带有锁的多线程并发访问方式未必能显著提高数据的存取速度,这对于具有高实时性的数据存取系统来说,无疑是致命的缺陷。
Memcache是一个高性能、分布式的内存对象缓存系统,采用的是Key-Value存储结构。通过在内存中维护一个巨大的哈希链表,Memcache可以存储各种格式的数据,并且可通过目前已经趋于成熟的API接口对这些数据进行增、删、改、查等操作。它可通过客户端实现分布式结构组织,从而扩大数据容量、提高数据的稳定性。Memcache的访问性能极高,单条连接对Memcache服务器的每秒访问次数可达到30000以上。目前很多大型的数据存储系统已经使用了Memcache作为缓存工具,以提高整个系统的数据访问速度。大型的数据存储系统一般会建立一条对Memcache服务器的连接,然后利用该连接,使用多线程并发的方式访问数据,以提高数据的存取速度。但由于这条连接中有不少独占式资源是各个访问线程共有的,因此每个线程在获取这些独占式资源前必须对这些资源进行加锁并在使用完之后进行解锁,以保证它对这些资源的充分独占。这就会使其它线程为等待资源被释放而被挂起,从而降低存取操作的速度。所以,即使使用了多线程并发访问的方式,对提高Memcache的访问性能效果也不会很显著。
发明内容
本发明的目的就是为了克服上述现有技术存在的缺陷而提供一种缓存系统数据存取方法,将多连接方式和多线程技术结合应用,加快Memcache缓存系统的访问速度,提高它的操作频率,以扩大其在分布式文件系统中作为缓存提高数据访问速度的效果。
本发明的目的可以通过以下技术方案来实现:
一种缓存系统数据存取方法,数据存储系统通过该存取方法并发访问Memcache缓存系统的数据时,每个线程均拥有一个独立的、属于自己的Memcache操作句柄和一个唯一标识符,线程使用自己的Memcache操作句柄进行数据存取,每个所述线程的唯一标识符和Memcache操作句柄以Key-Value键值对的形成存储在句柄管理器中,每个线程访问Memcache缓存系统的具体步骤包括:
1)获取线程本身的唯一标识符;
2)查找句柄管理器中是否存在键为当前唯一标识符的元素,若是,则将该键对应的值作为当前线程的Memcache操作句柄输出,若否,则进行创建一个新句柄作为当前线程的Memcache操作句柄;
3)使用步骤2)获得的Memcache操作句柄对缓存系统进行存取操作。
所述的唯一标示符为每个线程的线程号。
所述的步骤2)中创建一个新句柄的具体步骤为:
1)获取当前线程的线程号,即线程的唯一标识符;
2)在内存中创建一个新的Memcache操作句柄;
3)获取新建句柄在内存中的地址;
4)在句柄管理器中插入一个新的元素,该元素以线程号作为Key,以新建句柄的地址作为Value。
所述的句柄管理器设置在数据存储系统服务器端。
与现有技术相比,本发明如下有益效果:
1)提升了在大并发访问的情况下的缓存系统数据存取速度,经测试,在8线程使用各自句柄并发访问Memcache缓存系统时,其访问速度为使用公用句柄时的4至8倍。
2)由于使用了各自的句柄,各线程在访问缓存系统时,无需为争夺共用的句柄而产生锁竞争,提高了获取句柄的速度。
3)由于各线程使用了各自的句柄,也就拥有了各自的连接,一个线程的句柄发生异常不会影响其它线程对缓存系统的访问,因此可以有效提高系统的稳定性。
附图说明
图1为本发明的整体结构示意图;
图2为线程创建句柄过程示意图;
图3为线程获取句柄过程示意图;
图4为数据存储系统内部结构示意图
图5为数据存储系统使用实例结构图。
具体实施方式
下面结合附图和具体实施例对本发明进行详细说明。本实施例以本发明技术方案为前提进行实施,给出了详细的实施方式和具体的操作过程,但本发明的保护范围不限于下述的实施例。
一种缓存系统数据存取方法,数据存储系统通过该存取方法并发访问Memcache缓存系统的数据时,使用多个线程,每个线程均拥有一个独立的、属于自己的Memcache操作句柄(即一条访问Memcache缓存系统的连接),如图1中,线程1~4均分别对应操作句柄1~4。而为了能够建立线程和Memcache句柄的一一对应关系,需使用一些变量唯一地标识各个线程,即每个线程都需要一个唯一标识符(Unique Identifier)。线程使用自己的Memcache操作句柄进行数据存取,多个线程不再共用单独的一条连接。数据存储系统服务器端中维护一个句柄管理器(map容器),每个所述线程的唯一标识符和Memcache操作句柄以Key-Value键值对的形成存储在句柄管理器中。句柄管理器用于存储键和值之间的一一对应关系,其保证在多线程并发访问Memcache时,各线程能够快速定位属于自己的操作句柄,并将其取出后使用。
每个线程访问Memcache缓存系统的具体步骤包括:
(1)获取线程本身的唯一标识符;
(2)查找句柄管理器中是否存在键为此唯一标识符的元素,如果存在,则该线程对应的Memcache操作句柄便是元素的值,执行句柄获取步骤;如果不存在,则表示目前没有与该线程对应的Memcaehe操作句柄,执行句柄创建步骤。
(3)使用取出的或新创建的Memcache操作句柄,对缓存系统进行存取操作。
每个线程都有一个唯一的线程号,可以唯一地标识线程自身。而map容器的Key-Value存储特性可以很好地将线程号和属于线程的句柄建立一一对应的关系,因此线程的线程号可以是作为线程的唯一标识符的良好选择。
句柄创建步骤:
如图2所示,为每个线程创建新句柄的过程如下:
(1)获取当前线程的线程号;
(2)在内存中创建一个新的Memcache句柄;
(3)获取新建句柄在内存中的地址;
(4)在句柄管理map容器中插入一个新的元素,该元素以线程号作为Key,以新建句柄的地址作为Value。
句柄获取步骤:
如图3所示,获取属于每个线程的句柄的过程如下:
(1)获取当前线程的线程号;
(2)检查句柄管理map容器中是否存在键为该线程号的元素;
(3)如果存在该元素,则返回该元素的值,即为对应于该线程的句柄,否则执行句柄创建步骤。
如图4所示,数据存储系统服务端创建一个句柄管理器,专门用于维护与Memcache缓存系统连接的各个句柄。各句柄的属性由句柄管理器统一设置。数据存储系统获取操作缓存系统的句柄都需要通过句柄管理器获得,句柄管理器对各个线程各自的缓存操作句柄进行维护。
如图5所示,以4个客户端为例,各客户端向存储系统写入数据时,需先把数据写入写缓存系统,由数据存储系统自行从写缓存系统中读取数据并存储于磁盘,再将数据写入读缓存系统,供客户端能够快速读取数据。由于Memcache容量有限,当其容量满之后再次往其中写入数据将会导致之前数据丢失,故只适合作为读缓存系统,而写缓存系统需要使用磁盘缓存。客户端发送数据到数据存储系统的过程如下:
(1)各客户端建立一个与写缓存系统的连接;
(2)各客户端将各自的大量数据发送给写缓存系统;
(3)数据存储系统为各个客户端创建一个线程用于读取其发送的数据;
(4)通过各个线程,数据存储系统为各个客户端创建一个线程用于访问写缓存系统,每个线程拥有一个缓存访问句柄,即对写缓存系统的连接;
(5)使用各个连接,将属于各客户端的数据并发地从写缓存系统中读入数据存储系统,并存储在底层磁盘介质中;
(6)数据存储系统为各个客户端创建一个线程用于将其写入的数据发送至读缓存系统;
(7)数据存储系统为各个客户端创建一个线程用于访问读缓存系统,每个线程拥有一个缓存访问句柄,即对读缓存系统的连接;
(8)使用各个连接,将各客户端的数据并发地写入读缓存系统中。