`
hulianwang2014
  • 浏览: 690684 次
文章分类
社区版块
存档分类
最新评论
  • bcworld: 排版成这样,一点看的欲望都没有了
    jfinal

java操作redis。jedis使用api

 
阅读更多

Jedis 是 Redis 官方首选的 Java 客户端开发包。

工作过程总结的一个示例,贴出来,如下:

Java代码收藏代码
  1. packagecom.wujintao.redis;
  2. importjava.util.Date;
  3. importjava.util.HashMap;
  4. importjava.util.Iterator;
  5. importjava.util.List;
  6. importjava.util.Map;
  7. importjava.util.Set;
  8. importorg.junit.Test;
  9. importredis.clients.jedis.Jedis;
  10. importredis.clients.jedis.Pipeline;
  11. importredis.clients.jedis.SortingParams;
  12. importcom.wujintao.redis.util.RedisUtil;
  13. publicclassTestCase{
  14. /**
  15. *在不同的线程中使用相同的Jedis实例会发生奇怪的错误。但是创建太多的实现也不好因为这意味着会建立很多sokcet连接,
  16. *也会导致奇怪的错误发生。单一Jedis实例不是线程安全的。为了避免这些问题,可以使用JedisPool,
  17. *JedisPool是一个线程安全的网络连接池。可以用JedisPool创建一些可靠Jedis实例,可以从池中拿到Jedis的实例。
  18. *这种方式可以解决那些问题并且会实现高效的性能
  19. */
  20. publicstaticvoidmain(String[]args){
  21. //...whenclosingyourapplication:
  22. RedisUtil.getPool().destroy();
  23. }
  24. publicstaticvoidHello(){
  25. Jedisjedis=RedisUtil.getJedis();
  26. try{
  27. //向key-->name中放入了value-->minxr
  28. jedis.set("name","minxr");
  29. Stringss=jedis.get("name");
  30. System.out.println(ss);
  31. //很直观,类似map将jintaoappend到已经有的value之后
  32. jedis.append("name","jintao");
  33. ss=jedis.get("name");
  34. System.out.println(ss);
  35. //2、直接覆盖原来的数据
  36. jedis.set("name","jintao");
  37. System.out.println(jedis.get("jintao"));
  38. //删除key对应的记录
  39. jedis.del("name");
  40. System.out.println(jedis.get("name"));//执行结果:null
  41. /**
  42. *mset相当于jedis.set("name","minxr");jedis.set("jarorwar","aaa");
  43. */
  44. jedis.mset("name","minxr","jarorwar","aaa");
  45. System.out.println(jedis.mget("name","jarorwar"));
  46. }catch(Exceptione){
  47. e.printStackTrace();
  48. }finally{
  49. RedisUtil.getPool().returnResource(jedis);
  50. }
  51. }
  52. privatevoidtestKey(){
  53. Jedisjedis=RedisUtil.getJedis();
  54. System.out.println("=============key==========================");
  55. //清空数据
  56. System.out.println(jedis.flushDB());
  57. System.out.println(jedis.echo("foo"));
  58. //判断key否存在
  59. System.out.println(jedis.exists("foo"));
  60. jedis.set("key","values");
  61. System.out.println(jedis.exists("key"));
  62. }
  63. publicstaticvoidtestString(){
  64. System.out.println("==String==");
  65. Jedisjedis=RedisUtil.getJedis();
  66. try{
  67. //String
  68. jedis.set("key","HelloWorld!");
  69. Stringvalue=jedis.get("key");
  70. System.out.println(value);
  71. }catch(Exceptione){
  72. e.printStackTrace();
  73. }finally{
  74. RedisUtil.getPool().returnResource(jedis);
  75. }
  76. System.out.println("=============String==========================");
  77. //清空数据
  78. System.out.println(jedis.flushDB());
  79. //存储数据
  80. jedis.set("foo","bar");
  81. System.out.println(jedis.get("foo"));
  82. //若key不存在,则存储
  83. jedis.setnx("foo","foonotexits");
  84. System.out.println(jedis.get("foo"));
  85. //覆盖数据
  86. jedis.set("foo","fooupdate");
  87. System.out.println(jedis.get("foo"));
  88. //追加数据
  89. jedis.append("foo","hello,world");
  90. System.out.println(jedis.get("foo"));
  91. //设置key的有效期,并存储数据
  92. jedis.setex("foo",2,"foonotexits");
  93. System.out.println(jedis.get("foo"));
  94. try{
  95. Thread.sleep(3000);
  96. }catch(InterruptedExceptione){
  97. }
  98. System.out.println(jedis.get("foo"));
  99. //获取并更改数据
  100. jedis.set("foo","fooupdate");
  101. System.out.println(jedis.getSet("foo","foomodify"));
  102. //截取value的值
  103. System.out.println(jedis.getrange("foo",1,3));
  104. System.out.println(jedis.mset("mset1","mvalue1","mset2","mvalue2",
  105. "mset3","mvalue3","mset4","mvalue4"));
  106. System.out.println(jedis.mget("mset1","mset2","mset3","mset4"));
  107. System.out.println(jedis.del(newString[]{"foo","foo1","foo3"}));
  108. }
  109. publicstaticvoidtestList(){
  110. System.out.println("==List==");
  111. Jedisjedis=RedisUtil.getJedis();
  112. try{
  113. //开始前,先移除所有的内容
  114. jedis.del("messages");
  115. jedis.rpush("messages","Hellohowareyou?");
  116. jedis.rpush("messages","Finethanks.I'mhavingfunwithredis.");
  117. jedis.rpush("messages","IshouldlookintothisNOSQLthingASAP");
  118. //再取出所有数据jedis.lrange是按范围取出,
  119. //第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度-1表示取得所有
  120. List<String>values=jedis.lrange("messages",0,-1);
  121. System.out.println(values);
  122. }catch(Exceptione){
  123. e.printStackTrace();
  124. }finally{
  125. RedisUtil.getPool().returnResource(jedis);
  126. }
  127. //清空数据
  128. System.out.println(jedis.flushDB());
  129. //添加数据
  130. jedis.lpush("lists","vector");
  131. jedis.lpush("lists","ArrayList");
  132. jedis.lpush("lists","LinkedList");
  133. //数组长度
  134. System.out.println(jedis.llen("lists"));
  135. //排序
  136. System.out.println(jedis.sort("lists"));
  137. //字串
  138. System.out.println(jedis.lrange("lists",0,3));
  139. //修改列表中单个值
  140. jedis.lset("lists",0,"hellolist!");
  141. //获取列表指定下标的值
  142. System.out.println(jedis.lindex("lists",1));
  143. //删除列表指定下标的值
  144. System.out.println(jedis.lrem("lists",1,"vector"));
  145. //删除区间以外的数据
  146. System.out.println(jedis.ltrim("lists",0,1));
  147. //列表出栈
  148. System.out.println(jedis.lpop("lists"));
  149. //整个列表值
  150. System.out.println(jedis.lrange("lists",0,-1));
  151. }
  152. publicstaticvoidtestSet(){
  153. System.out.println("==Set==");
  154. Jedisjedis=RedisUtil.getJedis();
  155. try{
  156. jedis.sadd("myset","1");
  157. jedis.sadd("myset","2");
  158. jedis.sadd("myset","3");
  159. jedis.sadd("myset","4");
  160. Set<String>setValues=jedis.smembers("myset");
  161. System.out.println(setValues);
  162. //移除noname
  163. jedis.srem("myset","4");
  164. System.out.println(jedis.smembers("myset"));//获取所有加入的value
  165. System.out.println(jedis.sismember("myset","4"));//判断minxr
  166. //是否是sname集合的元素
  167. System.out.println(jedis.scard("sname"));//返回集合的元素个数
  168. }catch(Exceptione){
  169. e.printStackTrace();
  170. }finally{
  171. RedisUtil.getPool().returnResource(jedis);
  172. }
  173. //清空数据
  174. System.out.println(jedis.flushDB());
  175. //添加数据
  176. jedis.sadd("sets","HashSet");
  177. jedis.sadd("sets","SortedSet");
  178. jedis.sadd("sets","TreeSet");
  179. //判断value是否在列表中
  180. System.out.println(jedis.sismember("sets","TreeSet"));
  181. ;
  182. //整个列表值
  183. System.out.println(jedis.smembers("sets"));
  184. //删除指定元素
  185. System.out.println(jedis.srem("sets","SortedSet"));
  186. //出栈
  187. System.out.println(jedis.spop("sets"));
  188. System.out.println(jedis.smembers("sets"));
  189. //
  190. jedis.sadd("sets1","HashSet1");
  191. jedis.sadd("sets1","SortedSet1");
  192. jedis.sadd("sets1","TreeSet");
  193. jedis.sadd("sets2","HashSet2");
  194. jedis.sadd("sets2","SortedSet1");
  195. jedis.sadd("sets2","TreeSet1");
  196. //交集
  197. System.out.println(jedis.sinter("sets1","sets2"));
  198. //并集
  199. System.out.println(jedis.sunion("sets1","sets2"));
  200. //差集
  201. System.out.println(jedis.sdiff("sets1","sets2"));
  202. }
  203. publicstaticvoidsortedSet(){
  204. System.out.println("==SoretedSet==");
  205. Jedisjedis=RedisUtil.getJedis();
  206. try{
  207. jedis.zadd("hackers",1940,"AlanKay");
  208. jedis.zadd("hackers",1953,"RichardStallman");
  209. jedis.zadd("hackers",1965,"YukihiroMatsumoto");
  210. jedis.zadd("hackers",1916,"ClaudeShannon");
  211. jedis.zadd("hackers",1969,"LinusTorvalds");
  212. jedis.zadd("hackers",1912,"AlanTuring");
  213. Set<String>setValues=jedis.zrange("hackers",0,-1);
  214. System.out.println(setValues);
  215. Set<String>setValues2=jedis.zrevrange("hackers",0,-1);
  216. System.out.println(setValues2);
  217. }catch(Exceptione){
  218. e.printStackTrace();
  219. }finally{
  220. RedisUtil.getPool().returnResource(jedis);
  221. }
  222. //清空数据
  223. System.out.println(jedis.flushDB());
  224. //添加数据
  225. jedis.zadd("zset",10.1,"hello");
  226. jedis.zadd("zset",10.0,":");
  227. jedis.zadd("zset",9.0,"zset");
  228. jedis.zadd("zset",11.0,"zset!");
  229. //元素个数
  230. System.out.println(jedis.zcard("zset"));
  231. //元素下标
  232. System.out.println(jedis.zscore("zset","zset"));
  233. //集合子集
  234. System.out.println(jedis.zrange("zset",0,-1));
  235. //删除元素
  236. System.out.println(jedis.zrem("zset","zset!"));
  237. System.out.println(jedis.zcount("zset",9.5,10.5));
  238. //整个集合值
  239. System.out.println(jedis.zrange("zset",0,-1));
  240. }
  241. publicstaticvoidtestHsh(){
  242. System.out.println("==Hash==");
  243. Jedisjedis=RedisUtil.getJedis();
  244. try{
  245. Map<String,String>pairs=newHashMap<String,String>();
  246. pairs.put("name","Akshi");
  247. pairs.put("age","2");
  248. pairs.put("sex","Female");
  249. jedis.hmset("kid",pairs);
  250. List<String>name=jedis.hmget("kid","name");//结果是个泛型的LIST
  251. //jedis.hdel("kid","age");//删除map中的某个键值
  252. System.out.println(jedis.hmget("kid","pwd"));//因为删除了,所以返回的是null
  253. System.out.println(jedis.hlen("kid"));//返回key为user的键中存放的值的个数
  254. System.out.println(jedis.exists("kid"));//是否存在key为user的记录
  255. System.out.println(jedis.hkeys("kid"));//返回map对象中的所有key
  256. System.out.println(jedis.hvals("kid"));//返回map对象中的所有value
  257. Iterator<String>iter=jedis.hkeys("kid").iterator();
  258. while(iter.hasNext()){
  259. Stringkey=iter.next();
  260. System.out.println(key+":"+jedis.hmget("kid",key));
  261. }
  262. List<String>values=jedis.lrange("messages",0,-1);
  263. values=jedis.hmget("kid",newString[]{"name","age","sex"});
  264. System.out.println(values);
  265. Set<String>setValues=jedis.zrange("hackers",0,-1);
  266. setValues=jedis.hkeys("kid");
  267. System.out.println(setValues);
  268. values=jedis.hvals("kid");
  269. System.out.println(values);
  270. pairs=jedis.hgetAll("kid");
  271. System.out.println(pairs);
  272. }catch(Exceptione){
  273. e.printStackTrace();
  274. }finally{
  275. RedisUtil.getPool().returnResource(jedis);
  276. }
  277. //清空数据
  278. System.out.println(jedis.flushDB());
  279. //添加数据
  280. jedis.hset("hashs","entryKey","entryValue");
  281. jedis.hset("hashs","entryKey1","entryValue1");
  282. jedis.hset("hashs","entryKey2","entryValue2");
  283. //判断某个值是否存在
  284. System.out.println(jedis.hexists("hashs","entryKey"));
  285. //获取指定的值
  286. System.out.println(jedis.hget("hashs","entryKey"));//批量获取指定的值
  287. System.out.println(jedis.hmget("hashs","entryKey","entryKey1"));
  288. //删除指定的值
  289. System.out.println(jedis.hdel("hashs","entryKey"));
  290. //为key中的域field的值加上增量increment
  291. System.out.println(jedis.hincrBy("hashs","entryKey",123l));
  292. //获取所有的keys
  293. System.out.println(jedis.hkeys("hashs"));
  294. //获取所有的values
  295. System.out.println(jedis.hvals("hashs"));
  296. }
  297. publicstaticvoidtestOther()throwsInterruptedException{
  298. Jedisjedis=RedisUtil.getJedis();
  299. try{
  300. //keys中传入的可以用通配符
  301. System.out.println(jedis.keys("*"));//返回当前库中所有的key[sose,sanme,
  302. //name,jarorwar,foo,
  303. //sname,javaframework,
  304. //user,braand]
  305. System.out.println(jedis.keys("*name"));//返回的sname[sname,name]
  306. System.out.println(jedis.del("sanmdde"));//删除key为sanmdde的对象删除成功返回1
  307. //删除失败(或者不存在)返回0
  308. System.out.println(jedis.ttl("sname"));//返回给定key的有效时间,如果是-1则表示永远有效
  309. jedis.setex("timekey",10,"min");//通过此方法,可以指定key的存活(有效时间)时间为秒
  310. Thread.sleep(5000);//睡眠5秒后,剩余时间将为<=5
  311. System.out.println(jedis.ttl("timekey"));//输出结果为5
  312. jedis.setex("timekey",1,"min");//设为1后,下面再看剩余时间就是1了
  313. System.out.println(jedis.ttl("timekey"));//输出结果为1
  314. System.out.println(jedis.exists("key"));//检查key是否存在
  315. System.out.println(jedis.rename("timekey","time"));
  316. System.out.println(jedis.get("timekey"));//因为移除,返回为null
  317. System.out.println(jedis.get("time"));//因为将timekey重命名为time
  318. //所以可以取得值min
  319. //jedis排序
  320. //注意,此处的rpush和lpush是List的操作。是一个双向链表(但从表现来看的)
  321. jedis.del("a");//先清除数据,再加入数据进行测试
  322. jedis.rpush("a","1");
  323. jedis.lpush("a","6");
  324. jedis.lpush("a","3");
  325. jedis.lpush("a","9");
  326. System.out.println(jedis.lrange("a",0,-1));//[9,3,6,1]
  327. System.out.println(jedis.sort("a"));//[1,3,6,9]//输入排序后结果
  328. System.out.println(jedis.lrange("a",0,-1));
  329. }catch(Exceptione){
  330. e.printStackTrace();
  331. }finally{
  332. RedisUtil.getPool().returnResource(jedis);
  333. }
  334. }
  335. @org.junit.Test
  336. publicvoidtestUnUsePipeline(){
  337. longstart=newDate().getTime();
  338. Jedisjedis=RedisUtil.getJedis();
  339. for(inti=0;i<10000;i++){
  340. jedis.set("age1"+i,i+"");
  341. jedis.get("age1"+i);//每个操作都发送请求给redis-server
  342. }
  343. longend=newDate().getTime();
  344. System.out.println("unusepipelinecost:"+(end-start)+"ms");
  345. RedisUtil.getPool().returnResource(jedis);
  346. }
  347. @org.junit.Test
  348. /**
  349. *参考:http://blog.csdn.net/freebird_lb/article/details/7778919
  350. */
  351. publicvoidtestUsePipeline(){
  352. longstart=newDate().getTime();
  353. Jedisjedis=RedisUtil.getJedis();
  354. jedis.flushDB();
  355. Pipelinep=jedis.pipelined();
  356. for(inti=0;i<10000;i++){
  357. p.set("age2"+i,i+"");
  358. System.out.println(p.get("age2"+i));
  359. }
  360. p.sync();//这段代码获取所有的response
  361. longend=newDate().getTime();
  362. System.out.println("usepipelinecost:"+(end-start)+"ms");
  363. RedisUtil.getPool().returnResource(jedis);
  364. }
  365. @org.junit.Test
  366. /**
  367. *时间复杂度:
  368. O(N+M*log(M)),N为要排序的列表或集合内的元素数量,M为要返回的元素数量。
  369. 如果只是使用SORT命令的GET选项获取数据而没有进行排序,时间复杂度O(N)。
  370. */
  371. publicvoidtestSort1(){
  372. //排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较
  373. Jedisredis=RedisUtil.getJedis();
  374. //一般SORT用法最简单的SORT使用方法是SORTkey。
  375. redis.lpush("mylist","1");
  376. redis.lpush("mylist","4");
  377. redis.lpush("mylist","6");
  378. redis.lpush("mylist","3");
  379. redis.lpush("mylist","0");
  380. //List<String>list=redis.sort("sort");//默认是升序
  381. SortingParamssortingParameters=newSortingParams();
  382. sortingParameters.desc();
  383. //sortingParameters.alpha();//当数据集中保存的是字符串值时,你可以用ALPHA
  384. //修饰符(modifier)进行排序。
  385. sortingParameters.limit(0,2);//可用于分页查询
  386. List<String>list=redis.sort("mylist",sortingParameters);//默认是升序
  387. for(inti=0;i<list.size();i++){
  388. System.out.println(list.get(i));
  389. }
  390. redis.flushDB();
  391. RedisUtil.closeJedis(redis);
  392. }
  393. @org.junit.Test
  394. /**
  395. *sortlist
  396. *LIST结合hash的排序
  397. */
  398. publicvoidtestSort2(){
  399. Jedisjedis=RedisUtil.getJedis();
  400. jedis.del("user:66","user:55","user:33","user:22","user:11",
  401. "userlist");
  402. jedis.lpush("userlist","33");
  403. jedis.lpush("userlist","22");
  404. jedis.lpush("userlist","55");
  405. jedis.lpush("userlist","11");
  406. jedis.hset("user:66","name","66");
  407. jedis.hset("user:55","name","55");
  408. jedis.hset("user:33","name","33");
  409. jedis.hset("user:22","name","79");
  410. jedis.hset("user:11","name","24");
  411. jedis.hset("user:11","add","beijing");
  412. jedis.hset("user:22","add","shanghai");
  413. jedis.hset("user:33","add","guangzhou");
  414. jedis.hset("user:55","add","chongqing");
  415. jedis.hset("user:66","add","xi'an");
  416. SortingParamssortingParameters=newSortingParams();
  417. //符号"->"用于分割哈希表的键名(keyname)和索引域(hashfield),格式为"key->field"。
  418. sortingParameters.get("user:*->name");
  419. sortingParameters.get("user:*->add");
  420. //sortingParameters.by("user:*->name");
  421. //sortingParameters.get("#");
  422. List<String>result=jedis.sort("userlist",sortingParameters);
  423. for(Stringitem:result){
  424. System.out.println("item...."+item);
  425. }
  426. /**
  427. *对应的redis客户端命令是:sortmlgetuser*->namesortmlgetuser:*->nameget
  428. *user:*->add
  429. */
  430. }
  431. @org.junit.Test
  432. /**
  433. *sortset
  434. *SET结合String的排序
  435. */
  436. publicvoidtestSort3(){
  437. Jedisjedis=RedisUtil.getJedis();
  438. jedis.del("tom:friend:list","score:uid:123","score:uid:456",
  439. "score:uid:789","score:uid:101","uid:123","uid:456",
  440. "uid:789","uid:101");
  441. jedis.sadd("tom:friend:list","123");//tom的好友列表
  442. jedis.sadd("tom:friend:list","456");
  443. jedis.sadd("tom:friend:list","789");
  444. jedis.sadd("tom:friend:list","101");
  445. jedis.set("score:uid:123","1000");//好友对应的成绩
  446. jedis.set("score:uid:456","6000");
  447. jedis.set("score:uid:789","100");
  448. jedis.set("score:uid:101","5999");
  449. jedis.set("uid:123","{'uid':123,'name':'lucy'}");//好友的详细信息
  450. jedis.set("uid:456","{'uid':456,'name':'jack'}");
  451. jedis.set("uid:789","{'uid':789,'name':'jay'}");
  452. jedis.set("uid:101","{'uid':101,'name':'jolin'}");
  453. SortingParamssortingParameters=newSortingParams();
  454. sortingParameters.desc();
  455. //sortingParameters.limit(0,2);
  456. //注意GET操作是有序的,GETuser_name_*GETuser_password_*
  457. //和GETuser_password_*GETuser_name_*返回的结果位置不同
  458. sortingParameters.get("#");//GET还有一个特殊的规则——"GET#"
  459. //,用于获取被排序对象(我们这里的例子是user_id)的当前元素。
  460. sortingParameters.get("uid:*");
  461. sortingParameters.get("score:uid:*");
  462. sortingParameters.by("score:uid:*");
  463. //对应的redis命令是./redis-clisorttom:friend:listbyscore:uid:*get#get
  464. //uid:*getscore:uid:*
  465. List<String>result=jedis.sort("tom:friend:list",sortingParameters);
  466. for(Stringitem:result){
  467. System.out.println("item..."+item);
  468. }
  469. }
  470. /**
  471. *
  472. *只获取对象而不排序BY修饰符可以将一个不存在的key当作权重,让SORT跳过排序操作。
  473. *该方法用于你希望获取外部对象而又不希望引起排序开销时使用。#确保fake_key不存在redis>EXISTSfake_key
  474. *(integer)0#以fake_key作BY参数,不排序,只GETname和GETpasswordredis>SORT
  475. *user_idBYfake_keyGET#GETuser_name_*GETuser_password_*1)"222"#
  476. *id2)"hacker"#user_name3)"hey,imin"#password4)"59230"5)"jack"
  477. *6)"jack201022"7)"2"8)"huangz"9)"nobodyknows"10)"1"11)"admin"
  478. *12)"a_long_long_password"
  479. */
  480. publicvoidtestSort4(){
  481. }
  482. /**
  483. *
  484. 保存排序结果默认情况下,SORT操作只是简单地返回排序结果,如果你希望保存排序结果,可以给STORE选项指定一个key
  485. *作为参数,排序结果将以列表的形式被保存到这个key上。(若指定key已存在,则覆盖。)redis>EXISTS
  486. *user_info_sorted_by_level#确保指定key不存在(integer)0redis>SORTuser_idBY
  487. *user_level_*GET#GETuser_name_*GETuser_password_*STORE
  488. *user_info_sorted_by_level#排序(integer)12#显示有12条结果被保存了redis>LRANGE
  489. *user_info_sorted_by_level011#查看排序结果1)"59230"2)"jack"3)
  490. *"jack201022"4)"2"5)"huangz"6)"nobodyknows"7)"222"8)"hacker"9)
  491. *"hey,imin"10)"1"11)"admin"12)"a_long_long_password"一个有趣的用法是将SORT
  492. *结果保存,用EXPIRE为结果集设置生存时间,这样结果集就成了SORT操作的一个缓存。这样就不必频繁地调用SORT
  493. *操作了,只有当结果集过期时,才需要再调用一次SORT操作。
  494. *有时候为了正确实现这一用法,你可能需要加锁以避免多个客户端同时进行缓存重建(也就是多个客户端,同一时间进行SORT
  495. *操作,并保存为结果集),具体参见SETNX命令。
  496. */
  497. @Test
  498. publicvoidtestSort5(){
  499. //排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较
  500. Jedisjedis=RedisUtil.getJedis();
  501. //一般SORT用法最简单的SORT使用方法是SORTkey。
  502. jedis.lpush("mylist","1");
  503. jedis.lpush("mylist","4");
  504. jedis.lpush("mylist","6");
  505. jedis.lpush("mylist","3");
  506. jedis.lpush("mylist","0");
  507. //List<String>list=redis.sort("sort");//默认是升序
  508. SortingParamssortingParameters=newSortingParams();
  509. sortingParameters.desc();
  510. //sortingParameters.alpha();//当数据集中保存的是字符串值时,你可以用ALPHA
  511. //修饰符(modifier)进行排序。
  512. //sortingParameters.limit(0,2);//可用于分页查询
  513. //没有使用STORE参数,返回列表形式的排序结果.使用STORE参数,返回排序结果的元素数量。
  514. jedis.sort("mylist",sortingParameters,"mylist");//排序后指定排序结果到一个KEY中,这里讲结果覆盖原来的KEY
  515. List<String>list=jedis.lrange("mylist",0,-1);
  516. for(inti=0;i<list.size();i++){
  517. System.out.println(list.get(i));
  518. }
  519. jedis.sadd("tom:friend:list","123");//tom的好友列表
  520. jedis.sadd("tom:friend:list","456");
  521. jedis.sadd("tom:friend:list","789");
  522. jedis.sadd("tom:friend:list","101");
  523. jedis.set("score:uid:123","1000");//好友对应的成绩
  524. jedis.set("score:uid:456","6000");
  525. jedis.set("score:uid:789","100");
  526. jedis.set("score:uid:101","5999");
  527. jedis.set("uid:123","{'uid':123,'name':'lucy'}");//好友的详细信息
  528. jedis.set("uid:456","{'uid':456,'name':'jack'}");
  529. jedis.set("uid:789","{'uid':789,'name':'jay'}");
  530. jedis.set("uid:101","{'uid':101,'name':'jolin'}");
  531. sortingParameters=newSortingParams();
  532. //sortingParameters.desc();
  533. sortingParameters.get("#");//GET还有一个特殊的规则——"GET#"
  534. //,用于获取被排序对象(我们这里的例子是user_id)的当前元素。
  535. sortingParameters.by("score:uid:*");
  536. jedis.sort("tom:friend:list",sortingParameters,"tom:friend:list");
  537. List<String>result=jedis.lrange("tom:friend:list",0,-1);
  538. for(Stringitem:result){
  539. System.out.println("item..."+item);
  540. }
  541. jedis.flushDB();
  542. RedisUtil.closeJedis(jedis);
  543. }
  544. publicvoidtestMore(){
  545. //ZRANGE取出最新的10个项目。
  546. //使用LPUSH+LTRIM,确保只取出最新的1000条项目。
  547. //HINCRBYkeyfieldincrement,为哈希表key中的域field的值加上增量increment
  548. //INCRBY,HINCRBY等等,redis有了原子递增(atomicincrement),你可以放心的加上各种计数,用GETSET重置,或者是让它们过期。
  549. //LREMgreet2morning#移除从表头到表尾,最先发现的两个morning,这个可以用来删除特定评论
  550. //zrevranktesta查看a在sortedset中倒排序时排在第几名,查询结果按照INDEX,所以INDEX是3表示排在第四名
  551. //zranktesta相反,表示正排序时候的名次
  552. //zscoretestone表示one这个元素在sortedset中的score为多少
  553. //zrevrangetest0-1表示sortedset倒排序,zrangetest0-1表示正排序
  554. //将一个或多个member元素及其score值加入到有序集key当中。如果某个member已经是有序集的成员,那么更新这个member的score值,并通过重新插入这个member元素,来保证该member在正确的位置上。
  555. //zremtestone删除sortedset中某个元素
  556. }
  557. publicList<String>get_latest_comments(intstart,intnum_items){
  558. //获取最新评论
  559. //LPUSHlatest.comments<ID>
  560. //-我们将列表裁剪为指定长度,因此Redis只需要保存最新的5000条评论:
  561. //LTRIMlatest.comments05000
  562. //们做了限制不能超过5000个ID,因此我们的获取ID函数会一直询问Redis。只有在start/count参数超出了这个范围的时候,才需要去访问数据库。
  563. Jedisjedis=RedisUtil.getJedis();
  564. List<String>id_list=jedis.lrange("latest.comments",start,start+num_items-1);
  565. if(id_list.size()<num_items){
  566. //id_list=SQL.EXECUTE("SELECT...ORDERBYtimeLIMIT...");
  567. }
  568. returnid_list;
  569. }
  570. @Test
  571. publicvoidtestDB(){
  572. Jedisjedis=RedisUtil.getJedis();
  573. System.out.println(jedis.select(0));//selectdb-index
  574. //通过索引选择数据库,默认连接的数据库所有是0,默认数据库数是16个。返回1表示成功,0失败
  575. System.out.println(jedis.dbSize());//dbsize返回当前数据库的key数量
  576. System.out.println(jedis.keys("*"));//返回匹配指定模式的所有key
  577. System.out.println(jedis.randomKey());
  578. jedis.flushDB();//删除当前数据库中所有key,此方法不会失败。慎用
  579. jedis.flushAll();//删除所有数据库中的所有key,此方法不会失败。更加慎用
  580. }
  581. @Test
  582. publicvoidtestMget(){
  583. Jedisjedis=RedisUtil.getJedis();
  584. jedis.flushDB();//删除当前数据库中所有key,此方法不会失败。慎用
  585. jedis.rpush("ids","aa");
  586. jedis.rpush("ids","bb");
  587. jedis.rpush("ids","cc");
  588. List<String>ids=jedis.lrange("ids",0,-1);
  589. jedis.set("aa","{'name':'zhoujie','age':20}");
  590. jedis.set("bb","{'name':'yilin','age':28}");
  591. jedis.set("cc","{'name':'lucy','age':21}");
  592. List<String>list=jedis.mget(ids.toArray(newString[ids.size()]));
  593. System.out.println(list);
  594. }
  595. /**
  596. *可以利用lrange对list进行分页操作
  597. */
  598. @Test
  599. publicvoidqueryPageBy(){
  600. intpageNo=6;
  601. intpageSize=6;
  602. Jedisjedis=RedisUtil.getJedis();
  603. jedis.del("a");
  604. for(inti=1;i<=30;i++){
  605. jedis.rpush("a",i+"");
  606. }
  607. intstart=pageSize*(pageNo-1);//因为redis中list元素位置基数是0
  608. intend=start+pageSize-1;
  609. List<String>results=jedis.lrange("a",start,end);//从start算起,start算一个元素,到结束那个元素
  610. for(Stringstr:results){
  611. System.out.println(str);
  612. }
  613. }
  614. @Test
  615. /**
  616. *[向Redislist压入ID而不是实际的数据]
  617. 在上面的例子里,我们将“对象”(此例中是简单消息)直接压入Redislist,但通常不应这么做,
  618. 由于对象可能被多次引用:例如在一个list中维护其时间顺序,在一个集合中保存它的类别,只要有必要,它还会出现在其他list中,等等。
  619. 让我们回到reddit.com的例子,将用户提交的链接(新闻)添加到list中,有更可靠的方法如下所示:
  620. $redis-cliincrnext.news.id
  621. (integer)1
  622. $redis-clisetnews:1:title"Redisissimple"
  623. OK
  624. $redis-clisetnews:1:url"http://code.google.com/p/redis"
  625. OK
  626. $redis-clilpushsubmitted.news1
  627. OK
  628. 我们自增一个key,很容易得到一个独一无二的自增ID,然后通过此ID创建对象–为对象的每个字段设置一个key。最后将新对象的ID压入submitted.newslist。
  629. 这只是牛刀小试。在命令参考文档中可以读到所有和list有关的命令。你可以删除元素,旋转list,根据索引获取和设置元素,当然也可以用LLEN得到list的长度。
  630. */
  631. publicvoidtestListStrUsage(){
  632. Stringtitle="太阳能是绿色能源4";
  633. Stringurl="http://javacreazyer.iteye.com";
  634. Jedisjedis=RedisUtil.getJedis();
  635. longadInfoId=jedis.incr("ad:adinfo:next.id");
  636. jedis.set("ad:adinfo:"+adInfoId+":title",title);
  637. jedis.set("ad:adinfo:"+adInfoId+":url",url);
  638. jedis.lpush("ad:adinfo",String.valueOf(adInfoId));
  639. StringresultTitle=jedis.get("ad:adinfo:"+adInfoId+":title");
  640. StringresultUrl=jedis.get("ad:adinfo:"+adInfoId+":url");
  641. List<String>ids=jedis.lrange("ad:adinfo",0,-1);
  642. System.out.println(resultTitle);
  643. System.out.println(resultUrl);
  644. System.out.println(ids);
  645. /**
  646. *dbsize返回的是所有key的数目,包括已经过期的,而redis-clikeys"*"查询得到的是有效的key数目
  647. */
  648. System.out.println(jedis.dbSize());
  649. jedis.flushAll();
  650. }
  651. /**
  652. *下面是一个简单的方案:对每个想加标签的对象,用一个标签ID集合与之关联,并且对每个已有的标签,一组对象ID与之关联。例如假设我们的新闻ID
  653. *1000被加了三个标签tag1,2,5和77,就可以设置下面两个集合:$redis-clisaddnews:1000:tags1
  654. *(integer)1$redis-clisaddnews:1000:tags2(integer)1$redis-cli
  655. *saddnews:1000:tags5(integer)1$redis-clisaddnews:1000:tags77
  656. *(integer)1$redis-clisaddtag:1:objects1000(integer)1$redis-cli
  657. *saddtag:2:objects1000(integer)1$redis-clisaddtag:5:objects1000
  658. *(integer)1$redis-clisaddtag:77:objects1000(integer)1
  659. *要获取一个对象的所有标签,如此简单:$redis-clismembersnews:1000:tags1.52.13.774.
  660. *2而有些看上去并不简单的操作仍然能使用相应的Redis命令轻松实现。例如我们也许想获得一份同时拥有标签1,2,
  661. *10和27的对象列表。这可以用SINTER命令来做,他可以在不同集合之间取出交集。因此为达目的我们只需:$redis-clisinter
  662. *tag:1:objectstag:2:objectstag:10:objectstag:27:objects...noresult
  663. *inourdatasetcomposedofjustoneobject...
  664. *在命令参考文档中可以找到和集合相关的其他命令,令人感兴趣的一抓一大把。一定要留意SORT命令,Redis集合和list都是可排序的。
  665. */
  666. @Test
  667. publicvoidtestSetUsage(){
  668. Jedisjedis=RedisUtil.getJedis();
  669. jedis.sadd("zhongsou:news:1000:tags","1");
  670. jedis.sadd("zhongsou:news:1000:tags","2");
  671. jedis.sadd("zhongsou:news:1000:tags","5");
  672. jedis.sadd("zhongsou:news:1000:tags","77");
  673. jedis.sadd("zhongsou:news:2000:tags","1");
  674. jedis.sadd("zhongsou:news:2000:tags","2");
  675. jedis.sadd("zhongsou:news:2000:tags","5");
  676. jedis.sadd("zhongsou:news:2000:tags","77");
  677. jedis.sadd("zhongsou:news:3000:tags","2");
  678. jedis.sadd("zhongsou:news:4000:tags","77");
  679. jedis.sadd("zhongsou:news:5000:tags","1");
  680. jedis.sadd("zhongsou:news:6000:tags","5");
  681. jedis.sadd("zhongsou:tag:1:objects",1000+"");
  682. jedis.sadd("zhongsou:tag:2:objects",1000+"");
  683. jedis.sadd("zhongsou:tag:5:objects",1000+"");
  684. jedis.sadd("zhongsou:tag:77:objects",1000+"");
  685. jedis.sadd("zhongsou:tag:1:objects",2000+"");
  686. jedis.sadd("zhongsou:tag:2:objects",2000+"");
  687. jedis.sadd("zhongsou:tag:5:objects",2000+"");
  688. jedis.sadd("zhongsou:tag:77:objects",2000+"");
  689. Set<String>sets=jedis.sinter("zhongsou:tag:1:objects",
  690. "zhongsou:tag:2:objects","zhongsou:tag:5:objects",
  691. "zhongsou:tag:77:objects");
  692. System.out.println(sets);
  693. jedis.flushAll();
  694. }
  695. @Test
  696. publicvoidtestSortedSetUsage(){
  697. Jedisjedis=RedisUtil.getJedis();
  698. jedis.zadd("zhongsou:hackers",1940,"AlanKay");
  699. jedis.zadd("zhongsou:hackers",1953,"RichardStallman");
  700. jedis.zadd("zhongsou:hackers",1943,"Jay");
  701. jedis.zadd("zhongsou:hackers",1920,"Jellon");
  702. jedis.zadd("zhongsou:hackers",1965,"YukihiroMatsumoto");
  703. jedis.zadd("zhongsou:hackers",1916,"ClaudeShannon");
  704. jedis.zadd("zhongsou:hackers",1969,"LinusTorvalds");
  705. jedis.zadd("zhongsou:hackers",1912,"AlanTuring");
  706. Set<String>hackers=jedis.zrange("zhongsou:hackers",0,-1);
  707. System.out.println(hackers);
  708. Set<String>hackers2=jedis.zrevrange("zhongsou:hackers",0,-1);
  709. System.out.println(hackers2);
  710. //区间操作,我们请求Redis返回score介于负无穷到1920年之间的元素(两个极值也包含了)。
  711. Set<String>hackers3=jedis.zrangeByScore("zhongsou:hackers","-inf",
  712. "1920");
  713. System.out.println(hackers3);
  714. //ZREMRANGEBYSCORE这个名字虽然不算好,但他却非常有用,还会返回已删除的元素数量。
  715. longnum=jedis.zremrangeByScore("zhongsou:hackers","-inf","1920");
  716. System.out.println(num);
  717. jedis.flushAll();
  718. }
  719. }

Java代码收藏代码
  1. /**
  2. *获取连接池.
  3. *@return连接池实例
  4. */
  5. privatestaticJedisPoolgetPool(Stringip,intport){
  6. JedisPoolConfigconfig=newJedisPoolConfig();
  7. config.setMaxActive(RedisConfig.getMaxactive());
  8. config.setMaxIdle(RedisConfig.getMaxidle());
  9. config.setMaxWait(RedisConfig.getMaxwait());
  10. config.setTestOnBorrow(true);
  11. config.setTestOnReturn(true);
  12. try{
  13. /**
  14. *如果你遇到java.net.SocketTimeoutException:Readtimedoutexception的异常信息
  15. *请尝试在构造JedisPool的时候设置自己的超时值.JedisPool默认的超时时间是2秒(单位毫秒)
  16. */
  17. pool=newJedisPool(config,ip,port,RedisConfig.getTimeout());
  18. }catch(Exceptione){
  19. e.printStackTrace();
  20. }
  21. returnpool;
  22. }

附加一个工作中常用到的Jedis工具类,如下:

Java代码收藏代码
  1. packagecom.zhongsou.vertportal.util;
  2. importjava.util.HashMap;
  3. importjava.util.Map;
  4. importorg.slf4j.Logger;
  5. importorg.slf4j.LoggerFactory;
  6. importredis.clients.jedis.Jedis;
  7. importredis.clients.jedis.JedisPool;
  8. importredis.clients.jedis.JedisPoolConfig;
  9. importcom.zhongsou.vertportal.conf.BaseConfig;
  10. importcom.zhongsou.vertportal.conf.RedisConfig;
  11. /**
  12. *Redis工具类,用于获取RedisPool.
  13. *参考官网说明如下:
  14. *Youshouldn'tusethesameinstancefromdifferentthreadsbecauseyou'llhavestrangeerrors.
  15. *AndsometimescreatinglotsofJedisinstancesisnotgoodenoughbecauseitmeanslotsofsocketsandconnections,
  16. *whichleadstostrangeerrorsaswell.AsingleJedisinstanceisnotthreadsafe!
  17. *Toavoidtheseproblems,youshoulduseJedisPool,whichisathreadsafepoolofnetworkconnections.
  18. *Thiswayyoucanovercomethosestrangeerrorsandachievegreatperformance.
  19. *Touseit,initapool:
  20. *JedisPoolpool=newJedisPool(newJedisPoolConfig(),"localhost");
  21. *Youcanstorethepoolsomewherestatically,itisthread-safe.
  22. *JedisPoolConfigincludesanumberofhelpfulRedis-specificconnectionpoolingdefaults.
  23. *Forexample,JediswithJedisPoolConfigwillcloseaconnectionafter300secondsifithasnotbeenreturned.
  24. *@authorwujintao
  25. */
  26. publicclassJedisUtil{
  27. protectedLoggerlog=LoggerFactory.getLogger(getClass());
  28. /**
  29. *私有构造器.
  30. */
  31. privateJedisUtil(){
  32. }
  33. privatestaticMap<String,JedisPool>maps=newHashMap<String,JedisPool>();
  34. /**
  35. *获取连接池.
  36. *@return连接池实例
  37. */
  38. privatestaticJedisPoolgetPool(Stringip,intport){
  39. Stringkey=ip+":"+port;
  40. JedisPoolpool=null;
  41. if(!maps.containsKey(key)){
  42. JedisPoolConfigconfig=newJedisPoolConfig();
  43. config.setMaxActive(RedisConfig.getMaxactive());
  44. config.setMaxIdle(RedisConfig.getMaxidle());
  45. config.setMaxWait(RedisConfig.getMaxwait());
  46. config.setTestOnBorrow(true);
  47. config.setTestOnReturn(true);
  48. try{
  49. /**
  50. *如果你遇到java.net.SocketTimeoutException:Readtimedoutexception的异常信息
  51. *请尝试在构造JedisPool的时候设置自己的超时值.JedisPool默认的超时时间是2秒(单位毫秒)
  52. */
  53. pool=newJedisPool(config,ip,port,RedisConfig.getTimeout());
  54. maps.put(key,pool);
  55. }catch(Exceptione){
  56. e.printStackTrace();
  57. }
  58. }else{
  59. pool=maps.get(key);
  60. }
  61. returnpool;
  62. }
  63. /**
  64. *类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
  65. *没有绑定关系,而且只有被调用到时才会装载,从而实现了延迟加载。
  66. */
  67. privatestaticclassRedisUtilHolder{
  68. /**
  69. *静态初始化器,由JVM来保证线程安全
  70. */
  71. privatestaticJedisUtilinstance=newJedisUtil();
  72. }
  73. /**
  74. *当getInstance方法第一次被调用的时候,它第一次读取
  75. *RedisUtilHolder.instance,导致RedisUtilHolder类得到初始化;而这个类在装载并被初始化的时候,会初始化它的静
  76. *态域,从而创建RedisUtil的实例,由于是静态的域,因此只会在虚拟机装载类的时候初始化一次,并由虚拟机来保证它的线程安全性。
  77. *这个模式的优势在于,getInstance方法并没有被同步,并且只是执行一个域的访问,因此延迟初始化并没有增加任何访问成本。
  78. */
  79. publicstaticJedisUtilgetInstance(){
  80. returnRedisUtilHolder.instance;
  81. }
  82. /**
  83. *获取Redis实例.
  84. *@returnRedis工具类实例
  85. */
  86. publicJedisgetJedis(Stringip,intport){
  87. Jedisjedis=null;
  88. intcount=0;
  89. do{
  90. try{
  91. jedis=getPool(ip,port).getResource();
  92. //log.info("getredismaster1!");
  93. }catch(Exceptione){
  94. log.error("getredismaster1failed!",e);
  95. //销毁对象
  96. getPool(ip,port).returnBrokenResource(jedis);
  97. }
  98. count++;
  99. }while(jedis==null&&count<BaseConfig.getRetryNum());
  100. returnjedis;
  101. }
  102. /**
  103. *释放redis实例到连接池.
  104. *@paramjedisredis实例
  105. */
  106. publicvoidcloseJedis(Jedisjedis,Stringip,intport){
  107. if(jedis!=null){
  108. getPool(ip,port).returnResource(jedis);
  109. }
  110. }
  111. }

开发参考资料:

redis官方文档:http://redis.io/documentation

redis命令参考中文版:http://redis.readthedocs.org/en/2.4/index.html

分享到:
评论

相关推荐

    java操作redis.docx

    使用java操作redis,运用的是jedis框架,并且简单封装了大部分的jedis的API,上手快,简单易懂,搭建好redis,直接复制粘贴文档中的代码,配好ip和端口号,直接可以用。

    Jedis操作redis代码示例

    java操作redis代码示例 ,注释,Jedis的api操作注释详细。

    Jedis API中文使用文档.-比较详细

    Java中使用Jedis操作Redis 文档比较详细, 具体的方法都进行了介绍了, 适合新手, 和老程序员进行复习, jedis api比较乱, 特此整理.

    jedis.jar用于java操作redis

    jedis.jar提供了java连接和操作redis服务的api。jedis.jar提供了java连接和操作redis服务的api。

    jedis-2.8.0-API文档-中文版.zip

    标签:clients、jedis、redis、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译...

    spring_redis集成(jedis java客户端)

    spring_redis集成,通过jedis作为redis的客户端。 只提供集成方式,具体api,参照jedis API

    jedis-3.6.0-API文档-中文版.zip

    标签:redis、clients、jedis、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请...

    jedis操作API实例

    此java类配置redis的ip,port,超时时间,获取jedis,然后通过jedis操作string,list,hash,set,zset等数据结构的实例,展示怎么调用jedisAPI

    jedis 2.9.0 API、jar包、source

    最新的jedis的jar包,doc文档api,source源代码; jedis2.9.0;redis使用最广泛的Java客户端。

    jedis-2.9.0-API文档-中文版.zip

    对应Maven信息:groupId:redis.clients,artifactId:jedis,version:2.9.0 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释...

    Shiro + JWT + SpringBoot + MySQL + Redis(Jedis)实现无状态鉴权机制

    Shiro + JWT + SpringBoot + MySQL + Redis(Jedis)实现无状态鉴权机制(Restful风格API)(改为数据库形式(MySQL)) 博客源码 附件

    redis.clients.jedis_REDIS_API

    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。

    API SpringBoot + Shiro + Java-Jwt + Redis(Jedis).zip

    API SpringBoot + Shiro + Java-Jwt + Redis(Jedis)

    jedis-3.0.1-API文档-中英对照版.zip

    标签:clients、jedis、redis、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...

    bigdata_10_redis:Jedis相关API的练习

    bigdata_10_redis Jedis相关API的练习记录了使用Jedis客户端与Redis的服务器进行连接的相关操作

    java连接redis需要的jar包

    jedis-2.9.0.jar 和 commons-pool2-2.4.2.jar 用java连接redis所需jar包

    Jedis源码-供查询redis API源码

    jedis源码,供开发者使用Java学习或者查询redis API使用,可以帮助开发者快速查找jedis源码实现。

    Jedis API 文档(20170823)

    Redis 的 Java 客户端 Jedis ,最新的 API 手册。官网没有提供,自己亲手制作的。详见 https://waylau.com/make-chm-help-doc

    jedis-3.0.1-API文档-中文版.zip

    标签:clients、jedis、redis、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请...

    jedis-2.0.0-javadoc.jar

    Jedis2.0 API,Jedis是Redis java客户端

Global site tag (gtag.js) - Google Analytics