Redis c/c++, java client连接

Redis 介绍

redis 这个想必大家都了解。关于 redis 的安装參考这里。redis 使用文档參见这里,英文文档

Redis Cclient 的用法

 Redis 的 cclient Hiredis 使用比較广泛,以下主要介绍下它。

1,Hiredis 的安装,配置

Hiredisclient 在 redis 解压后的 deps/hiredis 下有对应的文件。假设你的安装包没有对应的文件能够到这里下载

cd deps/hiredis (下载 hiredis 的话 自行解压进入 解压后的文件夹)。

make

最后 把对应的文件增加到 系统文件夹下,这样系统可以搜索到。

mkdir /usr/lib/hiredis

cp libhiredis.so /usr/lib/hiredis #将动态连接库 libhiredis.so 至 /usr/lib/hiredis

mkdir /usr/include/hiredis

cp hiredis.h /usr/include/hiredis

最后注意

须要更新一下库的 cache。运行命令:sudo ldconfig /usr/lib/

由于程序启动时,会去 /etc/ld.so.cache 来查找所要用的库,不然会出现例如以下错误:error while loading shared libraries: libhiredis.so.0.10: cannot open shared object file: No such file or directory。 关于这些知识參考这里

2。Cclient 訪问 Redis

上面的工作完毕后。就能够进行连接 hiredisserver。代码例如以下 (编译环境为 ubuntu 系统上 gcc)

// redis_test.c
#include <stdio.h>
#include <string.h>
#include <hiredis.h>

int main()
{
redisContext *c = redisConnect("127.0.0.1", 6379);// ip port
if(c->err)
{
printf("connect error.%s", c->errstr);
}
else
{
printf("connected\n");
}
char *value="It's a test";
redisReply *reply1 = redisCommand(c, "set key %s", value);
freeReplyObject(reply1);
redisReply *reply2 = redisCommand(c, "get key");
printf("key:1 value:%s\n", reply2->str);
freeReplyObject(reply2);
redisFree(c);
return 0;
}

在 linux 系统下 .o 就相当于 windows 里的 obj 文件  .a 是好多个.o 合在一起, 用于静态连接 .so 是 shared object, 用于动态连接的, 和 dll 几乎相同 。


因此说明两中编译方法:

一,採用静态链接方法

把 hiredis 编译后的 libredis.a 复制到当前程序 文件夹下,运行例如以下命令:

gcc  -o test redis_test.c   libredis.a

执行程序: ./test , 能够看到成功了。

二, 动态链接

运行例如以下命令:gcc  -o test redis_test.c   libredis.so (注意 使用共享库前要 sudo ldconfig /usr/lib/)

执行程序: ./test , 能够看到成功了。


Redis Javaclient 的用法

1。Jedis 下载

Jedis 是 Redis 的 Javaclient。Redis 中 Javaclient 使用的相对照较广泛,以下就介绍 Java 怎么链接和实验 Redis.

Jedis 下载地址在  这里  通过网址 https://github.com/xetorthio/jedis 下载 jedis 源代码。

2。编译 Jedis jar 包

通过步骤 1 下载下来的源代码发现没有 jar 包。对于编程直接使用源代码比較麻烦,如今把源代码打包为 jar 文件下次用的时候能够直接使用了。

用 eclipse 新建一个 Jedisproject 把 解压后的 redis 文件放在新建 project 的 src 文件夹下,发现缺失对应的 Commons Pool 2.2 包。须要到这里

下载可运行文件包 commons-pool2-2.2-bin.zip,解压并把 commons-pool2-2.2.jar 等依赖包 通过 build path 中的 Add External Jars 增加

到当前的 project 中,最后 export jar 包,命名为: jedis-2.4.2.jar。能够到这里下载  http://download.csdn.net/detail/gfsfg8545/7357837

3。使用 Jedis 訪问 Redis

新建 project。 在引入相关 jar 包后,仅仅要 new 一个 Jedis 对象,就能做 redis 相关操作了。来个简单的 jedis 实例:

package cn.daniel.test;
/**
 * 
 * @author Daniel
 * redis java client test.
 * time 2014-05-16 
 */

import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import redis.clients.jedis.Jedis;
public class JredisTest {

public void redisTest() {
	Jedis redis = new Jedis("172.16.0.126", 6379);// connect server: ip port
	// redis.auth("user");
	// string operator
	// set key-value
	redis.set("key1", "1");
	redis.set("key2", "2");
	// mset key-value
	redis.mset("key3", "3", "key4", "4");
	// get key-value
	System.out.println("key:key1 value:"+redis.get("key1"));
	// MGET key [key ...] 
	List&lt;String&gt; list = redis.mget("key1", "key2", "key3", "key4");
	for(String s:list) {
		System.out.println(s);
	}
	// hset key field value
	redis.hset("website", "CSDN", "http://csdn.net/");
	redis.hset("website", "Daniel", "http://blog.csdn.net/daniel_ustc");
	// hgetAll, Get all the fields and values in the hash 
	Map&lt;String, String&gt; map = redis.hgetAll("website");
	for(Entry&lt;String, String&gt; entry:map.entrySet()) {
		System.out.println("key: " + entry.getKey()+ " value: " + entry.getValue());
	}
	// quit
	redis.quit();
}// redisTest

public static void main(String[] args) {
	JredisTest test = new JredisTest();
	test.redisTest();
}

}


执行上面的程序就可以訪问 Redis。

也能够用 maven 管理 jar 包依赖,据说比較好用。


在实际使用中。通常会採用连接池的方式, 不会整个项目都使用一个 Connection。jedis pool 是基于 apache common pool 实现的。因此主要 project 中导入对应的 commons-pool2 包,代码例如以下:

package cn.ustc.daniel.test;
/**
 * @author Daniel
 * redis java client test.
 * JredisPool
 * time 2014-05-18 
 */
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class JedisPoolTest {
private static JedisPool pool=null;

/**
 * create pool
 */
private static JedisPool createJedisPool() {
	if(pool == null) {
		// 建立连接池配置參数
		JedisPoolConfig config = new JedisPoolConfig();
		//设置jedis最多连接数 
		config.setMaxTotal(100);
		// 设置最大堵塞时间,毫秒数
		config.setMaxWaitMillis(1000);
		// 设置最多空暇连接个数
		config.setMaxIdle(10);
		 // 创建连接池  ip port
        pool = new JedisPool(config, "172.16.0.11", 6379);
	}
	return pool;
}

 /**
 * 在多线程环境同步初始化
 */
private static synchronized void poolInit() {
    if (pool == null)
        pool=createJedisPool();
}

/**
 * 获取一个jedis 对象
 * 
 * @return
 */
public static Jedis getJedis() {
    if (pool == null)
        poolInit();
    return pool.getResource();
}
/**
 * 返还一个连接
 */
public static void returnRes(Jedis jedis) {
	pool.returnResource(jedis);
}

// main 
public static void main(String[] args) {
    Jedis jedis = JedisPoolTest.getJedis();

        jedis.set("name","JedisPool");
        
        String value = jedis.get("name");
        JedisPoolTest.returnRes(jedis);
        System.out.println(value);
 }
}



參考资料:

http://www.cnitblog.com/yunshichen/archive/2009/08/28/61065.html

http://flyingsnail.blog.51cto.com/5341669/1371650