Memcached是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用。这是一套开放源代码软件,以BSD license授权发布。
memcached的API使用三十二比特的循环冗余校验(CRC-32)计算键值后,将数据分散在不同的机器上。当表格满了以后,接下来新增的数据会以LRU机制替换掉。由于memcached通常只是当作缓存系统使用,所以使用memcached的应用程序在写回较慢的系统时(像是后端的数据库)需要额外的代码更新memcached内的数据。
Memcached作为高速运行的分布式缓存服务器,具有以下的特点。
· 协议简单
· 基于libevent的事件处理
· 内置内存存储方式
· memcached不互相通信的分布式
我们在使用各种语言的驱动连接Memcached时,常规流程如下图所示:
虽然最终数据库是同一个,但每种语言都有对应的驱动程序,操作方式不尽相同。
假如在体系中存在三个子系统,它们都需要调用getUserById方法,很可能是下图所示的结构:
图中的【1.直连】表示B系统用php实现getUserById方法,使用php驱动直接操作Memcached库。
图中的【2.直连】表示A系统用java实现getUserById方法,使用java驱动直接操作Memcached库。
图中的【3.API调用】表示C系统调用A系统的API。
这样的结构有一些问题:如果业务调整,getUserById的实现需要改变,比如不再返回注销的用户,那AB系统的代码都要调整。用以下的结构可以轻松搞定。
当项目需要连接多个版本的Memcached时(比如老系统改造,系统二次开发),此问题尤为严重,驱动包的冲突会导致开发管理成本上升。
出于并发性的考虑,使用socket长连接操作Memcached是最为高效的方法(比如秒级并发>10000次的场景),这也是主力军系统通常的做法。但是在很多辅助系统的业务场景下,对Memcached的使用频次很低,比如后台监控、运维手动操作:
对于低频次场景(秒并发<10000次),使用Memcached官方驱动会增加一些开发成本。如果使用HTTP访问Memcached,这个成本几乎为0。
使用Memcached时,下读取频率远超写频率。在实际应用中,通常是部份系统负责读取,部份系统负责写。在低频读写的系统中,使用HTTP访问Memcached是非常方便、高效的事情。
使用易源平台操作Memcached,其流程如下图所示:
易源的Memcached连接器将Memcached数据库转化为通用数据源,并可以使用http接口进行全部数据库操作,包括但不限于增、删、查、改方法。
之后进入以下表单:
通过HTTP接口访问Memcached,详情操作请点此查看 。
如果在同一个局域网下进行压力测试,直连时程序做充分优化,易源中转比直连方式的多消耗时间<1ms。网站或APP的响应时间在100ms-1000ms之间是可以接受的,也就是易源增加的时间是整体流程的0.01至0.001的比率,几乎可以忽略不计。这点开销,就像开车从北京到西安有1000公里,中间因为修路多走了1公里,总共由1000到1001公里,多走这1公里对全局可以忽略不计。
对于Memcached连接器,易源的IP是:
适合以下条件时,使用易源的Memcached连接器是个很好的选择: