RedisEclipse

1.Eclipse配置

2.HelloWorld

import redis.clients.jedis.Jedis;

 

public class TestPing {

public static void main(String[] args) {

Jedis jedis = new Jedis("127.0.0.1",6379);

System.out.println(jedis.ping());

}

}

3.Jedis常見操作

import java.util.Set;

 

import redis.clients.jedis.Jedis;

 

public class TestAPI {

public static void main(String[] args) {

 

Jedis jedis = new Jedis("127.0.0.1",6379);

jedis.set("k1", "v1");

jedis.set("k2", "v2");

jedis.set("k3", "v3");

 

System.out.println(jedis.get("k1"));

Set<String> sets = jedis.keys("*");

System.out.println(sets.toString());

System.out.println(sets.size());

}

}

4.Redis主從複製

import redis.clients.jedis.Jedis;

 

public class TestMS {

 

public static void main(String[] args) {

Jedis jedisM = new Jedis("127.0.0.1",6379);

Jedis jedisS = new Jedis("127.0.0.1",6380);

 

jedisS.slaveof("127.0.0.1",6379);

jedisM.set("k1", "v1");

System.out.println(jedisS.get("k1"));

 

}

}

5.Redis事務

import javax.swing.plaf.basic.BasicTreeUI.TreeCancelEditingAction;

 

import redis.clients.jedis.Jedis;

import redis.clients.jedis.Transaction;

 

public class TestTX {

 

 public boolean transMethod() throws InterruptedException {

    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);

    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)時就會報錯, 程序中通常可以捕獲這類錯誤再重新執行一次,直到成功。

* @throws InterruptedException

  */

 public static void main(String[] args) throws InterruptedException {

 TestTX test = new TestTX();

    boolean retValue = test.transMethod();

    System.out.println("main retValue-------: " + retValue);

 }

}

 

6.Redis線程池

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

import redis.clients.jedis.JedisPoolConfig;

 

public class JedisPoolUtil {

 

private static volatile JedisPool jedisPool = null;

 

private JedisPoolUtil(){}

 

public static JedisPool getJedisPoolUtil(){

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",6379);

}

}

}

return jedisPool;

}

 

public static void release(JedisPool jedisPool,Jedis jedis){

if(null!=jedis){

jedisPool.returnResourceObject(jedis);

}

}

}

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

 

public class TEstPool {

 

public static void main(String[] args) {

 

JedisPool jedisPool = JedisPoolUtil.getJedisPoolUtil();

 

Jedis jedis = null;

try{

jedis = jedisPool.getResource();

jedis.set("aa", "bb");

}catch(Exception e){

e.printStackTrace();

}finally{

JedisPoolUtil.release(jedisPool, jedis);

}

}

}

7.RedisPool配置

 

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

 

maxActive:控制一個pool可分配多少個jedis實例,通過pool.getResource()來獲取;如果賦值爲-1,則表示不限制;如果pool已經分配了maxActivejedis實例,則此時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實例均是可用的;

 

testOnReturnreturn 一個jedis實例給pool時,是否檢查連接可用性(ping());

 

testWhileIdle:如果爲true,表示有一個idle object evitor線程對idle object進行掃描,如果validate失敗,此object會被從pooldrop掉;這一項只有在timeBetweenEvictionRunsMillis大於0時纔有意義;

 

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

 

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

 

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

 

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

 

lifoborrowObject返回對象時,是採用DEFAULT_LIFOlast in first out,即類似cache的最頻繁使用隊列),如果爲False,則表示FIFO隊列;

 

==================================================================================================================

其中JedisPoolConfig對一些參數的默認設置如下:

testWhileIdle=true

minEvictableIdleTimeMills=60000

timeBetweenEvictionRunsMillis=30000

numTestsPerEvictionRun=-1

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章