memcached客户端和连接池
链接:
http://my.oschina.net/u/1475616/blog/330232#
前阵子在网上找了个demo学了一下memcached的简单使用.
今天回顾了一下,我想:连接池不是应该算是服务端管理的东西么,Client应该是客户端管理的东西,怎么能放在同一个class里边呢?于是把demo改了改,代码如下:
服务端:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
package studyMemcached;
import com.danga.MemCached.SockIOPool;
public class MemServer {
private static SockIOPool pool;
public static void main(String[] args) {
initPool();
}
private static void destroyPool() {
SockIOPool.getInstance( "SP" ).shutDown();
}
private static void initPool() {
String[] addr = { "127.0.0.1:11211" };
Integer[] weights = { 3 };
pool = SockIOPool.getInstance( "SP" );
pool.setServers(addr);
pool.setWeights(weights);
pool.setInitConn( 4 );
pool.setMinConn( 4 );
pool.setMaintSleep( 30 );
pool.setMaxConn( 200 );
pool.setMaxIdle( 1000 * 30 * 30 * 6 );
pool.setMaintSleep( 30 );
pool.setNagle( false );
pool.setSocketTO( 30 );
pool.setSocketConnectTO( 0 );
pool.initialize();
}
}
|
客户端:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
package studyMemcached;
import java.util.Date;
import com.danga.MemCached.MemCachedClient;
public class PutToCache {
public static void main(String[] args) {
MemCachedClient client = new MemCachedClient( "SP" );
client.setCompressEnable( true );
client.setCompressThreshold( 1000 * 1024 );
// 将数据放入缓存
client.set( "test2" , "test2" );
// 将数据放入缓存,并设置失效时间
Date date = new Date( 2000000 );
client.set( "test1" , "test1" , date);
client.add( "kkk" , "kkkkk" );
// 删除缓存数据
// client.delete("test1");
// 获取缓存数据
String str = (String) client.get( "test1" );
String str2 = (String) client.get( "test2" );
System.out.println(str);
System.out.println(str2);
System.out.println((String)client.get( "kkk" ));
}
}
|
先运行服务端,发现马上程序就结束了;感觉有点儿不对劲;
然后运行客户端,果然什么也没存进去,什么也没取到;
日志里出现这样的提示:Attempting to get SockIO from uninitialized pool!
想了想,可能是连接池初始化以后又马上被销毁了;
于是把服务端改成如下这样:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
package studyMemcached;
import java.util.Scanner;
import com.danga.MemCached.SockIOPool;
public class MemServer {
private static SockIOPool pool;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
initPool();
while (!sc.nextLine().equals( "exit" )) {
}
sc.close();
destroyPool();
}
private static void destroyPool() {
SockIOPool.getInstance( "SP" ).shutDown();
}
private static void initPool() {
String[] addr = { "127.0.0.1:11211" };
Integer[] weights = { 3 };
pool = SockIOPool.getInstance( "SP" );
pool.setServers(addr);
pool.setWeights(weights);
pool.setInitConn( 4 );
pool.setMinConn( 4 );
pool.setMaintSleep( 30 );
pool.setMaxConn( 200 );
pool.setMaxIdle( 1000 * 30 * 30 * 6 );
pool.setMaintSleep( 30 );
pool.setNagle( false );
pool.setSocketTO( 30 );
pool.setSocketConnectTO( 0 );
pool.initialize();
}
}
|
让服务端卡在那里等待输入,然后运行客户端,这样会不会就可以从连接池获取到连接了呢?
...
...
果然还是不行;
依然提示:Attempting to get SockIO from uninitialized pool!
难道这两部分代码一定要放在同一个类文件中么?这是什么鬼逻辑;
回头查看公司项目里memcached部分的代码,也是把连接池和创建Client实例的逻辑分开在两个类文件里的,没有任何问题;
想来想去,做了个伪分开,把Client作为服务端的一个静态变量,和线程池一起初始化,然后在另一个类里调用这个Client进行存取,这个自然是可以的;
后来又想到,公司的项目是web项目,是部署在web容器里的,会不会因为Client和线程池对象都在同一个classloader或context里,所以才可以互相找到呢?
但是这个没法验证啊,还得写一个web版的demo,太费劲了,,,
于是,写了这样一样东西:Together类,有两个field,一个Client,一个Server分别是持有缓存Client和连接池对象的独立的类;在初始化Together对象的时候,分别将client和Pool在各自的构造方法中初始化,然后在Together对象中调用Client里的缓存Client进行存取;
代码如下:
Together:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
package studyMemcached;
public class Together {
private MemC client;
private MemS server;
public Together() {
client = new MemC();
server = new MemS();
}
public static void main(String[] args) {
String mistery = "xxx" ;
Together t = new Together();
t.client.set( "mis" , mistery);
System.out.println(t.client.get( "mis" ));
}
}
|
Server端:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
package studyMemcached;
import com.danga.MemCached.SockIOPool;
public class MemS {
private SockIOPool pool;
public MemS() {
String[] addr = { "127.0.0.1:11211" };
Integer[] weights = { 3 };
pool = SockIOPool.getInstance( "SP" );
pool.setServers(addr);
pool.setWeights(weights);
pool.setInitConn( 4 );
pool.setMinConn( 4 );
pool.setMaintSleep( 30 );
pool.setMaxConn( 200 );
pool.setMaxIdle( 1000 * 30 * 30 * 6 );
pool.setMaintSleep( 30 );
pool.setNagle( false );
pool.setSocketTO( 30 );
pool.setSocketConnectTO( 0 );
pool.initialize();
}
}
|
Client端:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package studyMemcached;
import java.util.Date;
import com.danga.MemCached.MemCachedClient;
public class MemC {
public MemCachedClient client;
public MemC() {
client = new MemCachedClient( "SP" );
client.setCompressEnable( true );
client.setCompressThreshold( 64 * 1024 );
}
public void set(String key, String value) {
client.set(key, value, new Date( 2000000 ));
}
public String get(String key) {
return (String) client.get(key);
}
}
|
这样一来,MemCachedClient和SockIOPool就分开了,只是在实例化的时候两个实例处在同一个classloader里;
这样调用,发现可以进行数据的存取了;
看来互相找不到是一种类似不在同一个会话环境的问题;
我在网上百度了一天,也没发现有人吧Client和Pool的初始化分开写的demo,能找到的demo总共就俩,都是写在一起的;
可能这个pool不算是服务端吧,或者Client不算是客户端;
公司的项目里是把Client作为一个单例,用的时候getInstance来取得后进行数据的保存和查找的;
memcached客户端和连接池相关推荐
- Redis Lettuce客户端异步连接池详解
前言 异步/非阻塞编程模型需要非阻塞API才能获得Redis连接.阻塞的连接池很容易导致阻塞事件循环并阻止您的应用程序进行处理的状态.Lettuce带有异步,非阻塞池实现,可与Lettuces异步连接 ...
- python sqlserver api连接池_非常老的话题 SQLSERVER连接池
非常老的话题 SQLSERVER连接池 写这篇文章不是说要炒冷饭,因为园子里有非常非常多关于SQLSERVER连接池的文章,但是他们说的都是引用MSDN里的解释 或者自己做一些测试试验一下连接池的性能 ...
- Redis中的连接池以及在Springboot中的使用
1.为什么要使用连接池以及常用客户端的区别 众所周知,Redis是单线程的,那为什么还要使用连接池?首先Redis也是一种基于内存数据库,有着很高的性能,但是我们的系统使用Redis服务时需要 ...
- spring-data-redis连接池
连接池使用原因 在某些业务场景中使用了redis作为分布式缓存,在做业务活动的时候,比如秒杀活动,会一时间涌入大量的流量,这个时候和redis server进行网络连接的话就比较耗费资源和时间,直接影 ...
- 连接池中 maxActive,maxWait,maxAge,maxIdel参数
前言 连接池本质作用是为客户端提供连接复用,提升连接效率,降低系统开销.Tomcat的连接池提供了maxActive,maxWait,maxIdle,minIdle,initialSize等参数,配置 ...
- swoole mysql 协程_swoole-orm: 基于swoole的mysql协程连接池,简单封装。实现多个协程间共用同一个协程客户端。参考thinkphp-orm...
swoole-orm 基于swoole的mysql协程连接池,简单封装. 实现多个协程间共用同一个协程客户端 感谢完善 [1]:nowbe -> 新增数据返回insert_id 版本 v0.0. ...
- java redis集群连接池_(08)redis之使用java客户端、spring连接redis、redis集群示例...
一.java代码连接 1.新建工程,并引入以下包: jedis-2.7.0.jar.commons-pool2-2.3.jar.junit-4.10.jar 2.单实例连接 /*** 单实例连接*/@ ...
- Memcached 客户端使用
Memcached 客户端使用 网上摘抄,以备后用 package com.test.memcache; import java.util.Date; import com.danga.MemCac ...
- SpringBoot2 Redis连接池
连接池配置 pom.xml 增加: <dependency><groupId>org.springframework.boot</groupId><artif ...
最新文章
- 小米官宣:小米11取消附送充电器!
- 浅入浅出 MySQL 索引
- 分享WordPress博客搜索引擎优化的六点经验 博客园 cnbogs
- koa-router 源码浅析
- Windows核心编程条件变量
- C#只能靠参数而不能靠返回值类型的不同来区分方法重载
- Android在片段之间传递数据
- mysql去除重复数据 重建表_MySQL 中重建mysql库中的表
- 6-5.添加HLSL顶点着色
- 国外android手机刷机国内,哪些中国安卓用户最爱刷机?
- 2017计算机考研统考,2017年计算机考研408统考真题及答案.pdf
- Firefox downloadhelper 视频下载助手
- 第二讲 综合评价分析—TOPSIS法
- Java泛型编程思想
- 在线CUR格式转换器
- 锐龙7 7840U参数 r7 7840U性能怎么样 r77840U相当于什么水平
- C ++ Hello World和可爱的无情彩虹
- Artifact “xxx - xxxx“:war exploded: 部署工件时出错。请参阅服务器日志了解详细
- 博图在线升级 gsd_《阴阳师妖怪屋》如何快速提升式神等级 式神快速升级方法大放送|阴阳师妖怪屋|如何-360GAME...
- 非项目——产出物:改变的价值