欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

redis java客户端jedis使用总结,redisjedis,jedis是redis官

来源: javaer 分享于  点击 16759 次 点评:74

redis java客户端jedis使用总结,redisjedis,jedis是redis官


jedis是redis官方推荐的java客户端,总结一下其大概知识点。源码,wiki

redis最简单的使用:

Jedis jedis = new Jedis("localhost");//使用redis默认端口6379jedis.set("foo", "bar");String value = jedis.get("foo");

但是jedis对象不是线程安全的,在多线程环境下会傻逼,所以官方提供了一个线程安全的连接池:

JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");

可以直接设置成静态的全局变量。

因为一直使用spring,配置一个:

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">        <property name="maxTotal" value="${redis.maxTotal}"/>        <property name="maxIdle" value="${redis.maxIdle}"/>        <property name="maxWaitMillis" value="${redis.maxWaitMillis}"/>        <property name="testOnBorrow" value="true"/>        <property name="testOnReturn" value="true"/>    </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}" />    </bean>

ok,可以开始干活了:

Jedis jedis = jedisPool.getResource();try {  /// ... do stuff here ... for example  jedis.set("foo", "bar");  String foobar = jedis.get("foo");  jedis.zadd("sose", 0, "car"); jedis.zadd("sose", 0, "bike");   Set<String> sose = jedis.zrange("sose", 0, -1);} catch (JedisConnectionException e) {    // returnBrokenResource when the state of the object is unrecoverable    if (null != jedis) {        pool.returnBrokenResource(jedis);        jedis = null;    }} finally {  /// ... it's important to return the Jedis instance to the pool once you've finished using it  if (null != jedis)    pool.returnResource(jedis);}/// ... when closing your application:pool.destroy();//如果不destroy的话,连接池中的connection将会一直连着,直到超时为止,所以在spring容器写一个destroy方法还是有必要的 

redis事务支持(transactions)。

说白了就是:我要同时干好几件事,期间不能干别的,我就把这几件事放同一个事物里。

Transaction t = jedis.multi();t.set("aaa", "111"); t.set("bbb", "222"); t.exec();

再举个官方的例子:

Transaction t = jedis.multi();t.set("fool", "bar"); Response<String> result1 = t.get("fool");t.zadd("foo", 1, "barowitch"); t.zadd("foo", 0, "barinsky"); t.zadd("foo", 0, "barikoviev");Response<Set<String>> sose = t.zrange("foo", 0, -1);   // get the entire sortedsett.exec();                                              // dont forget itString foolbar = result1.get();                       // use Response.get() to retrieve things from a Responseint soseSize = sose.get().size();                      // on sose.get() you can directly call Set methods!// List<Object> allResults = t.exec();              // you could still get all results at once, as before,最后这个方法是以前版本用的,过时了,现在都用上面的方法

返回值有点类似于线程池的submit方法得到Future对象,这个是必须在exec()方法执行完了之后才能得到结果。所以不能在事物里使用方法的返回值。

redis 管道(Pipelining)

异步执行,一次发送多个指令,不同步等待其返回结果。可以在管道中加入事物。

Pipeline p = jedis.pipelined();p.set("fool", "bar"); p.zadd("foo", 1, "barowitch");  p.zadd("foo", 0, "barinsky"); p.zadd("foo", 0, "barikoviev");Response<String> pipeString = p.get("fool");Response<Set<String>> sose = p.zrange("foo", 0, -1);p.sync(); int soseSize = sose.get().size();Set<String> setBack = sose.get();

分布式客户端(ShardedJedis)

我个人理解这东西就是个负载均衡,利用xxx哈希算法,均匀的把key存到不同redis服务器上

jedisPoolConfig与上面的一样,第二个参数是redis服务器的列表

<bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">        <constructor-arg index="0" ref="jedisPoolConfig"/>        <constructor-arg index="1">            <list>                <bean class="redis.clients.jedis.JedisShardInfo">                    <constructor-arg index="0" value="${redis.hostname}"/>                    <constructor-arg index="1" value="${redis.port}"/>                </bean>            </list>        </constructor-arg>    </bean>

使用:

ShardedJedis jedis = pool.getResource();jedis.set("a", "foo");.... // do your work herepool.returnResource(jedis);.... // a few moments laterShardedJedis jedis2 = pool.getResource();jedis.set("z", "bar");pool.returnResource(jedis);pool.destroy();

因为事务是在服务器端实现,而在分布式中,每批次的调用对象都可能访问不同的机器,所以,没法进行事务。

相关栏目:

用户点评