03.RedisJava客戶端Jedis的使用


 

1.Jedis基本使用

使用Jedis客戶端使用Redis服務與在服務器上通過redis-cli 使用命令 基本一樣,關於Redis命令請參考: http://www.redis.cn/commands.htmlhttp://www.runoob.com/redis/redis-commands.html
1.使用Jedis連接Redis服務
  1. publicstaticvoid main(String[] args)
  2. {
  3. Jedis jedis =newJedis("192.168.110.101",6379);
  4. String result = jedis.ping();// 測試連接
  5. System.out.println(result);
  6. jedis.close();
  7. }
2.Jedis客戶端的基本使用
下面根據Redis命令划分,使用Jedis
  1. //關鍵字(Keys)
  2. System.out.println("exists :"+ jedis.exists("name"));
  3. System.out.println("del :"+ jedis.del("name"));
  4. //字符串(String)
  5. System.out.println("set :"+ jedis.set("name","危常煥"));
  6. System.out.println("get :"+ jedis.get("name"));
  7. //哈希(Hashs)
  8. for(int i =0; i <10; i++)
  9. {
  10. System.out.println("hset :"+ jedis.hset("hset","set-key"+ i,"set-value"+ i));
  11. }
  12. System.out.println("hkeys :"+ jedis.hkeys("hset"));
  13. //列表(Lists)
  14. System.out.println("rpush :"+ jedis.rpush("lset","lset001","lset002","lset003","lset004"));
  15. System.out.println("lrange :"+ jedis.lrange("lset",0,2));
  16. //集合(Sets)
  17. System.out.println("sadd :"+ jedis.sadd("sadd","sadd001","sadd002","sadd003"));
  18. System.out.println("scard :"+ jedis.scard("sadd"));
  19. //有序集合(Sorted Sets)
  20. Map<String,Double> scoreMembers =newHashMap<String,Double>();
  21. scoreMembers.put("001",0.1D);
  22. scoreMembers.put("002",0.2D);
  23. scoreMembers.put("003",0.3D);
  24. System.out.println("zadd :"+ jedis.zadd("zadd", scoreMembers));
  25. System.out.println("zrange :"+ jedis.zrange("zadd",1L,2L));
  26. //HyperLogLog
  27. for(int i =0; i <10; i++)
  28. {
  29. System.out.println("pfadd :"+ jedis.pfadd("HyperLogLog", UUID.randomUUID().toString()));
  30. }
  31. System.out.println("pfcount :"+ jedis.pfcount("HyperLogLog"));
  32. //發布/訂閱(Pub/Sub)
  33. Thread thread =newThread(newRunnable()
  34. {
  35. @Override
  36. publicvoid run()
  37. {
  38. finalJedis j =newJedis("192.168.110.101",6379);
  39. j.subscribe(newJedisPubSub()
  40. {
  41. @Override
  42. publicvoid onMessage(String channel,String message)
  43. {
  44. System.out.println("onMessage--channel:"+ channel +" message:"+ message);
  45. this.unsubscribe();
  46. }
  47. },"channel001");
  48. j.close();
  49. System.out.println("連接已關閉");
  50. }
  51. });
  52. thread.start();
  53. Thread.sleep(10);
  54. System.out.println("publish :"+ jedis.publish("channel001","發送一條消息"));
  55. //事務(Transactions)
  56. Transaction transaction = jedis.multi();
  57. System.out.println("set :"+ transaction.set("multi001","123"));
  58. System.out.println("incr :"+ transaction.incr("multi001"));
  59. System.out.println("transaction.exec :"+ transaction.exec());
  60. // 腳本(Scripting)
  61. System.out.println("eval :"+ jedis.eval("local msg = \"Hello, world!\" return msg"));
  62. //連接(Connection)
  63. System.out.println("ping :"+ jedis.ping());
  64. System.out.println("select :"+ jedis.select(0));
  65. //服務(Server)
  66. System.out.println("dbSize :"+ jedis.dbSize());
  67. System.out.println("clientList :"+ jedis.clientList());
Redis支持執行Lua腳本,關於Lua腳本的基本使用可參考: http://www.oschina.net/translate/intro-to-lua-for-redis-programmers

2.Jedis深入使用

1.Jedis中常見類關系如下
2.JedisPool的使用
JedisPool只是提供基本的連接池而已
  1. publicstaticvoid main(String[] args)
  2. {
  3. JedisPoolConfig config =newJedisPoolConfig();
  4. // 連接池中最大連接數。高版本:maxTotal,低版本:maxActive
  5. config.setMaxTotal(8);
  6. // 連接池中最大空閑的連接數
  7. config.setMaxIdle(4);
  8. // 連接池中最少空閑的連接數
  9. config.setMinIdle(1);
  10. // 當連接池資源耗盡時,調用者最大阻塞的時間,超時將跑出異常。單位,毫秒數;默認為-1.表示永不超時。高版本:maxWaitMillis,低版本:maxWait
  11. config.setMaxWaitMillis(15000);
  12. // 連接空閑的最小時間,達到此值后空閑連接將可能會被移除。負值(-1)表示不移除
  13. config.setMinEvictableIdleTimeMillis(300000);
  14. // 對於“空閑鏈接”檢測線程而言,每次檢測的鏈接資源的個數。默認為3
  15. config.setNumTestsPerEvictionRun(3);
  16. // “空閑鏈接”檢測線程,檢測的周期,毫秒數。如果為負值,表示不運行“檢測線程”。默認為-1
  17. config.setTimeBetweenEvictionRunsMillis(60000);// 一分鍾
  18. // 向調用者輸出“鏈接”資源時,是否檢測是有有效,如果無效則從連接池中移除,並嘗試獲取繼續獲取。默認為false。建議保持默認值
  19. config.setTestOnBorrow(false);
  20. // 向連接池“歸還”鏈接時,是否檢測“鏈接”對象的有效性。默認為false。建議保持默認值
  21. config.setTestOnReturn(false);
  22. // 向調用者輸出“鏈接”對象時,是否檢測它的空閑超時;默認為false。如果“鏈接”空閑超時,將會被移除。建議保持默認值
  23. config.setTestWhileIdle(false);
  24. JedisPool pool =newJedisPool(config,"192.168.110.101",6379);
  25. Jedis jedis = pool.getResource();// 從pool中獲取資源
  26. try
  27. {
  28. jedis.set("k1","v1");
  29. System.out.println(jedis.get("k1"));
  30. }
  31. catch(Exception e)
  32. {
  33. e.printStackTrace();
  34. }
  35. finally
  36. {
  37. jedis.close();
  38. // pool.returnResource(jedis); // 此方法已過時
  39. }
  40. for(int i =0; i <10; i++)
  41. {
  42. jedis = pool.getResource();
  43. // jedis.close(); // 去掉注釋觀察效果
  44. System.out.println("NumActive:"+ pool.getNumActive());
  45. System.out.println("NumIdle:"+ pool.getNumIdle());
  46. System.out.println("NumWaiters:"+ pool.getNumWaiters());
  47. }
  48. pool.close();
  49. pool.destroy();
  50. }
3.JedisSentinelPool使用
JedisSentinelPool在有Sentinel集群服務時使用,他除了提供連接池功能之外還能夠在master服務宕機 Sentinel 集群選出新的 master 服務節點后連接池連接的Redis服務也會更新成新的 master 服務地址
  1. publicstaticvoid main(String[] args)
  2. {
  3. String host =null;
  4. int port =0;
  5. Set<String> sentinels =newHashSet<String>();
  6. sentinels.add("192.168.110.100:26379");
  7. sentinels.add("192.168.110.100:36379");
  8. sentinels.add("192.168.110.100:46379");
  9. JedisSentinelPool jedisSentinelPool =newJedisSentinelPool("master001", sentinels);
  10. host = jedisSentinelPool.getCurrentHostMaster().getHost();
  11. port = jedisSentinelPool.getCurrentHostMaster().getPort();
  12. System.out.println(host +":"+ port);
  13. Jedis jedis = jedisSentinelPool.getResource();
  14. jedis.set("001","ASDFG");
  15. System.out.println(jedis.get("001"));
  16. jedis.close();
  17. // 關閉Redis Master服務
  18. Scanner scanner =newScanner(System.in);
  19. String input = scanner.nextLine();
  20. System.out.println(input);
  21. host = jedisSentinelPool.getCurrentHostMaster().getHost();
  22. port = jedisSentinelPool.getCurrentHostMaster().getPort();
  23. System.out.println(host +":"+ port);
  24. jedis = jedisSentinelPool.getResource();
  25. jedis.set("001","ZXCVB");
  26. System.out.println(jedis.get("001"));
  27. jedis.close();
  28. jedisSentinelPool.close();
  29. jedisSentinelPool.destroy();
  30. }
注意: master服務宕機之后一段時間內(若干秒)方法返回的jedis客戶端還是以前的master服務地址,會導致連接池在一段時間內(若干秒)不能使用。但是很快就會回復正常連接到新的master服務上,需要注意的是這需要一段時間(若干秒)
運行以上程序輸出如下,注意中間打印的部分:
  1. 192.168.110.102:6379
  2. ASDFG
  3. 2015-10-222:50:30 redis.clients.jedis.JedisSentinelPool initPool
  4. 信息:CreatedJedisPool to master at 192.168.110.101:6379
  5. 192.168.110.101:6379
  6. ZXCVB
對於 Sentinel的特有操作Jedis類 就有方法支持:

4.ShardedJedisPool使用
ShardedJedisPool除了有連接池的功能,它可以根據key計算出這個key對應存儲的Redis服務器,實現多台Redis服務器擴容
  1. publicstaticvoid main(String[] args)
  2. {
  3. JedisPoolConfig config =newJedisPoolConfig();
  4. List<JedisShardInfo> shards =newArrayList<JedisShardInfo>();
  5. shards.add(newJedisShardInfo("192.168.110.101","Redis001",6379,20*1000,1));
  6. shards.add(newJedisShardInfo("192.168.110.102","Redis002",6379,20*1000,2));
  7. shards.add(newJedisShardInfo("192.168.110.103","Redis003",6379,20*1000,4));
  8. ShardedJedisPool shardedJedisPool =newShardedJedisPool(config, shards);
  9. for(int i =0; i <10; i++)
  10. {
  11. ShardedJedis shardedJedis = shardedJedisPool.getResource();
  12. String key ="shard"+ i;
  13. shardedJedis.set(key,"v-"+ i);
  14. System.out.println(shardedJedis.get(key));
  15. JedisShardInfo shardInfo = shardedJedis.getShardInfo(key);
  16. System.out.println("getHost:"+ shardInfo.getHost());
  17. shardedJedis.close();
  18. }
  19. shardedJedisPool.close();
  20. shardedJedisPool.destroy();
  21. }
運行打印結果:
  1. v-0
  2. getHost:192.168.110.102
  3. v-1
  4. getHost:192.168.110.101
  5. v-2
  6. getHost:192.168.110.102
  7. v-3
  8. getHost:192.168.110.103
  9. v-4
  10. getHost:192.168.110.102
  11. v-5
  12. getHost:192.168.110.102
  13. v-6
  14. getHost:192.168.110.103
  15. v-7
  16. getHost:192.168.110.102
  17. v-8
  18. getHost:192.168.110.102
  19. v-9
  20. getHost:192.168.110.103
注意:計算key對應到Redis服務器的默認算法與Redis的IP和端口無關,只與 JedisShardInfo 的name屬性有關,所以可以好好使用這個特性!其具體實現如下:
  1. //位置:redis.clients.util.Sharded<R, S extends ShardInfo<R>>
  2. privatevoid initialize(List<S> shards)
  3. {
  4. nodes =newTreeMap<Long, S>();
  5. for(int i =0; i != shards.size();++i)
  6. {
  7. final S shardInfo = shards.get(i);
  8. if(shardInfo.getName()==null)
  9. for(int n =0; n <160* shardInfo.getWeight(); n++)
  10. {
  11. nodes.put(this.algo.hash("SHARD-"+ i +"-NODE-"+ n), shardInfo);
  12. }
  13. else
  14. for(int n =0; n <160* shardInfo.getWeight(); n++)
  15. {
  16. nodes.put(this.algo.hash(shardInfo.getName()+"*"+ shardInfo.getWeight()+ n), shardInfo);
  17. }
  18. resources.put(shardInfo, shardInfo.createResource());
  19. }
  20. }
-------------------------------------------------------------------------------------------------------------------------------






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM