redis java客户端jedis使用总结,redisjedis,jedis是redis官
分享于 点击 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();
因为事务是在服务器端实现,而在分布式中,每批次的调用对象都可能访问不同的机器,所以,没法进行事务。
用户点评