memcached的一般应用场景是:
1. 应用程序使用get指令根据key来查询cache是否hit
1.1 如果hit, 则使用缓存的值
2. 如果没有hit, 应用程序查询数据库后再将查询到的内容使用store指令保存到cache中, 方便下次使用.
但有的时候需要将memcached作为一个数据库前端使用,
即 当应用程序使用get指令查询某一条entry的时候,如果此时该key不在cache中, memcache主动地读取数据库并写入cache后,保证每次的get指令都能命中。
对于这样的应用场景,有很多现成的产品, 比如memcacheDB
俺也遇到了这种要求,.Net/JAVA/PHP 的client会连接memcached服务器读取entry, 如果entry不在cache中需要从mySQL数据库中读取后进行一定的逻辑处理后进行缓存。
看了半天发现还是直接修改memcached的源代码最方便。
从 http://memcached.org / 下载到 它的源代码一看,结构逻辑非常清晰。
核心数据结构是
item通过双向链表进行关联,并挂靠了一个hash结构。 item在保存的时候会根据entry的大小选择slab,这是为了防止内存碎片。
在thread.c文件中找到了item_get函数
这里,如果没有命中cache的话, do_item_get 返回NULL. 要加入的代码就很简单了
要注意的是,从数据库读取到内容后,需要在末尾加上/r/n,因为memcached里面就是这样保存的