redis主页上列出的java 客户端有JDBC-Redis JRedis Jedis三种,下面分别介绍三种客户端的优缺点及其他相关的工具.
| 支持redis版本 | 性能 | 维护 | 推荐 |
JDBC-Redis | not good | |||
JRedis | 1.2.n release 2.0.0 尚未release版本 | fast | ||
Jedis | 2.0.0 release | fast | actively developed | 推荐 |
JDBC-Redis
JDBC-Redis is just a JDBC wrapper for JRedis database.
If you plan on using your code with different back-ends then JDBC is a good way to go. NOTE: It is not a complete JDBC implementation and the NOSQL will bleed through.
If you are going to stay with Redis then I would suggest using the API, which will give you more flexibility. Use a DAO layer pattern to encapsulate your DB Access and down the road that is all you will need to change.
Redis syntax is completely different from standard SQL so using JDBC doesn't help encapsulating different back-ends as you suggest: I would have to write new queries anyway... – muriloq Jun 16 '10 at 14:00
@muriloq - but the mechanical acquiring and releasing resources is standard. – Romain Hippeau
spring wrapper
Spring provides a wrapper around both implementations(Jredis Jedis) and they're providing serialization/deserialization, amongst other things:
1
2
3
4
|
Person p =
new
Person(
"Joe"
,
"Trader"
,
33
);
template.convertAndSet(
"trader:1"
, p);
Person samePerson = template.getAndConvert(
"trader:1"
, Person.
class
);
Assert.assertEquals(p, samePerson);
|
放弃spring wrapper项目中本来打算使用spring wrapperbean
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中获取,解决方案:
设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<!-- 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
>
|
参考:
http://stackoverflow.com/questions/3047010/best-redis-library-for-java
https://github.com/xetorthio/johm