5.0 Jedis简介

2016-03-20 19:55:16 4,622 1

在此之前我们进行的操作都是通过Redis的命令行客户端redis-cli进行的,并没有介绍实际编程时如何操作Redis。

本章将会介绍Java客户端的使用方法。

5.1.1 Jedis简介

Jedis其实可以理解为一个驱动,想一想我们在使用 java链接mysql 数据库的时候,是不是需要使用驱动: mysql-connector-java-5.1.2-bin.jar。

同样作为数据库,java链接Redis 也是需要需要驱动的,这个驱动就是 Jedis。

事实上,Redis对几十种编程语言客户端提供了支持。基本上,主流的编程语言都可以操作 redis。

在http://www.redis.cn/clients.html上可以查看redis对哪些编程语言提供了支持。以 java为例,有四种方式都可以去操作 redis.

Image.png

事实上,Redis对几十种编程语言客户端提供了支持。基本上,主流的编程语言都可以操作 redis。

官方建议是使用 Jedis,J 代表的就是Java。

5.1.2 下载安装Jedis

Maven用户:

在pom.xml文件中添加

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

非Maven用户:

Jedis所有版本的下载地址为: https://github.com/xetorthio/jedis/releases

本文使用的是最新版本 V2.6.2

下载完成之后,进入 src\main\java,将里面的redis 文件夹拷贝到项目的 src目录下。此外你还要导入另外一个 jar, commons-pool2-2.0.jar ,Jedis需要依赖这个 jar才能编译成功。

5.1.3 HelloRedis

关于以下代码,暂时不用深究,只是为了测试开发环境是否搭建成功,后面的教程中会有详细的讲解。

package com.tianshouzhi;

import redis.clients.jedis.Jedis;
/**
 * HelloRedis :
 * 第一个 Redis案例:向 Redis 中存储一个键值对,然后再查询出来并打印
 * @author tianshouzhi
 *
 */
public class HelloRedis {
          public static void main(String[] args ) {
                   
                  //Connecting to Redis server on localhost
                                  Jedis jedis = new Jedis("localhost");
                                  System.out.println("Connection to server sucessfully");
                                  //check whether server is running or not
                                  System.out.println("Server is running: "+jedis.ping());
         }
}

运行代码,如果你的控制台打印出来以下内容

Connection to server sucessfully
Server is running: PONG

恭喜你,你已经成功的进行了一次 java对redis 进行的操作。同时证明我们了我们的开发环境已经搭建好。

说明:Jedis对象是在 java中操作redis 最核心的类,当 new的时候,就与服务器建立了连接。在后面的代码中,我们将不会再重复这个 new的过程,只介绍其api如何使用。

5.1.4可能的异常

如果你出现了异常ConnectionTimeoutException,连接超时异常,那么可能是:
1、 因为你的ip地址输错,使用ifconfig可以查看你的linux的ip地址信息
2、 如果不是第一个原因,则可能是因为你的服务器防火墙没有针对6379端口开放,redis默认监听的就是这个端口,为了方便,可以选择直接关闭防火墙.命令为:service iptables stop

3、如果redis-server不是在6379端口启动,那么使用redis-cli连接的时候需要指定端口号。同理,这种情况下,使用java操作redis,也要指定端口等信息。

5.1.5Jedis设计

Jedis作为推荐的java语言redis客户端,其抽象封装为三部分:

  • 对象池设计:Pool,JedisPool,GenericObjectPool,BasePoolableObjectFactory,JedisFactory

  • 面向用户的redis操作封装:BinaryJedisCommands,JedisCommands,BinaryJedis,Jedis

  • 面向redis服务器的操作封装:Commands,Client,BinaryClient,Connection,Protocol

其类设计图如下:

cd3e4917-0dd5-3de9-9a7d-3781c2c246a6.jpg

关于common-pool的相关内容,可以参见:http://macrochen.iteye.com/blog/320077

其他类的设计作用如下:

类名职责
Pool抽象Jedis对象池操作;并委托给操作给GenericObjectPool
JedisPool实现Pool并提供JedisFactory工厂
JedisFactory实现BasePoolableObjectFactory,提供创建,销毁Jedis方法
BinaryJedisCommands抽象面向客户端操作的Redis命令;key,value都为序列化后的byte数组
JedisCommands抽象面向客户端操作的Redis命令;提供String类型的key,value
BinaryJedis实现BinaryJedisCommands接口,并将实际操作委托给Client
Jedis实现JedisCommands接口,并将操作委托给Client
Commands抽象Redis操作接口,提供String类型的key,value操作;被Jedis调用
Connection抽象了Redis连接;包括host,port,pass,socket,inputstream,outputstream,protocol 完成与Redis服务器的通信
Protocol抽象了Redis协议处理
BinaryClient继承Connection类,封装了基于Byte[]的key,value操作
Client继承BinaryClient同时实现了Commands,对上层提供基于String类型的操作

参考:

http://yychao.iteye.com/blog/1751583