现在的位置: 首页 > 综合 > 正文

[Memcache] 初探Memcache

2013年10月14日 ⁄ 综合 ⁄ 共 2537字 ⁄ 字号 评论关闭

Memcache (http://memcached.org/)

 

memcache 是一种分布式缓存服务器,和通常使用的非分布式的ecache不同,memcache需要独立的服务器支撑,客户端通过配置IP地址和端口号(默认11211)与之连接并使用API进行数据的缓存操作。所以自然的memcache分成两个角色:服务器端和客户端。服务器端是独立的memcache服务器,可以去官方网站下载相应的windows或者linux的包,安装的自己的机器上,目前貌似官网不再提供现成的exe文件,而是提供了一个resource文件,需要自己下载后编译打包部署。莫非是方便爱好者的扩展?

不过通过google还是可以找到exe的安装文件,可以通过下面的链接下载

http://download.csdn.net/source/2596274

下面这个是java的jar包,带源文件,可以查看API的内部实现

http://download.csdn.net/source/2596278

 

安装步骤:

windows 环境

1、下载上面的安装文件,解压到某个目录,比如 d:/cacheServer/memcache/ 下面

2、命令行进入上面的目录,敲命令:

memcached.exe -d install

这样将memcache安装成一个服务

3、继续敲命令:

memcached.exe -d start

这样memcache的服务将在每次开机的时候自动启动,打开任务管理器,你会发现一个进程 memcached.exe

// memcache是这个项目的名字,而memcached是这个工程的名字,多了个d,意思是daemon

 

memcached的基本设置参数:

-p 监听的端口

-l 连接的IP地址, 默认是本机

-d start 启动memcached服务

-d restart 重起memcached服务

-d stop|shutdown 关闭正在运行的memcached服务

-d install 安装memcached服务

-d uninstall 卸载memcached服务

-u 以的身份运行 (仅在以root运行的时候有效)


-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项


-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48

-h 显示帮助

 

memcache的使用将超乎想象的简单,将服务器启动起来,在客户端配置好相关的服务器端IP地址,可以通过MemCachedClient提供的简练的API进行缓存的操作。

 

1、memcache可否采用集群式部署?客户端可否配置多个服务器地址?

memcache是支持集群部署的,如果应用系统对于缓存服务器的要求是多台的,那么可以使用多台memcache服务器进行集群部署。而客户端可以通过配置SockIOPool的servers参数保存服务器地址列表,同时通过weight参数配置每台服务器的权重。SockIOPool提供了连接池的服务,可以通过SockIOPool来配置memcahce服务器相关信息,如最大连接数,最小连接数等。

 

2、在集群部署下,客户端如何定位某台服务器?客户端存入的一个(key,value),是否在每台服务器都有一个拷贝?

这两个其实可以归纳为一个问题,就是memcahce的hash算法问题,通过这个算法得到的数字,可以帮助客户端定位到某一台服务器,而算法的输入,就是客户端定义的缓存值key的hashCode。

上面我们讲到每台服务器将配置一个权重,那么这个权重是什么作用呢?

比如现在有两台服务器: 192.168.7.75:11211 192.168.7.74:11211 (IP仅用于举例,或许不符合相关标准)

我们配置权重分别为:

192.168.7.75:11211 4

192.168.7.74:11211 3

那么链接池初始化后,得到的一个参数为this.buckets = new ArrayList();

保存的列表为:


{

192.168.7.75:11211


192.168.7.75:11211


192.168.7.75:11211


192.168.7.75:11211


192.168.7.74:11211

192.168.7.74:11211

192.168.7.74:11211

}

可以知道上面的权重是什么意思了吧,其实可以理解为最终列表中的占有的数量。
那么,使用连接池getSock操作的时候,他会根据传入的key值,做一个hashcode的散列操作, key % buckets.size() 得到一个在buckets.size()范围内的数字,通过这个数字,从上述的buckets 列表中获取到一个IP地址,从而定位一台服务器。

所以说,一个key只能存放在一台memcache服务器上,是不会在多个服务器上有多份拷贝的,这样的话既可以防止出现刷新不同步的情况,也可以避免磁盘空间的浪费,毕竟能使用缓存策略的,一般都是访问量比较高的系统,数据量都不会少。

 

3、当数据修改,memcache怎么更新缓存中的数据?

memcacheClient提供了一个replace操作,可以替换特定key的值。

 

看了一些网络专家针对于memcahce直接和数据库映射,将应用程序和DB进行隔离的方案,所有的操作都直接与memcache进行交互,然后通过memcache的定时线程来实现与数据库的交互工作,这样的做法固然有他的优点,那就是可以很大幅度的提升系统性能,降低DB的瓶颈,但是目前想不通的是,这样的架构下,如何去解决数据同步的实时性问题,比如当定时线程开始与数据库同步数据的时候,其他的正在进行的事务操作如何错开时间差?这个通过一个时间戳的方法吗?或许可以,但是一旦这个时候memcahce宕机,尚未同步的数据会全部丢失,这个时候是无法恢复的。所以一直觉得这样的架构还是会有很大的风险。后续将会尝试搭建自己的memcache应用,提供一种可配置的统一memcache服务端,对于客户端而言不需要过多的关注缓存的问题,或许是一个很好的局面,同时,可以使用自己封装的jdbcTemplate来完成DB的操作,也是很惬意的事情。

抱歉!评论已关闭.