[Memcache] 初探Memcache

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


http://www.niftyadmin.cn/n/1639129.html

相关文章

[JST]不支持for(var i=0;ilength;i++)问题解决方法

Trimpath的循环语法支持遍历列表或者数组&#xff0c;如果我们在模板中希望能够使用传统的for循环的方式 for(var i0;i<length;i) 来实现根据定义数字大小指定遍历次数&#xff0c;则无法使用{for(i in length)}来完成&#xff0c;因为length不是列表也不是数组&#xff0c;…

[lucene]使用lucene建立网站搜索服务

lucene是一个全文检索引擎&#xff08;非分布式&#xff09;&#xff0c;使用java编写并且可以很方便的嵌入到各种系统中以实现全文检索功能&#xff0c;其通过对字符串进行分词&#xff0c;然后针对分词结果分别建立索引&#xff0c;存入内存或者磁盘&#xff0c;以提供搜索服…

Elasticsearch性能优化建议

之前公司项目中有使用Elasticsearch存储日志&#xff0c;当时使用的功能简单&#xff0c;并没有深入了解Elasticsearch&#xff0c;但是对于该支持文本搜索的存储架构还是很感兴趣&#xff0c;最近因为想在一个新项目中采用ELK&#xff08;ElasticsearchLogstashKibana&#xf…

elasticsearch 查询优化建议

最近在做一些索引相关的优化测试&#xff0c;顺便记录一下测试以及效果 1&#xff1a;优化mapping 主要包括 doc_values , index , norms &#xff0c; type的keyword和text // 效果明显 doc_values属性 用于把数据序列化到磁盘&#xff0c;使索引结构更紧密 默认为tru…

[lucene第二季]利用缓存辅助精确更新索引

在上一篇的lucene的入门篇中&#xff0c;我们编写了一个帮助系统&#xff0c;从数据库中将具体的信息获取出来并使用CJKAnalyzer分词后建立索引&#xff0c;提供针对于关键字的搜索服务&#xff0c;其中我们采用定时器的方式每隔10分钟更新一次索引&#xff0c;更新的方式为先删…

[lucene]倒排笔记

lucene的倒排算法相关笔记&#xff1a; 计算文章中关键字出现的位置以及出现频率&#xff0c;以便于精准定位。 百度的定义&#xff1a;用记录的非主属性查找记录而组织的文件&#xff0c;叫倒排文件&#xff0c;或者 倒排索引&#xff0c;次索引 lucene不使用B树&#xff0…

[ElasticSearch]Java API 之 滚动搜索(Scroll API)

一般搜索请求都是返回一"页"数据&#xff0c;无论数据量多大都一起返回给用户&#xff0c;Scroll API可以允许我们检索大量数据&#xff08;甚至全部数据&#xff09;。Scroll API允许我们做一个初始阶段搜索并且持续批量从Elasticsearch里拉取结果直到没有结果剩下。…

mysql数据实时同步到Elasticsearch

业务需要把mysql的数据实时同步到ES&#xff0c;实现低延迟的检索到ES中的数据或者进行其它数据分析处理。本文给出以同步mysql binlog的方式实时同步数据到ES的思路, 实践并验证该方式的可行性&#xff0c;以供参考。 mysql binlog日志 mysql的binlog日志主要用于数据库的主…