try redis(四) -java 客户端jedis 使用

不同的计算机语言针对redis,都有自己的客户端。

官网上也列出了客户端的 http://www.redis.io/clients

java客户端如下:

感觉客户端无非也就是做些连接和拼接命令的事情。所以不费心思比较哪个好了,就选第一个吧。一般第一个应该都是不错的。

选择jedis ,发现他的代码是 GitHub 托管的,开源的。地址为 https://github.com/xetorthio/jedis

找到 maven dependency

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

将上面这段 xml,拷入 pom.xml 中(maven 依赖)

发现添加了 jedis-2.6.0.jar 和 commons-pool2-2.0.jar 这两个包。一个应该是核心包,一个appache的pool包,我猜是客户端连接池用到了。具体的还得往下走。

到目前为止,准备工作都ok.跑一个简单的例子如下:

Jedis jedis = new Jedis("10.13.145.75",6379); //默认端口6379
		jedis.set("key", "HelloWorld");
		String result = jedis.get("HelloWorld");
		System.out.println(result);

注意,我这里报连接超时。

查了下,发现是redis服务器端防火墙造成的 。

service iptables stop

把防火墙关了,再执行下代码。ok.完成了。

代码很简单,直接看下 jedis 的源代码是怎么实现的吧。

当调用 jedis.set("key", "HelloWorld"); 的时候

Jedis.class 中,调用了String set(final String key, String value)

其中client  是客户端对象

/**
     * Set the string value as value of the key. The string can't be longer than
     * 1073741824 bytes (1 GB).
     * <p>
     * Time complexity: O(1)
     *
     * @param key
     * @param value
     * @return Status code reply
     */
    public String set(final String key, String value) {
	checkIsInMulti();
	client.set(key, value);
	return client.getStatusCodeReply();
    }

Client.class

    public void set(final String key, final String value) {
	set(SafeEncoder.encode(key), SafeEncoder.encode(value));
    }

其中 SafeEncoder.encode(String)是把字符串,安装utf-8字符集,转成 byte[]数组。

然后相当于调用了父类

BinaryClient.class的  public void set(final byte[] key, final byte[] value)

public void set(final byte[] key, final byte[] value) {
	sendCommand(Command.SET, key, value);
    }

Connection.class 中 sendCommand 是所有发送命令的入口。command 是个枚举对象

 protected Connection sendCommand(final Command cmd, final byte[]... args) {
	try {
	    connect();
	    Protocol.sendCommand(outputStream, cmd, args);
	    pipelinedCommands++;
	    return this;
	} catch (JedisConnectionException ex) {
	    // Any other exceptions related to connection?
	    broken = true;
	    throw ex;
	}
    }

connect()方法就是传统的socket连接服务器的代码

Protocol.class 

public static void sendCommand(final RedisOutputStream os,
	    final Command command, final byte[]... args) {
	sendCommand(os, command.raw, args);
    }

sendCommand 是所有发送命令的出口.直接给 redis-server 发送命令。说白了就是把 set key HelloWorld 的byte[] 字节发给redis-server了

为了证实自己的猜测,特意抓了个包。

发现确实如自己猜测的那样。

至于get命令,也是类似。只是最后调用了。

client.sendCommand(Protocol.Command.GET, key);

抓包也看了下。向server请求时,请求了 GET key

抓取的报文如下:

redis-server 返回的 是Hello World .

抓取的报文如下:

最后贴一下 jedis 的 类图,大概画的。

时间: 2024-10-08 20:19:17

try redis(四) -java 客户端jedis 使用的相关文章

redis的java客户端Jedis简单封装

经过我们团队的一番讨论,最终决定使用redis来进行我们的业务缓存.redis会将数据缓存到内存中,运行效率会很快.同时异步将数据写入到磁盘中,进行持久化. 且redis支持主从同步,支持分布式部署,支持N多数据结构,这对于我们有着莫大的吸引力. 参见:http://blog.csdn.net/yichenlian/article/details/27207383 我们团队讨论的焦点是在于redis的灾备恢复问题.由于redis的持久化是异步的,总会有一点时间内存中数据和磁盘数据不同步的情况(当

Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍

jedis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务.管道及有jedis自身实现的分布式. 在这里对jedis关于事务.管道和分布式的调用方式做一个简单的介绍和对比: 一.普通同步方式 最简单和基础的调用方式: 1 @Test 2 public void test1Normal() { 3 Jedis jedis = new Jedis("localhost"); 4 long start = System.curre

[转载] 使用Redis的Java客户端Jedis

转载自http://aofengblog.blog.163.com/blog/static/631702120147298317919/ 在实际的项目开发中,各种语言是使用Redis的客户端库来与Redis交互.针对Java语言,Redis官方推荐Jedis. Jedis提供了多种操作方式:单机单连接方式.单机连接池方式.多机分布式+连接池方式. 预备 jedis-2.5.2commons-pool2-2.2.jar 使用单连接 此方式仅建议用于开发环境做调试用. // 创建连接String h

使用Redis的Java客户端Jedis

转载自:http://aofengblog.blog.163.com/blog/static/631702120147298317919/ 前一篇文章<Redis命令指南>讲解了通过命令行的方式执行Key=>的存储操作,在实际的项目开发中,各种语言是使用Redis的客户端库来与Redis交互.针对Java语言,Redis官方推荐Jedis. Jedis提供了多种操作方式:单机单连接方式.单机连接池方式.多机分布式+连接池方式. 预备 jedis-2.5.2commons-pool2-2.

Redis Java客户端jedis工具类以及Redis实现的跨jvm的锁

Redis Java客户端jedis工具类以及Redis实现的跨jvm的锁 最近项目中使用redis,学习了一下,client端使用jedis-2.1.0 首先是一个redis实现的跨jvm的lock, 接着是一个简单封装的工具类,也对pipeline处理进行了几个常用的封装 然后是对应Spring的相关配置 Java代码   public class RedisLock { /** 加锁标志 */ public static final String LOCKED = "TRUE";

Redis介绍 &amp;&amp; Java客户端操作Redis

Redis介绍 && Java客户端操作Redis 本文内容 redis介绍 redis的 shell 客户端简介 redis的 java 客户端简介 环境配置 redis 2.8.17 64bit JDK1.6 redis介绍 大多数时候,我们都将 redis 称作是内存数据库,它在运行过程中,将键值对信息存储在内存中,同时在后台以异步的形式写入本地数据库中(默认是:dump.rdb,在 redis.conf 中配置,如果需要考虑安全的持久化需求需要开启 AOF 功能,详细介绍可以查看这

Tedis:淘宝的Redis的Java客户端开发包

http://www.open-open.com/lib/view/open1389880631976.html Tedis Tedis是另一个redis的java客户端 Tedis的目标是打造一个可在生产环境直接使用的高可用Redis解决方案.参见https://github.com/alibaba/tb_tddl Feature 高可用,Tedis使用多写随机读做HA确保redis的高可用 高性能,使用特殊的线程模型,使redis的性能不限制在客户端 多种使用方式,如果你只有一个redis实

Java客户端Jedis的八种调用方式

redis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务.管道及有jedis自身实现的分布式. 在这里对jedis关于事务.管道和分布式的调用方式做一个简单的介绍和对比:  一.普通同步方式 最简单和基础的调用方式, @Test  public void test1Normal() {      Jedis jedis = new Jedis("localhost");      long start = System.c

Java客户端Jedis

使用Jedis的Java客户端 maven依赖 <!-- jedis --> <dependency> <groupid>redis.clients</groupid> jedis</artifactid> <version>2.9.0</version> </dependency> <!-- fastjson --> <dependency> <groupid>com.al