使用Jedis操作Redis服务器

Redis,快如闪电!

作者 Zee 日期 2017-08-08
使用Jedis操作Redis服务器

要想在Java项目中操作Redis服务器,一般采用Jedis连接工具。Jedis是Redis官方推荐的Java版客户端,它非常强大和稳定,且支持事务、管道等功能。这篇文章主要针对Jedis的使用做一个详细的『介绍』

配置篇

Jar包

使用Jar包的话,可以在此处下载Jedis的Jar包下载

另外如果需要用到JedisPool的话,还需要下载Common-pool的Jar包

至于如何在项目中导入Jar包,这里就不赘述了。

Maven中配置Jedis依赖

一般Java项目采用Maven进行一来管理。在maven项目的pom.xml中添加依赖

<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
</dependencies>

Now!开始享受Jedis吧。

应用篇

Jedis基本使用

Jedis jedis = new Jedis("localhost");
jedis.set("foo", "bar");
String value = jedis.get("foo");

JedisPool应用

创建Jedis连接池:

JedisPoolConfig config= new JedisPoolConfig();// Jedis池配置文件
config.setMaxTotal(1024); // 最大连接实例数
config.setMaxIdle(200); // 最大闲置实例数
config.setMaxWaitMillis(15000); // 等待可用连接的最大时间
config.setTestOnBorrow(true); //
JedisPool pool = new JedisPool(config,ADDR,PORT,TIMEOUT,AUTH); // 创建一个Jedis连接池

从连接池中取出实例数:

Jedis jedis = pool.getResource(); // 取出实例
jedis.set("foo","bar");
jedis.close(); // 归还实例资源给连接池

使用pipeline批量操作

由于Redis是单线程,因此上述对redis的操作模式均为:请求-响应,请求响应….。下一次请求必须等上一次请求响应回来之后才可以。在Jedis中使用管道可以改变这种模式,客户算一次发送多个命令,无需等待服务器的返回,即请求,请求,请求,响应,响应,响应这种模式。这样一来大大减小了影响性能的关键因素:网络返回时间。

具体操作如下:

Jedis jedis = new Jedis("localhost",6379,15000);
Pipeline pip = jedis.pipelined();
Map<String,String> mp = new HashMap<String, String>();
long start = System.currentTimeMillis();
for (int i = 0 ; i < 10000 ; i++){
mp.clear();
mp.put("k"+i,"v"+i);
pip.hmset("keys"+i,mp);
}

简单的测试一下,运行10000个数据的存储花费93ms左右的时间。而采用请求-响应,请求-响应的模式,操作如下:

Jedis jedis = new Jedis("localhost",6379,15000);
Map<String,String> mp = new HashMap<String, String>();
long start = System.currentTimeMillis();
for (int i = 0 ; i < 10000 ; i++){
mp.clear();
mp.put("k"+i,"v"+i);
jedis.hmset("keys"+i,mp);
}

测试时间826ms。可见大量的时间均花费在网络交互上,Redis本身的处理能力还是很强的。

Spring框架中应用Jedis

在Spring框架中使用Jedis,同样先需要在Maven中配置Jedis依赖,前面已经讲过。接下来,添加redis.properties配置文件,其内容如下:

# redis common config
redis.hostName= 127.0.0.1
redis.port=6379
redis.timeout=15000
redis.auth=

然后,在Bean标签中添加Jedis的常用配置参数,下面主要配置了JedisPool的相关属性参数。

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="1024" />
<property name="maxIdle" value="1024" />
<property name="maxWaitMillis" value="10000" />
<property name="testOnBorrow" value="true" /><!-- 向调用者输出“链接”资源时,是否检测是有有效,如果无效则从连接池中移除,并尝试获取继续获取。设为true,一个挂都不能用 -->
<property name="testOnReturn" value="true" /><!-- 向连接池“归还”链接时,是否检测“链接”对象的有效性。 -->
<property name="numTestsPerEvictionRun" value="100"/>
<property name="softMinEvictableIdleTimeMillis" value="1000" />
<property name="timeBetweenEvictionRunsMillis" value="1000"/>
<property name="minEvictableIdleTimeMillis" value="500"/>
<property name="testWhileIdle" value="true"/>
<property name="minIdle" value="10"/>
</bean>
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg index="0" ref="jedisPoolConfig" />
<constructor-arg index="1" value="${redis.hostName}" />
<constructor-arg index="2" value="${redis.port}" />
<constructor-arg index="3" value="${redis.timeout}" />
<constructor-arg index="4" value="${redis.auth}" />
</bean>

在具体实现代码中,我们采用自动注入的方式来创建JedisPool,如下:

@Autowired
private JedisPool jedisPool;

接下来,封装了几个简单的接口,作为示例:

/**
* 获取key对应的值
*
* @param key
* @return
*/
private String getKey(String key) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
String ret = jedis.get(key);
jedis.close();
return ret;
} catch (Exception e) {
if (logger.isDebugEnabled()) {
logger.debug("Redis error:", e);
}
if (jedis != null) jedis.close();
return null;
}
}
/**
* 将key,value存放在Redis服务器中
*
* @param key
* @param value
*/
private void setKey(String key, String value) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
if(key!=null && value!=null){
jedis.set(key, value);
jedis.close();
}
} catch (Exception e) {
if (logger.isDebugEnabled()) {
logger.debug("Redis error:", e);
}
if (jedis != null) jedis.close();
}
}

最后,Java不愧是最受欢迎的语言!

张程,于浙江·杭州

License: CC BY-SA 4.0