memcache研究

最近开发了一个数据库,该数据库是利用共享内存做的,测试了下增删改查的性能,想与memcached数据库做个对比,故研究下memcached。

那什么是memcached?

memcached是一个高性能,分布式的内存缓存服务器,通过内存的数据访问来降低对数据库的访问,从而提高动态内容应用网站的速度。

memcached的特征:

(1) 基于C/S架构,协议简单;

(2) 基于libevent的事件处理;使用libevent进行网络并发连接的处理,能够保持在很大并发情况下,保持快速的相应能力。

(3) 内置内存存储方式;数据存储方式使用Slab Allocation,数据过期方式采用:Lazy Expiration +LRU。

(4) 基于客户端的memcached分布式;

其他的具体的细节可以参考其他参考文档,这里不细说。如果以后深入研究了,会展开分析。

下面看看怎么安装memcached以及怎么安装客户端,及使用C++代码进行测试

1. memcached安装

安装步骤:

(1)  由于memcached是基于libevent的时间处理,所以安装前先安装libevent,可以从官方网站下载,http://monkey.org/~provos/libevent/,我使用的安装版本是:libevent-1.3.tar.gz

(2)  安装memcached主程序,可以从官网下载:http://www.danga.com/memcached,我使用的版本是:memcached-1.2.2.tar.gz

(3)  我这里使用的C/C++ memcached 客户端库:libmemcached,可以从开发库官网下载:http://tangent.org/552/libmemcached.html,我使用的版本是:libmemcached-0.42.tar.gz

说明:这些资料可以在我的资源空间免费下载:http://download.csdn.net/detail/feitianxuxue/5739345

安装libevent

解压文件:tar –zxvf libevent-1.3.tar.gz,进入目录:cd libevent-1.3

预编译: ./configure --prefix=/usr (路径可以自己配)

编译和安装:make && make install

测试是否安装成功: ls -al /usr/lib | grep libevent

显示:

lrwxrwxrwx   1 root root       21 07-09 22:14 libevent-1.3.so.1 -> libevent-1.3.so.1.0.3

-rwxr-xr-x   1 root root   337676 07-09 22:14 libevent-1.3.so.1.0.3

-rw-r--r--   1 root root   532580 07-09 22:14 libevent.a

-rwxr-xr-x   1 root root      805 07-09 22:14 libevent.la

lrwxrwxrwx   1 root root       21 07-09 22:14 libevent.so -> libevent-1.3.so.1.0.3

安装memcached

解压文件:tar –zxvf memcached-1.2.2.tar.gz,进入目录: cd memcached-1.2.2

预编译: ./configure --with-libevent=/usr(该路径参考libevent的安装路径)

编译和安装:make && make install

安装完毕后,会存放默认路径: /usr/local/bin/memcached

测试是否安装成功:ls -al /usr/local/bin/mem*

-rwxr-xr-x 1 root root 142346 07-11 09:27 /usr/local/bin/memcached

-rwxr-xr-x 1 root root 152004 07-11 09:27 /usr/local/bin/memcached-debug

安装C/C++ memcached 客户端库:libmemcached

解压文件:tar –zxvf libmemcached-0.42.tar.gz,进入目录: cd  libmemcached-0.42

预编译: ./configure --prefix=/usr (路径可以自己配)

编译和安装:make && make install

测试是否安装成功:

检查库文件:ls /usr/lib/libmemcache*

检查头文件:ls /usr/include/libmemcached/*

检查命令行工具:ls /usr/bin/mem*

自此,所有的库都安装好了,可以开始工作了

2. 启动memcached服务端

进入:cd  /usr/local/bin/,可以利用./memcached –h看到一些帮助信息

运行:./memcached -u root –d,这里-d选项是启动一个守护进程,-u是运行Memcache的用户。

默认启动TCP端口是:11211

可以查看程序运行:ps -ef|grep memcached

root      2992     1  0 11:20 ?        00:00:00 ./memcached -u root –d

3.  一个简单的C++测试程序,

用于连接memcached服务器,添加一条记录,获取一条记录,删除一条记录。

代码如下:test.cpp

#include <iostream>
#include <string>
#include <libmemcached/memcached.h> using namespace std; int main(int argc,char *argv[])
{
//connect server
memcached_st *memc;
memcached_return rc;
memcached_server_st *server;
time_t expiration;
uint32_t flags; memc = memcached_create(NULL);
server = memcached_server_list_append(NULL,"localhost",11211,&rc);
rc=memcached_server_push(memc,server);
memcached_server_list_free(server); string key = "key";
string value = "value";
size_t value_length = value.length();
  size_t key_length = key.length();
  
  
   //Save data
   rc=memcached_set(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
   if(rc==MEMCACHED_SUCCESS)
   {
   cout<<"Save data:"<<value<<" sucessful!"<<endl;
   }
  
   //Get data
   char* result = memcached_get(memc,key.c_str(),key_length,&value_length,&flags,&rc);
   if(rc == MEMCACHED_SUCCESS)
   {
   cout<<"Get value:"<<result<<" sucessful!"<<endl;
   }
  
   //Delete data
   rc=memcached_delete(memc,key.c_str(),key_length,expiration);
   if(rc==MEMCACHED_SUCCESS)
   {
   cout<<"Delete key:"<<key<<" sucessful!"<<endl;
   }
  
   //free
   memcached_free(memc);
   return 0;
  }

编译:g++ test.cpp –o test –lmemcached

运行:[root@localhost test]# ./test1

可能会报错:./test1: error while loading shared libraries: libmemcached.so.5: cannot open shared object file: No such file or directory

"error while loading shared libraries:x.so.x"错误:

原因:执行某些外部程序的时候可能会提示找不到共享库的错误

(1) 操作系统里确实没有包含该共享库(lib*.so.*文件)或者共享库版本不对, 遇到这种情况那就去网上下载并安装上即可.。
(2) 已经安装了该共享库, 但执行需要调用该共享库的程序的时候, 程序按照默认共享库路径找不到该共享库文件.

解决方法:

(1)如果共享库文件安装到了其它"非/lib或/usr/lib" 目录下,  但是又不想在/etc/ld.so.conf中加路径(或者是没有权限加路径). 那可以export一个全局变量LD_LIBRARY_PATH, 然后运行程序的时候就会去这个目录中找共享库. 
LD_LIBRARY_PATH的意思是告诉loader在哪些目录中可以找到共享库. 可以设置多个搜索目录, 这些目录之间用冒号分隔开. 比如安装了一个mysql到/usr/local/mysql目录下, 其中有一大堆库文件在/usr/local/mysql/lib下面, 则可以在.bashrc或.bash_profile或shell里加入以下语句即可:
export LD_LIBRARY_PATH=/usr/local//lib:$LD_LIBRARY_PATH     export LD_LIBRARY_PATH=/usr/lib

(2) 如果共享库文件安装到了/lib或/usr/lib目录下, 那么需执行一下ldconfig命令

(3)如果共享库文件安装到了/usr/local/lib(很多开源的共享库都会安装到该目录下)或其它"非/lib或/usr/lib"目录下, 那么在执行ldconfig命令前, 还要把新共享库目录加入到共享库配置文件/etc/ld.so.conf中, 如下:
# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
# echo "/usr/local/lib" >> /etc/ld.so.conf
# ldconfig

结果:

Save data:value sucessful!

Get value:value sucessful!

Delete key:key sucessful!

memcache研究的更多相关文章

  1. 深入研究memcache 特性和限制

    深入研究memcache 特性和限制在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 .Memcached 单进程最大使用内存为2G,要使用更多内存,可以分多个端口开启多个M ...

  2. memcache 线程深入理解分析 及 源码研究

    http://blog.csdn.net/huithe/article/details/8006186

  3. 对一致性Hash算法,Java代码实现的深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...

  4. wamp环境 安装memcache 扩展

    这两天在研究tp的memcached缓存 总是遇到坑 在网上找了很多教程看终于弄出来了现在拿出来分享 首先安装memcached下载memcache压缩包 使用cmd以管理员命令去安装 E:\wamp ...

  5. twemproxy explore,redis和memcache代理服务器

    twemproxy,也叫nutcraker.是一个twtter开源的一个redis和memcache代理服务器. redis作为一个高效的缓存服务器,非常具有应用价值.但是当使用比较多的时候,就希望可 ...

  6. Memcache的使用和协议分析详解

    Memcache的使用和协议分析详解 作者:heiyeluren博客:http://blog.csdn.NET/heiyeshuwu时间:2006-11-12关键字:PHP Memcache Linu ...

  7. 深入理解Memcache原理 [转]

    1.为什么要使用memcache 由于网站的高并发读写需求,传统的关系型数据库开始出现瓶颈,例如: 1)对数据库的高并发读写: 关系型数据库本身就是个庞然大物,处理过程非常耗时(如解析SQL语句,事务 ...

  8. 从源码角度理清memcache缓存服务

    memcache作为缓存服务器,用来提高性能,大部分互联网公司都在使用.   前言    文章的阅读的对象是中高级开发人员.系统架构师. 本篇文章,不是侧重对memcache的基础知识的总结,比如se ...

  9. [轉]redis;mongodb;memcache三者的性能比較

    先说我自己用的情况: 最先用的memcache ,用于键值对关系的服务器端缓存,用于存储一些常用的不是很大,但需要快速反应的数据 然后,在另一个地方,要用到redis,然后就去研究了下redis. 一 ...

随机推荐

  1. Cocos2d-x3.0 TestCPP文件夹的注意事项

    1.不多说了,重力加速度. 2.ActionMangerTest:此Test它是由导演来展示,以获得集体诉讼经理ActionManager类别,操作控制节点. ①CrashTest:破坏demo,毁. ...

  2. BZOJ 1208 HNOI2004 宠物收容所 平衡树/set

    标题效果:有一个宠物收容所.目前还没有被采纳的宠物或谁想要领养宠物,每个宠物有个性值,大家谁想要领养宠物具有理想人格值.每一刻,宠物收容所只是为了有谁想要领养宠物或宠物的人. 当领走宠物,将有一定程度 ...

  3. 如何判断微信内置浏览器(通过User Agent实现)

    在进行微信公众账号开发的时候,其中很大一块是微站点的开发,我们需要知道当前的浏览器是微信内置的浏览器,那么如何判断呢? 微信内置浏览器的 User Agent 如何判断微信内置浏览器,首先需要获取微信 ...

  4. YII编码规范

    类名称: 驼峰式 首字母大字 class PointController class PointRatioController 公共成员方法: 驼峰式 首字母小写 public function ge ...

  5. PhotoShop基本工具 -- 移动工具

    艺术或学习的东西吧, 爱好   比学编程还难 PS版本号 : PhotoShop CS6 1. 移动工具 (1) 工具栏和属性栏 工具栏 和 属性栏 : 左側的是工具栏, 每选中一个工具, 在菜单条的 ...

  6. [代码收藏]设为首页和加入收藏的JavaScript代码(兼容多浏览器)

    其实不少非IE内核浏览器都仍不支持通过代码将网页设为主页和加入收藏的功能,因此说是兼容,其实只是一个try,catch后的提醒而已. 加入收藏: /* * author : 2010-12-27 11 ...

  7. Android项目---webView

    之前用webView的时候,只知道它可以加载出html页面,竟然不知道,它也可以与js进行交互. WebView是一个网络视图,能加载显示网页,可以将它看作一个浏览器.它使用WebKit渲染引擎加载显 ...

  8. 谈谈Oracle dba_free_space

    谈谈Oracle dba_free_space 博客分类: ORACLE管理 OracleSQLC#C++C  顾名思义,dba_free_space指的是Oracle还有多少表空间剩余空间,其视图结 ...

  9. Windows平台分布式架构实践负载均衡

    Windows平台分布式架构实践 - 负载均衡 概述 最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,并且在不久的将来,我们在VS里面写的代码可能就可以通过Mono直接在Li ...

  10. Manager(管理器)

    Manager(管理器) 索引 意图 结构 参与者 适用性 效果 实现 实现方式(一):Manager 模式的示例实现. 意图 将对一个类的所有对象的管理封装到一个单独的管理器类中. 这使得管理职责的 ...