NBA

如何挑出适合应用系统的快取机制

2019-12-04 18:10:53来源:励志吧0次阅读

快取是在电脑技术中用来提升资料存取速度的重要技巧。不过,快取本身机制并不是毫无代价的,一来系统必须建置额外的机制因而提高了架构上的复杂度,二来,当快取误失时,整体的存取速度反而较不透过快取还慢。

当然,快取也会需要占用额外的资源,尤其是记忆体空间。因此,设计者在考虑运用快取来提升资料存取效率之前,必须先了解系统所操作之资料的特性,进而挑选适合置入的快取,以提高存取效率的资料。

接下来,让我们来看看,实际建置软体系统所要用到的快取机制时,你需要再仔细考虑的一些技术因素。

找到适合你应用的快取系统类型

首先,你必须选定快取系统的实作。快取系统的区分,可以依快取所用的记忆体空间,是否位在和应用系统同样的记忆体位址空间内来看。

有些快取系统所用的记忆体空间和应用系统位在相同的位址空间内,也就是说,它们是属於同一个行程,应用系统想要存取快取中的资料,并不需要进行跨越行程的通讯(Inter-Process Communication,IPC)。

相反的,另一类的快取系统所用的记忆体空间和应用系统位在不同的位址空间内(甚至位在不同的主机之上),所以,当应用系统想要存取快取中的资料时,便需要进行跨越行程的通讯。当二者位在不同的主机上时,通常得经由网路通讯才能更新或取得快取中的资料。

之所以会有这两种类型的设计,意谓着这两种类型的快取系统各有优劣。

当快取系统所用的记忆体空间和应用系统位在相同的位址空间时,毋需透过IPC即可取得快取中的资料,存取速度较快。

相反的,若二者不在相同的位址空间内,资料便必须经由IPC的通道来传送,其速度和直接於记忆体空间中存取,便会有明显的高下差别。此外,资料若欲透过IPC传送,必须经由过序列化(serialization)的程序,而接收时也必须进行解序列化(deserialization)处理,而这两种动作,也会耗去CPU的运算资源,影响到存取的时间。

有坏就有好,虽然需透过IPC才能取得快取资料,虽然单看资料存取速度是位居下风,但是,当应用系统和快取系统能够分别位在不同的位址空间,甚至不同的主机时,却有一些其他无法被取代的优点,这是这一类设计之所以能够存在的原因。那麽,这样子有什麽优点呢?

最大的优点是这样的设计是有规模扩充性(scalability)的。

在电脑系统里,单一个行程所能定址的记忆体空间是有限的,也就是说,倘若使用同一行程内的记忆体空间做为快取空间,那麽,快取所能配置的记忆体空间量,便受这单一行程最大能拥有的记忆体空间所限制。

再者,位於快取内的资料,也仅能供同一行程内的应用系统所用,当应用系统同时间由多部主机所构成的分散式架构来提供服务时,快取系统本身便无法同时以分散式的架构来匹配。由於记忆体空间受限、无法以分散式的架构进行扩充,便成了此种快取系统的最大致命伤。

当然,当系统所需的规模或应用型态不需要时,它仍旧具备着存取快速的优势。[page]

大部分网站会用独立的快取系统

现在许多网站系统,都采用快取系统来提高资料的存取效率。

由於网站应用本身就需要较大的规模,而网站需要快取的资料量也都较大,因此,多半选择独立於应用系统之外的快取系统。

这些系统通常是以独立的伺服器型式存在,应用系统可以透过特定的通讯协定,将资料在经序列化完之後,利用IPC的方式,将资料送入快取系统中,当然,也是透过特定的通讯协定,利用IPC的方式,将资料自快取系统中取出,并且加以解序列化之後,便可还原当初置入快取系统中的资料。

这一类的快取系统中最广为人知的,莫过於memcached了。

它最早是Danga Interactive为了Live Journal所发展出来的开放原始码系统,而现今,许多大大小小的网站,都采用memcached来做为它们的快取系统。这中间包括了超大型规模的YouTube、Facebook及Twitter。由此可见其受欢迎的程度,以及应付超大规模使用的能耐。

不过,不论快取系统究竟位在和应用系统同一行程空间中,就应用系统存取快取的程式设计模型来说,仍然都是相同的。同样都是给定一个键(key)值,对应到资料。

一般来说,你只要使用和快取系统相对应的客户端程式库,便不需要理会快取系统传输协定等细节,只需要以高阶的存取模型来看待快取即可。以memcached而言,你可以轻易找到各种主流程式语言的客户端程式库,可以说是十分的方便。

注意快取系统的安全性

在key值的运用上有一些议题值得讨论。一般来说,key值是个字串,而有些快取系统对key值的长度有所限制,例如在memcached中,key值的长度限制是250个字元,所以,不论使用何种方式来做为key值,都必须在快取系统的长度限制之内。

所以,在使用快取时,你必须为你要快取的每一笔资料都取一个特定的名称,做为它在快取系统中的key值。

倘若以快取关联式资料库中资料的应用来说,你可以为欲快取的SQL述句进行命名,那麽便可以利用这名称来做为该SQL述句对应资料的key值。

使用SQL述句本身做为key值,当然也是一个方式,但是几乎没有什麽优点。一来,SQL述句长度很容易超过限制,二来,完全不具备任何的可读性,没有什麽人能够看到一句冗长的SQL述句就明白它确切的作用。

因此,为程序中所用到的每一个SQL述句命名是一项良好的程式设计习惯。当然,把这名称用到快取系统的key值,刚好适得其所。

不过,使用命名良好的key值名称,固然能增加程序的可读性,但是,同时间也造成了另一个隐忧。就像跨行程的快取系统伺服器,可能因为效率的考虑,而不会在通讯协定上设计认证及授权等安全性的机制。

也就是说,只要有办法利用网路连上其通讯埠,进而了解通讯协定的内容,伺服器便允许其存取快取中的资料。如此一来,当应用系统使用快取的名称易於理解,而有心人士又能连上快取伺服器时,便有机会取得储存於快取中的资料,因而形成安全性的漏洞。

因此,程式设计者可以考虑最终在面对快取系统时,将程式中所用的key值,经过一些好的hashing演算法,例如MD5,把key值加以混乱,再使用混乱後的结果,做为实际於快取系统中运用的key值。如此,程式一样能够保持可读性,而快取系统中所使用的key值,也不再那么容易被识破、理解,同时,使用hashing演算法,还能有限缩key值好处字串长度。

因此,在使用快取系统时,若能赋予每一笔资料有意义的名称、然後再透过适当的hashing演算法加以处理,便可以同时兼顾可读性及安全性。

新昌县中医院预约挂号
军颐医院陈洪贺
遵义治疗宫颈炎医院
山东市治疗癫痫病哪家医院好
黑龙江治疗白带异常费用
分享到: