Memcache 初探
Memcache 初探
Candy_Desire 发表于3年前
Memcache 初探
  • 发表于 3年前
  • 阅读 286
  • 收藏 1
  • 点赞 2
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

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的操作,也是很惬意的事情。

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 29
博文 71
码字总数 84592
×
Candy_Desire
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: