Java memcachedclient client怎样建立长连接

Java memcached client怎样建立长连接? - 知乎3被浏览1912分享邀请回答还没有回答memcached和连接池的配置问题 - ITeye问答
我们公司是个小网站,服务器配置是 5M带宽,1.5G内存,150G硬盘吧,我的memcached配置是这个样的
服务启动是 /usr/local/memcached/bin/memcached -d -m 256 -p 11211 -u root 这样的
下面是代码
// initialize the pool for memcache servers
SockIOPool pool = SockIOPool.getInstance("aaaaa");
// set the servers and the weights
//设置Memcached Server
pool.setServers( serverlist );
pool.setWeights( weightlist );
pool.setInitConn( 5 );//设置开始时每个cache服务器的可用连接数
pool.setMinConn( 5 );
//设置每个服务器最少可用连接数
pool.setMaxConn( 250 );
//设置每个服务器最大可用连接数
pool.setMaxIdle( 1000 * 60 * 60 * 6 );
//设置可用连接池的最长等待时间
/*设置连接池维护线程的睡眠时间
设置为0,维护线程不启动
维护线程主要通过log输出socket的运行状况,监测连接数目及空闲等待时间等参数以控制连接创建和关闭。*/
pool.setMaintSleep( 30 );
/* Tcp的规则就是在发送一个包之前,本地机器会等待远程主机
对上一次发送的包的确认信息到来;这个方法就可以关闭套接字的缓存,
以至这个包准备好了就发;
设置是否使用Nagle算法,因为我们的通讯数据量通常都比较大(相对TCP控制数据)而且要求响应及时,因此该值需要设置为false*/
pool.setNagle( false );
//连接建立后对超时的控制
pool.setSocketTO( 3000 );
//连接建立时对超时的控制
pool.setSocketConnectTO( 0 );
pool.setHashingAlg( SockIOPool.CONSISTENT_HASH );
pool.initialize();
mc = new MemCachedClient( "aaaaa" );
mc.flushAll();//清空缓存里的值
我们用的是MYSQL,连接池的配置是
&bean id="dataSource" class="mons.dbcp.BasicDataSource"&
&property name="driverClassName"&&value&com.mysql.jdbc.Driver&/value&&/property&
&property name="url"&&value&jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncode=utf8&/value&&/property&
&property name="username"&&value&root&/value&&/property&
&property name="password"&&value&111111&/value&&/property&
&property name="maxActive"&&value&20&/value&&/property&
&property name="maxIdle"&&value&10&/value&&/property&
&property name="maxWait"&&value&3000&/value&&/property&
请大牛给个合理,和最优的配置方案,还想问下,我们的这个服务器能承受多少人访问
目前还没有答案
已解决问题
未解决问题其他回答(1)
&&&您需要以后才能回答,未注册用户请先。PHP扩展模块memcached长连接使用方法分析
作者:leeon
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了PHP扩展模块memcached长连接使用方法分析,需要的朋友可以参考下
&&&&& 网上广泛流传着一篇文章,讲述php的两个扩展模块memcache和memcached的区别,其中特意强调了memcached与memcached一个很大的区别是memcached模块不支持长连接。以至于后来很多年我都认为memcached是不支持长连接的,其实不然,memcached扩展模块从很早的版本开始就已经支持长连接了。从扩展模块的源码注视中我们就能看到:
/* {{{ Memcached::__construct([string persistent_id[, callback on_new[, string connection_str]]]))
& &Creates a Memcached object, optionally using persistent memcache connection */
static PHP_METHOD(Memcached, __construct)
从php的手册身上我们可以看到memcached的扩展模块提供的构造函数提供一个参数persistent_id可选项,手册中这样介绍:
& & & 默认情况下,Memcached实例在请求结束后会被销毁。但可以在创建时通过persistent_id为每个实例指定唯一的ID, 在请求间共享实例。所有通过相同的persistent_id值创建的实例共享同一个连接。&
这个参数的含义就是说如果你传递了一个命名id给到构造方法,那么就会建立长连接,通常我们使用的都是PHP-FPM模式,这样PHP-FPM进程就会和memcached服务简历一条长连接通道。我们也可以理解为persistent_id就是一个连接池名字,所有php-fpm进程都是这个连接池中的一员。
& & &但我们需要注意的是php是解释性语言,当php第一次通过memached模块建立起长连接后,切记后续的php执行就不要再通过memcached的构造函数构建相同persistent_id命名的长连接,可以建立不同persistent_id名字的长连接,如果是相同的名字被php重复执行,一定会导致php-fpm的进程异常导致与memcached的通信越来越慢,同时根据libmemcached的版本不同还会导致php产生coredump。
& & 那么我们如何避免单个php-fpm在建立完以persistent_id命名的长连接后不再重复建立长连接呢?其实在PHP带有评注的手册上是有讲解的,内容如下:
When using persistent connections, it is important to not re-add servers.
This is what you do not want to do:
$mc = new Memcached('mc');
$mc-&setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
$mc-&addServers(array(
array('',11211),
array('',11211),
Every time the page is loaded those servers will be appended to the list resulting in many simultaneous open connections to the same server. The addServer/addServers functions to not check for existing references to the specified servers.
A better approach is something like:
$mc = new Memcached('mc');
$mc-&setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
if (!count($mc-&getServerList())) {
$mc-&addServers(array(
array('',11211),
array('',11211),
通过使用getServerList()方法来检查当前执行使用的php-fpm进程容器中是否已经存在相同名字的长连接资源,如果存在就不要重复使用addServers() 方法来新增长连接配置。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具博客分类:
1.下载memcached的windows版本,地址在/memcached/
2.解压到任意目录,然后用管理员身份cd到你的解压目录
3.memcached.exe -d install
4.memcached.exe -d start
memcached安装完成。
/gwhalin/Memcached-Java-Client/downloads
java_memcached-release_2.5.0.zip为java的连接客户端
1.解压,将里面的jar包拷贝到项目的lib目录下
使用以下代码调用
package info.
import com.danga.MemCached.MemCachedC
import com.danga.MemCached.SockIOP
* Oct 15, 2011
public class MemCachedTest {
private static MemCachedClient mcc = new MemCachedClient();
String[] servers = {"127.0.0.1:11211"};
//创建一个连接池
SockIOPool pool = SockIOPool.getInstance();
//设置缓存服务器
pool.setServers(servers);
//设置初始化连接数,最小连接数,最大连接数以及最大处理时间
pool.setInitConn(50);
pool.setMinConn(50);
pool.setMaxConn(500);
pool.setMaxIdle(1000 * 60 * 60);
//设置主线程睡眠时间,每3秒苏醒一次,维持连接池大小
//maintSleep 千万不要设置成30,访问量一大就出问题,单位是毫秒,推荐30000毫秒。
pool.setMaintSleep(3000);
//关闭套接字缓存
pool.setNagle(false);
//连接建立后的超时时间
pool.setSocketTO(3000);
//连接建立时的超时时间
pool.setSocketConnectTO(0);
//初始化连接池
pool.initialize();
protected MemCachedTest(){
public static MemCachedClient getInstance(){
public static void main(String[] args) {
MemCachedClient cache = MemCachedTest.getInstance();
cache.add("frady", "this is a test");
System.out.println(cache.get("frady"));
以下是对象的封装
package info.
import com.danga.MemCached.MemCachedC
import com.danga.MemCached.SockIOP
* Oct 15, 2011
public class MemTest {
// 创建一个 memcached 客户端对象
protected static MemCachedClient mcc = new MemCachedClient();
// 创建 memcached连接池
{ // 指定memcached服务地址
String[] servers =
{ "127.0.0.1:11211","127.0.0.1:11211", "127.0.0.1:11211" };
// 指定memcached服务器负载量
Integer[] weights ={ 3, 3, 2 };
// 从连接池获取一个连接实例
SockIOPool pool = SockIOPool.getInstance();
// 设置服务器和服务器负载量
pool.setServers( servers );
pool.setWeights( weights );
// 设置一些基本的参数
//设置初始连接数5 最小连接数 5 最大连接数 250
//设置一个连接最大空闲时间6小时
pool.setInitConn( 5 );
pool.setMinConn( 5 );
pool.setMaxConn( 250 );
pool.setMaxIdle( 1000 * 60 * 60 * 6 );
// 设置主线程睡眠时间
// 每隔30秒醒来 然后
// 开始维护 连接数大小
pool.setMaintSleep( 30 );
// 设置tcp 相关的树形
// 关闭nagle算法
// 设置 读取 超时3秒钟 set the read timeout to 3 secs
// 不设置连接超时
pool.setNagle( false );
pool.setSocketTO( 3000 );
pool.setSocketConnectTO( 0 );
// 开始初始化 连接池
pool.initialize();
// 设置压缩模式
//如果超过64k压缩数据
mcc.setCompressEnable( true );
mcc.setCompressThreshold( 64 * 1024 );
public static void main(String args[]) {
User u1 = new User();
u1.setUserName("frady");
u1.setEmail("");
mcc.add("fradyt", u1);
User u2 = (User) mcc.get("fradyt");
System.out.println("email=" + u2.getEmail());
u2.setEmail("");
mcc.replace("fradyt", u2);
u2 = (User) mcc.get("fradyt");
System.out.println("email=" + u2.getEmail());
此处要注意User得实现序列化
package info.
import java.io.S
* Oct 15, 2011
public class User implements Serializable {
private static final long serialVersionUID = 5966138L;
private String userN
public String getUserName() {
return userN
public void setUserName(String userName) {
this.userName = userN
public String getEmail() {
public void setEmail(String email) {
this.email =
查看cache的状态
Map &String, Map&String, String&& stats = cache.stats();
for (Map.Entry&String, Map&String, String&& m : stats.entrySet()) {
System.out.println(m.getKey());
Map&String, String& values=m.getValue();
for (Map.Entry&String, String& v : values.entrySet()) {
System.out.print(v.getKey()+":");
System.out.println(v.getValue());
清空所有的对象
MemCachedClient mc = new MemCachedClient();
mc.flushAll();
据说2.5有连接数量过多导致oom的bug,附件提供了2.6.1版本的包。
官方地址:/gwhalin/Memcached-Java-Client/downloads
下载次数: 316
下载次数: 158
浏览: 495173 次
来自: 西安
W.sl 写道大神:http://mushme.iteye.c ...
大神:/logi ...
jilong-liang 写道 public static v ...
import java.net.URL; ...

我要回帖

更多关于 memcached client 的文章

 

随机推荐