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已經分配了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 |