返回顶部

收藏

redis java客户端jedis使用总结

更多

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

redis最简单的使用:

Jedis jedis = new Jedis("localhost");//使用redis默认端口6379
jedis.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 sortedset
t.exec();                                              // dont forget it

String foolbar = result1.get();                       // use Response.get() to retrieve things from a Response
int 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 here
pool.returnResource(jedis);
.... // a few moments later
ShardedJedis jedis2 = pool.getResource();
jedis.set("z", "bar");
pool.returnResource(jedis);
pool.destroy();

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

标签:redis,java,jedis

收藏

0人收藏

支持

0

反对

0

相关聚客文章
  1. 赵 伊凡 发表 2015-11-05 09:25:28 记一次Redis使用超时时间异常
  2. 博主 发表 2018-03-15 13:44:04 Jedis常见异常汇总
  3. crossoverJie 发表 2018-06-20 15:46:42 Guava 源码分析之Cache的实现原理
  4. neo 发表 2014-06-28 11:29:19 构建一个类timeline系统的架构设计
  5. 博主 发表 2018-03-17 04:59:18 JedisPool资源池优化
  6. 黄理 发表 2018-04-24 06:06:01 阿里巴巴开源框架-通用缓存访问JetCache介绍
  7. Alexander Mahone 发表 2015-11-21 13:38:22 《Redis官方文档》分区
  8. 博主 发表 2017-11-01 12:28:05 使用Redis实现分布式锁及其优化
  9. neo 发表 2014-06-28 11:29:19 构建一个类timeline系统的架构设计
  10. 博主 发表 2014-10-24 03:21:49 redis-toolkit:Java实现的redis工具(一)
  11. Alexander Mahone 发表 2015-12-05 13:35:58 《Redis官方文档》持久化
  12. liuchi1993 发表 2016-04-22 04:32:50 Jedis对redis的操作详解

发表评论