基于memcache的队列设计

基于memcache的队列设计

作者: gashero

1   需求

两个系统交互,使用memcache作为中间的接口,因为传送的数据可能类型很多,而且无法定义一个很好的键名,所以设计了memcache队列,以供数据传输用。

2   基本设计原理

memcache中实现了命令 incrdecr 分别对一个键进行自加和自减操作。执行命令的结果是返回自加或自减后的结果。因为是通用memcache命令,所以在各种语言的接口中都有实现,本例探讨基于Python的实现。

协议接口:

incr <key> <value>\r\n

decr <key> <value>\r\n

Python接口:

incr(key,delta=1)

decr(key,delta=1)

3   队列结构设计

基于memcache实现的队列,需要实现两个基本变量以控制整个队列。

3.1   队列指针

队列指针有两个变量,一个是 head 另一个是 tail 分别为队列的最后一个ID和最前一个ID。每次加入新的item都会使得 tail++ ,而每次取走一个item都会使得 head++

3.2   队列元素

每个队列元素都是按照 prefix+index 形式构造,即一个类别前缀加上索引数字。之后在value中存储串行化以后的数据。

3.3   队列的循环

经测试memcache中的自增变量的数据类型为long型,即有符号32位整数。最大可取值区间为-2199023255552至 2199023255551。所以,为了防止系统长时间运行出现问题,必须设置一个队列的循环机制。无论head还是tail变量,必须设计一个最大值, 当达到最大值时就清零循环。

经测试,在Python调用memcache测试最大允许自增变量值超过最大可取值范围时,发生了ValueError异常。而在memcache 协议中则表示根本没有验证数据溢出的情况。在应用中需要酌情考虑。比如设置为1048576,为队列的最大长度,并且每次在index达到这个数字时即循 环。

4   需要注意的问题

4.1   数据项丢失

memcache的设计目标是提供高速度的数据缓存服务,并不确保数据的完整性,在内存不足时,memcache甚至会主动删除一些存储的键值。所以,即便是通过正常的接口、head与tail指定的标志,获取键值时也要考虑到异常的可能。

4.2   及时删除过期变量

在接收端应用程序取走数据之后应该立即删除memcache中的对应键,否则时间长了可能会因为占用内存过多而影响尚未取走变量的存储。

Leave a Reply