欢迎来到天天文库
浏览记录
ID:34102558
大小:56.98 KB
页数:4页
时间:2019-03-03
《jedis使用总结【pipeline】【分布式的id生成器】【分布式锁【watch】【multi】】【red》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Jedis使用总结作者:Teaev微博:http://weibo.com/teaev前段时间细节的了解了Jedis的使用,Jedis是redis的java版本的客户端实现。本文做个总结,主要分享如下内容:[pipeline]【分布式的id生成器】【分布式锁【watch][multi]][redis分布式】好了,一个一个来。一、Pipeline官方的说明是:startsapipeline,whichisaveryefficientwaytosendlotsofcommandandreadalltheresponseswhenyoufinishsendingtherrio简单
2、点说pipeline适用于批处理。当有大量的操作需要一次性执行的时候,可以用管道。示例:Jedisjedis=newJedis(String,int);Pipelinep=jedis.pipelined();p.set(key,value);//每个操作都发送请求给redis-serverp.get(key,value);p.sync();//这段代码获取所有的response这里我进行了20w次连续操作(10w读,10w写),不用pipeline耗时:187242ms,用pipeline耗时:1188ms,可见使用管道后的性能上了一个台阶。看了代码了解到,管道通过一次性
3、写入请求,然后一次性读取响应。也就是说jedis是:requestresponse,requestresponse,...;pipeline则是:requestrequest...responseresponseWzfx'io这样无需每次请求都等待server端的响应。二、跨jvm的id生成器谈到这个话题,首先要知道redis-server端是单线程来处理client端的请求的。这样来实现一个id生成器就非常简单了,只要简单的调用jdeis.incr(key);就搞定了。你或许会问,incr是原子操作吗,能保证不会出现并发问题吗,不是说了吗,server端是单线程处理请求
4、的。三、【跨jvm的锁实现【watch][multi]]首先说下这个问题的使用场景,有些时候我们业务逻辑是在不同的jvm进程甚至是不同的物理机上的jvm处理的。这样如何來实现不同jvm±的同步问题呢,其实我们可以慕于redis来实现一个锁。具体事务和监听请参考文章:redis学习笔记之事务暂时找到三种实现方式:1.通jedis.setnx(key,value)实现importjava.util.Random;importorg.apache.commons.pool.impl.GenericObjectPool.Config;importredis.dients.jedi
5、s.Jedis;importredis.clients.jedis.JedisPool;importredis.dients.jedis.Transaction;*@authorTeaey*/publicclassRedisLock{〃加锁标志publicstaticfinalStringLOCKED=”TRUE”;publicstaticfinallongONE_MILLI_NANOS=1000000L;〃默认超时时间(毫秒)publicstaticfinallongDEFAULT_TIME_OUT=3000;publicstaticJedisPoolpool;publ
6、icstaticfinalRandomr=newRandom();〃锁的超时时间(秒),过期删除publicstaticfinalintEXPIRE=5*60;static{pool=newJedisPool(newConfig(),"host蔦6379);}privateJedisjedis;privateStringkey;〃锁状态标志privatebooleanlocked=false;publicRedisLock(Stringkey){this.key=key;this.jedis=pool.getResource();}publicbooleanlock(lo
7、ngtimeout){longnano=System.nanoTime();timeout*=ONE_MILLI_NANOS;try{while((System.nanoTime()-nano)
此文档下载收益归作者所有