1. 程式人生 > >Redis的Java客戶端Jedis(十三)

Redis的Java客戶端Jedis(十三)


我的程式碼:

public class TestPing {
   // 連線本地的 Redis 服務
public static void main(String[] args) {
      Jedis jedis = new Jedis("127.0.0.1",6379);
System.out.println(jedis.ping());
}


}
public class TestApi {
   @Test
public  void keyTest() {
      Jedis jedis = new Jedis("127.0.0.1", 6379);
jedis.set("k1"
,"v1"); jedis.set("k2","v2"); jedis.set("k3","v3"); //key Set<String> keys = jedis.keys("*"); for (String key : keys) { System.out.println(key); } //key是否存在 System.out.println("jedis.exists====>" + jedis.exists("k2")); /*以秒為單位,返回給定 key 的剩餘生存時間(TTL, time to live) 返回值: 當 key 不存在時,返回 -2 。
當 key 存在但沒有設定剩餘生存時間時,返回 -1 。 否則,以秒為單位,返回 key 的剩餘生存時間。*/ System.out.println(jedis.ttl("k1")); } @Test public void stringTest() { Jedis jedis = new Jedis("127.0.0.1", 6379); System.out.println(jedis.get("k1")); jedis.set("k4", "k4_redis"); System.out.println("----------------------------------------"
); jedis.mset("str1", "v1", "str2", "v2", "str3", "v3"); System.out.println(jedis.mget("str1", "str2", "str3")); } @Test public void listTest() { Jedis jedis = new Jedis("127.0.0.1", 6379); jedis.lpush("mylist", "v1", "v2", "v3", "v4", "v5"); List<String> list = jedis.lrange("mylist", 0, -1); for (String element : list) { System.out.println(element); } } @Test public void setTest() { Jedis jedis = new Jedis("127.0.0.1", 6379); jedis.sadd("orders", "jd001"); jedis.sadd("orders", "jd002"); jedis.sadd("orders", "jd003"); Set<String> set1 = jedis.smembers("orders"); for (Iterator iterator = set1.iterator(); iterator.hasNext(); ) { String string = (String) iterator.next(); System.out.println(string); } /*移除集合 key 中的一個或多個 member 元素,不存在的 member 元素會被忽略。 當 key 不是集合型別,返回一個錯誤。*/ jedis.srem("orders", "jd002"); System.out.println(jedis.smembers("orders").size()); } @Test public void hashTest() { Jedis jedis = new Jedis("127.0.0.1", 6379); jedis.hset("hash1", "userName", "lisi"); System.out.println(jedis.hget("hash1", "userName")); Map<String, String> map = new HashMap<String, String>(); map.put("telphone", "13811814763"); map.put("address", "atguigu"); map.put("email", "[email protected]"); jedis.hmset("hash2", map); List<String> result = jedis.hmget("hash2", "telphone", "email"); for (String element : result) { System.out.println(element); } } @Test public void zsetTest() { Jedis jedis = new Jedis("127.0.0.1", 6379); jedis.zadd("zset01", 60d, "v1"); jedis.zadd("zset01", 70d, "v2"); jedis.zadd("zset01", 80d, "v3"); jedis.zadd("zset01", 90d, "v4"); Set<String> s1 = jedis.zrange("zset01", 0, -1); for (Iterator iterator = s1.iterator(); iterator.hasNext(); ) { String string = (String) iterator.next(); System.out.println(string); } } @Test public void multiTest() { Jedis jedis = new Jedis("127.0.0.1", 6379); Transaction transaction = jedis.multi();//被當作一個命令進行執行 Response<String> response = transaction.get("serialNum"); transaction.set("serialNum", "s002"); response = transaction.get("serialNum"); transaction.lpush("list3", "a"); transaction.lpush("list3", "b"); transaction.lpush("list3", "c"); //執行該事物,提交 transaction.exec(); //放棄該事物,不提交 //transaction.discard(); } }
public class TestSlaveof {//主從複製,讀寫分離
public static void main(String[] args) throws InterruptedException {
      Jedis jedis_M = new Jedis("127.0.0.1", 6379);
Jedis jedis_S = new Jedis("127.0.0.1", 6380);
jedis_S.slaveof("127.0.0.1", 6379);
jedis_M.set("k6", "v6");
Thread.sleep(500);
System.out.println(jedis_S.get("k6"));
}
}
public class TestTransaction {
   public boolean transMethod() throws  Exception{
      Jedis jedis = new Jedis("127.0.0.1", 6379);
      int balance;// 可用餘額
int debt;// 欠額
int amtToSubtract = 10;// 實刷額度
jedis.watch("balance");
//jedis.set("balance","5");//此句不該出現,講課方便。模擬其他程式已經修改了該條目
Thread.sleep(7000); //休眠7秒
balance = Integer.parseInt(jedis.get("balance"));
      if (balance < amtToSubtract) {
         jedis.unwatch();
System.out.println("modify");
         return false;
} else {
         System.out.println("***********transaction");
Transaction transaction = jedis.multi();
transaction.decrBy("balance", amtToSubtract);
transaction.incrBy("debt", amtToSubtract);
transaction.exec();
balance = Integer.parseInt(jedis.get("balance"));
debt = Integer.parseInt(jedis.get("debt"));
System.out.println("*******" + balance);
System.out.println("*******" + debt);
         return true;
}
   }


   /**
    *    * 通俗點講,watch命令就是標記一個鍵,如果標記了一個鍵, 在提交事務前如果該鍵被別人修改過,那事務就會失敗,這種情況通常可以在程式中
    *    * 重新再嘗試一次。
    *    * 首先標記了鍵balance,然後檢查餘額是否足夠,不足就取消標記,並不做扣減; 足夠的話,就啟動事務進行更新操作,
    *    * 如果在此期間鍵balance被其它人修改, 那在提交事務(執行exec)時就會報錯, 程式中通常可以捕獲這類錯誤再重新執行一次,直到成功。
    *   
    */
public static void main(String[] args) throws Exception{
      TestTransaction test = new TestTransaction();
      boolean retValue = test.transMethod();
System.out.println("main retValue-------: " + retValue);
}
}
public class JedisPoolUtil {
   private static  volatile JedisPool jedisPool = null;//被volatile修飾的變數不會被本地執行緒快取,對該變數的讀寫都是直接操作共享記憶體。
private JedisPoolUtil() {
   }

   public static JedisPool getJedisPoolInstance() {
      if (null == jedisPool) {
         synchronized (JedisPoolUtil.class) {
            if (null == jedisPool) {
               JedisPoolConfig poolConfig = new JedisPoolConfig();
//poolConfig.setMaxActive(1000);
poolConfig.setMaxIdle(32);
//poolConfig.setMaxWait(100 * 1000);
poolConfig.setTestOnBorrow(true);
jedisPool =new JedisPool(poolConfig, "127.0.0.1");
}
         }
      }
      return jedisPool;
}

   public static void release(JedisPool jedisPool, Jedis jedis) {
      if (null != jedis) {
         jedisPool.returnResourceObject(jedis);
}
   }
}
public class TestPool {
   public static void main(String[] args) {
      JedisPool jedisPool = JedisPoolUtil.getJedisPoolInstance();
Jedis jedis = null;
      try {
         jedis = jedisPool.getResource();
jedis.set("k18", "v183");
System.out.println(jedis.get("k18"));
} catch (Exception e) {
         e.printStackTrace();
} finally {
         JedisPoolUtil.release(jedisPool, jedis);
}
   }
}
===================================================================

JedisPool的配置引數大部分是由JedisPoolConfig的對應項來賦值的。

maxActive:控制一個pool可分配多少個jedis例項,通過pool.getResource()來獲取;如果賦值為-1,則表示不限制;如果pool已經分配了maxActive個jedis例項,則此時pool的狀態為exhausted。
maxIdle:控制一個pool最多有多少個狀態為idle(空閒)的jedis例項;
whenExhaustedAction:表示當pool中的jedis例項都被allocated完時,pool要採取的操作;預設有三種。
 WHEN_EXHAUSTED_FAIL --> 表示無jedis例項時,直接丟擲NoSuchElementException;
 WHEN_EXHAUSTED_BLOCK --> 則表示阻塞住,或者達到maxWait時丟擲JedisConnectionException;
 WHEN_EXHAUSTED_GROW --> 則表示新建一個jedis例項,也就說設定的maxActive無用;
maxWait:表示當borrow一個jedis例項時,最大的等待時間,如果超過等待時間,則直接拋JedisConnectionException;
testOnBorrow:獲得一個jedis例項的時候是否檢查連線可用性(ping());如果為true,則得到的jedis例項均是可用的;


testOnReturn:return 一個jedis例項給pool時,是否檢查連線可用性(ping());


testWhileIdle:如果為true,表示有一個idle object evitor執行緒對idle object進行掃描,如果validate失敗,此object會被從pool中drop掉;這一項只有在timeBetweenEvictionRunsMillis大於0時才有意義;


timeBetweenEvictionRunsMillis:表示idle object evitor兩次掃描之間要sleep的毫秒數;


numTestsPerEvictionRun:表示idle object evitor每次掃描的最多的物件數;


minEvictableIdleTimeMillis:表示一個物件至少停留在idle狀態的最短時間,然後才能被idle object evitor掃描並驅逐;這一項只有在timeBetweenEvictionRunsMillis大於0時才有意義;


softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基礎上,加入了至少minIdle個物件已經在pool裡面了。如果為-1,evicted不會根據idle time驅逐任何物件。如果minEvictableIdleTimeMillis>0,則此項設定無意義,且只有在timeBetweenEvictionRunsMillis大於0時才有意義;


lifo:borrowObject返回物件時,是採用DEFAULT_LIFO(last in first out,即類似cache的最頻繁使用佇列),如果為False,則表示FIFO佇列;


==================================================================================================================
其中JedisPoolConfig對一些引數的預設設定如下:
testWhileIdle=true
minEvictableIdleTimeMills=60000
timeBetweenEvictionRunsMillis=30000
numTestsPerEvictionRun=-1

相關推薦

Redis的Java客戶Jedis(十三)

我的程式碼: public class TestPing { // 連線本地的 Redis 服務 public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1"

Redis 的 java 客戶 jedis

Java 連線 MySql 我們有 mysql-connector ,連線 Redis 我們有 jedis。 一、引入依賴 <dependency> <groupId>redis.clients</groupId> <ar

Redis的java客戶Jedis Client介紹(持續翻譯中)

1. 概覽 This article is an introduction to Jedis, a client library in Java for Redis – the popular in-memory data structure store that can persis

Redis 客戶-Jedis

一、編碼實戰     1> 簡單使用 package org.jedisDomo; import redis.clients.jedis.Jedis; public class JedisDemo { public static void main(S

[筆記遷移][Redis][8]Redis的Java客戶Jedis

一、連通性測試 //獲取一個Redis客戶端 Jedis jedisClient = new Jedis("192.168.109.191", 6379); //正常連線將返回PONG,若未關閉防火牆

Redis叢集 Java客戶Jedis的使用

Java客戶端Jedis  這裡只講Jedis常規用法和五種資料結構的方法(關於叢集的搭建以後再寫)      2.稍微修飾下    3.執行效果 4.相應的jar包(第一個不相容,沒用,junit4.4:@test 做測試所需) 二,redis資料型別(

redis知識盤點【陸】_客戶Jedis

系列文章:本篇文章主要介紹一下redis的客戶端Jedis。首先明確兩點:一、redis客戶端與服務端之間的通訊協議是在TCP協議之上構建的;二、Redis制定了RESP(REdis Serializa

使用Redis的Java客戶Jedis

 前一篇文章《Redis命令指南》講解了通過命令列的方式執行Key=>的儲存操作,在實際的專案開發中,各種語言是使用Redis的客戶端庫來與Redis互動。針對Java語言,Redis官方推薦Jedis。

redis客戶jedis基於spring搭建單節點或者叢集執行緒池連線

基於jedis執行緒池搭建單節點或叢集連線完整程式碼 <dependency>     <groupId>redis.clients</groupId>   <artifactId>jedis</artifactId&g

SDR(spring.data.redis)與Sentinel高可用叢集Redis客戶Jedis配置

依賴 <dependency> <groupId>junit</groupId> <artifactId>junit<

Redis 客戶Jedis使用---連線池

Jedis 是Redis 的Java客戶端,通過一段時間的使用,jedis基本實現redis的所有功能,並且jedis在客戶端實現redis資料分片功能,Redis本身是沒有資料分佈功能。一、下載jedis 程式碼二、專案中如何使用Jedis使用現在大家都喜歡用maven作為

redis -java客戶jedis

接上一篇 1 key可以有過期的設定 2 Lists 列表 插入元素很快, 按索引查詢,慢 //列表是自動建立和刪除的 //從左側新增給List1 一個值 1 lpush list1 1 //從右側新增2 rpush lis

redis的客戶jedis裡構造器中有soTimeout和connectionTimeout兩個引數,分別代表什麼

connectionTimeout:表示連線超時時間例如構造器public Jedis(String host, int port, int timeout) { super(host, port, timeout); }public static void main

redis的Java客戶jedis池的介紹及使用

一、jedis池的介紹 相信大家都用過執行緒池或者是jdbc的連線池,使用池可以減少系統在使用所需物件時建立物件的開銷,從而提高系統性能和效率。jedis池也是如此,那麼我們該如何使用jedis池呢? 二、jedis池的使用 1.所需jar包:commons-pool.ja

Redis的Java客戶Jedis的八種呼叫方式(事務、管道、分散式)介紹

jedis是一個著名的key-value儲存系統,而作為其官方推薦的java版客戶端jedis也非常強大和穩定,支援事務、管道及有jedis自身實現的分散式。 在這裡對jedis關於事務、管道和分散式的呼叫方式做一個簡單的介紹和對比: 一、

java客戶Jedis操作Redis Sentinel 連線池

 pom.xml配置     <dependency>     <groupId>org.springframework.data</groupId>     <artifactId>spring-data-redis<

Redis 客戶 Jedis、lettuce 和 Redisson 對比

Redis 支援多種語言的客戶端,下面列舉了部分 Redis 支援的客戶端語言,大家可以通過[官網](https://redis.io/clients)檢視 Redis 支援的客戶端詳情。 - C語言 - C++ - C# - Java - [Python](https://redis.io/clients

【轉載】java 客戶鏈接不上redis解決方案 (jedis)

主機 rom number table 出現 gin 現在 start http 本文出自:http://blog.csdn.net/lulidaitian/article/details/51946169 出現問題描述: 1.Could not get a resou

Redis Cluster集群搭建後,客戶的連接研究(Spring/Jedis)(待實踐)

turn ron 記錄 redis div println 刪除 clu name 說明:無論是否已經搭建好集群,還是使用什麽樣的客戶端去連接,都是必須把全部IP列表集成進去,然後隨機往其中一個IP寫。 這樣做的好處: 1、隨機IP寫入之後,Redis Cluster代

Redis 設計與實現(第十三章) -- 客戶

腳本 ons listening last then red logs 可能 reply 概述 對於每個與服務器連接的客戶端,服務器都為它創建相應的redisClient的數據結構,並保持了相應的狀態。Redis Server通過一個鏈表來保存所有的客戶端連接。 本章包括: