使用jedis java客户端
一:一个简单的示例代码:
[java]
view plain
copy
public
static
void
main(String[] args) {
Jedis jedis = new
Jedis(
"147.151.240.234"
,
6379
);
jedis.set("foo"
,
"bar"
);
String value = jedis.get("foo"
);
System.out.println(value);
}
二:spring中配置
:
首先,在项目中引入jeids的jar包。
Xml代码
<!-- java readis客户端 -->
<
dependency
>
<
groupId
>
redis.clients
</
groupId
>
<
artifactId
>
jedis
</
artifactId
>
<
version
>
2.0.0
</
version
>
</
dependency
>
其次,在spring配置文件中添加配置(也可以直接new出这些对象,一样的)
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxActive" value="50" />
<property name="maxIdle" value="10" />
<property name="maxWait" value="1000" />
<property name="testOnBorrow" value="true"/>
</bean>
<bean id="jedis.shardInfo" class="redis.clients.jedis.JedisShardInfo">
<constructor-arg index="0" value="这里填你的reids服务器ip" />
<constructor-arg index="1" value="6379" />
</bean>
<bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
<constructor-arg index="0" ref="jedisPoolConfig" />
<constructor-arg index="1">
<list>
<ref bean="jedis.shardInfo" />
</list>
</constructor-arg>
</bean>
最后,调用的时候
Java代码
ShardedJedis jedis = shardedJedisPool.getResource();
jedis.get(key); //从redis服务器获取值
jedis.set(key, value); //将值保存到redis服务器
jedis pool的问题
在使用jedis pool时遇到了这个问题:It seems like server has closed the connection
原因分析:
1.redis server 关闭了此客户端的连接:server端设置了maxidletime(默认是5分钟),服务端会不断循环检测clinet的最后一次通信时间(lastinteraction),如果大于maxidletime,则关闭连接,并回收相关资源。client在向该连接中写数据后就会由于server端已经关闭而出现 broken pipe的问题。
2.pool的设置错误:
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxActive" value="20" />
<property name="maxIdle" value="10" />
<property name="maxWait" value="1000" />
</bean>
<!-- jedis shard信息配置 -->
<bean id="jedis.shardInfo" class="redis.clients.jedis.JedisShardInfo">
<constructor-arg index="0" value="*.*.*.*" />
<constructor-arg index="1" value="6379" />
</bean>
<!-- jedis shard pool配置 -->
<bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
<constructor-arg index="0" ref="jedisPoolConfig" />
<constructor-arg index="1">
<list>
<ref bean="jedis.shardInfo" />
</list>
</constructor-arg>
</bean>
<bean id="jedisCommands" factory-bean="shardedJedisPool"
factory-method="getResource" />
上面的这种配法在spring初始化时获取一次实例化jedisCommands,而后每次的redis的调用时并未从pool中获取
解决方案:
设置
<!-- POOL配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxActive" value="20" />
<property name="maxIdle" value="10" />
<property name="maxWait" value="1000" />
<property name="testOnBorrow" value="true"/>
</bean>
<!-- jedis shard信息配置 -->
<bean id="jedis.shardInfo" class="redis.clients.jedis.JedisShardInfo">
<constructor-arg index="0" value="*.*.*.*" />
<constructor-arg index="1" value="6379" />
</bean>
<!-- jedis shard pool配置 -->
<bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
<constructor-arg index="0" ref="jedisPoolConfig" />
<constructor-arg index="1">
<list>
<ref bean="jedis.shardInfo" />
</list>
</constructor-arg>
</bean>
最近初次尝试使用redis,java客户端采用的jedis,写了几个简单的类满足基本的服务器配置,以及客户端对象的使用等。
客户端对象的创建
[java]
view plain
copy
package
jediscache.common;
import
redis.clients.jedis.Jedis;
import
redis.clients.jedis.JedisPool;
import
redis.clients.jedis.JedisPoolConfig;
import
redis.clients.jedis.Protocol;
public
class
JedisFactory {
private
JedisPoolConfig jedisPoolConfig;
private
JedisPool jedisPool;
public
JedisFactory(JedisPoolConfig jedisPoolConfig) {
super
();
this
.jedisPoolConfig = jedisPoolConfig;
}
public
Jedis getJedisInstance(String host) {
return
getJedisPool(host, Protocol.DEFAULT_PORT).getResource();
}
public
Jedis getJedisInstance(String host,
int
port) {
return
getJedisPool(host, port).getResource();
}
public
JedisPool getJedisPool(String host) {
return
getJedisPool(host, Protocol.DEFAULT_PORT);
}
public
JedisPool getJedisPool(String host,
int
port) {
if
(jedisPool ==
null
) {
jedisPool = new
JedisPool(jedisPoolConfig, host, port);
}
return
jedisPool;
}
/**
* 配合使用getJedisInstance方法后将jedis对象释放回连接池中
*
* @param jedis 使用完毕的Jedis对象
* @return true 释放成功;否则返回false
*/
public
boolean
release(Jedis jedis) {
if
(jedisPool !=
null
&& jedis !=
null
) {
jedisPool.returnResource(jedis);
return
true
;
}
return
false
;
}
}
使用客户端对象
[java]
view plain
copy
public
void
testLpush() {
JedisFactory factory = new
JedisFactory(
new
JedisPoolConfig());
Jedis jedis = factory.getJedisInstance("localhost"
);
try
{
String word = "word"
;
jedis.lpush(word, "first"
);
jedis.lpush(word, "second"
);
jedis.lpush(word, "three"
);
System.out.println("word : "
+ jedis.lrange(word,
0
, -
1
));
} finally
{
factory.release(jedis);
}
}
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com