Jedis简单使用
Redis在Java中的實(shí)現(xiàn)是Jedis,需要導(dǎo)入jedis.jar、commons-net.jar(具體版本自己選擇)以及commons-pool2x.jar(commons-pool用于Jedis連接池的創(chuàng)建,如果使用了連接池commons-pool包的版本不能低于2x,這是因?yàn)槭褂昧薿rg.apache.commons.pool2下面的類,這個(gè)包在2x版本才有)。
一、創(chuàng)建Jedis連接池生成Jedis連接
1、連接池的配置,可以放在單獨(dú)的properties文件,便于修改
JedisPool.properties:
#服務(wù)器IP ADDR=127.0.0.1 #redis端口號(hào) PORT=6379 #訪問密碼 AUTH= #可用最大連接數(shù) MAX_TOTAL=1000 #最大空閑連接數(shù) MAX_IDLE=100 #最長等待時(shí)間 MAX_WAIT=10000 #超時(shí)時(shí)間 TIMEOUT=60000 #在獲取redis連接時(shí),自動(dòng)檢測(cè)連接是否有效 TEST_ON_BORROW=true2、創(chuàng)建生成Jedis連接的類
redis.clients.jedis.JedisPoolConfig:存放配置信息
redis.clients.jedis.JedisPool:加載配置信息創(chuàng)建連接池
RedisClient.java:
import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.InputStream; import java.util.Properties;import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig;public class RedisClient {//連接池private static JedisPool jedisPool;static{try{InputStream is=new BufferedInputStream(new FileInputStream("src/com/teriste/resources/JedisPool.properties"));Properties properties=new Properties();properties.load(is);JedisPoolConfig config=new JedisPoolConfig();config.setMaxTotal(Integer.parseInt(properties.getProperty("MAX_TOTAL")));config.setMaxIdle(Integer.parseInt(properties.getProperty("MAX_IDLE")));config.setMaxWaitMillis(Integer.parseInt(properties.getProperty("MAX_WAIT")));config.setTestOnBorrow(Boolean.getBoolean(properties.getProperty("TEST_ON_BORROW")));//這里我的redis數(shù)據(jù)庫沒有設(shè)置密碼所以不需要密碼參數(shù),否則可以添加密碼參數(shù)//jedisPool=new JedisPool(config,ADDR,PORT,TIMEOUT,AUTH);jedisPool=new JedisPool(config,properties.getProperty("ADDR"),Integer.parseInt(properties.getProperty("PORT")),Integer.parseInt(properties.getProperty("TIMEOUT")));}catch (Exception e){e.printStackTrace();}}//獲取Redis資源public synchronized static Jedis getJedis(){try{if (jedisPool!=null){Jedis jedis=jedisPool.getResource();return jedis;}else {return null;}}catch (Exception e){e.printStackTrace();}return null;}//釋放redis資源@SuppressWarnings("deprecation")public synchronized static void releaseConn(Jedis jedis){if (jedisPool!=null){jedisPool.returnResource(jedis);}} }二、Jedis操作Redis基本數(shù)據(jù)類型
import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set;import redis.clients.jedis.Jedis; import redis.clients.jedis.BinaryClient.LIST_POSITION; import redis.clients.jedis.Tuple;public class TestJedis {public static void main(String[] args){System.out.println("********操作String類型************");//操作String類型operateString();System.out.println("********操作Hash類型************");//操作Hash類型operateHash();System.out.println("********操作List類型************");//操作List類型operateList();System.out.println("********操作Set類型數(shù)據(jù)************");//操作Set類型數(shù)據(jù)operateSet();System.out.println("********操作ZSet類型數(shù)據(jù)************");//操作有序集合類型operateSortedSet();System.out.println("********Jedis事務(wù)處理************");//Jedis事務(wù)處理jedisTransaction();} }操作String類型數(shù)據(jù):
/*** String類型基本操作*/public static void operateString(){Jedis jedis=RedisClient.getJedis();try{//清空數(shù)據(jù)庫(謹(jǐn)慎操作),這里只是為了便于觀察輸出結(jié)果//jedis.flushDB();//設(shè)置鍵值jedis.set("test", "testString");System.out.println("Save test value="+jedis.get("test"));//在鍵值后追加內(nèi)容jedis.append("test", " this is append string");System.out.println("Append string to test:"+jedis.get("test"));//根據(jù)鍵獲取值String test=jedis.get("test");System.out.println("find string test:"+test);//刪除指定鍵jedis.del("test");System.out.println("delete string test:"+jedis.get("test"));//判斷鍵是否存在boolean isNotExists=jedis.exists("test");System.out.println("test is Exists?:"+(isNotExists?"是":"否"));//如果鍵值是整數(shù)可以進(jìn)行加減操作,否則會(huì)報(bào)錯(cuò)jedis.set("testInt", "0");jedis.incr("testInt");System.out.println("new testInt:"+jedis.get("testInt"));jedis.del("testInt");//設(shè)置鍵的生存時(shí)間jedis.set("testtest", "testTTL");jedis.expire("testtest", 30);Thread.sleep(10000);//獲取鍵的剩余生存時(shí)間System.out.println(jedis.ttl("testtest"));}catch (Exception e){e.printStackTrace();}finally{RedisClient.releaseConn(jedis);}}輸出結(jié)果如下:
********操作String類型************ Save test value=testString Append string to test:testString this is append string find string test:testString this is append string delete string test:null test is Exists?:否 new testInt:1 20操作Hash數(shù)據(jù)類型:
public static void operateHash(){Jedis jedis=RedisClient.getJedis();try{//清空數(shù)據(jù)庫(謹(jǐn)慎操作),這里只是為了便于觀察輸出結(jié)果//jedis.flushDB();Map<String, String> map=new HashMap<String, String>();map.put("name", "張三");map.put("sex", "男");map.put("age", "24");//添加hash類型數(shù)據(jù)jedis.hmset("person", map);//獲取該鍵包含的所有鍵值對(duì)System.out.println("add hash map to jedis:"+jedis.hgetAll("person"));//獲取該鍵包含的指定鍵值System.out.println("get key's value:"+jedis.hget("person", "name"));//判斷鍵是否存在boolean isExists=jedis.hexists("person", "professional");System.out.println("Key professional is in name?"+(isExists?"是":"否"));//獲取該散列包含的鍵的個(gè)數(shù)long hlen=jedis.hlen("person");System.out.println("key person's length is:"+hlen);//向散列中添加鍵值jedis.hset("person", "professional", "軟件工程師");System.out.println("get updated persion:"+jedis.hgetAll("person"));//如果鍵值是整型,可以加減該鍵值jedis.hincrBy("person", "age",2);System.out.println("get updated age:"+jedis.hget("person","age"));//刪除散列中的鍵jedis.hdel("person", "professional");isExists=jedis.hexists("person", "professional");System.out.println("person's professional is exists?"+(isExists?"是":"否"));}catch (Exception e){e.printStackTrace();}finally{RedisClient.releaseConn(jedis);}}輸出結(jié)果如下:
********操作Hash類型************ add hash map to jedis:{sex=男, name=張三, age=24} get key's value:張三 Key professional is in name?否 key person's length is:3 get updated persion:{professional=軟件工程師, sex=男, name=張三, age=24} get updated age:26 person's professional is exists?否操作List類型:
public static void operateList(){Jedis jedis=RedisClient.getJedis();try{//清空數(shù)據(jù)庫(謹(jǐn)慎操作),這里只是為了便于觀察輸出結(jié)果//jedis.flushDB();//先刪除之前創(chuàng)建的List避免之前存入的值影響輸出結(jié)果jedis.del("redisList");//從列表左側(cè)增加元素,lpush()方法參數(shù)列表是可變參數(shù)jedis.lpush("redisList","Redis","Mysql");jedis.lpushx("redisList", "Oracle");//lpushx()和rpushx()方法只能插入已存在的List中,如果鍵不存在就不進(jìn)行任何操作jedis.lpushx("RedisList", "Oracle");System.out.println("------"+jedis.lrange("redisList", 0, -1));//從列表右側(cè)插入元素jedis.rpush("redisList", "Mongodb");jedis.rpushx("redisList", "DB2");//linsert()可以在指定值后插入元素,如果該元素有多個(gè),只在第一個(gè)后面插入jedis.linsert("redisList", LIST_POSITION.AFTER, "Mysql", "Mysql");jedis.linsert("redisList", LIST_POSITION.AFTER, "Mysql", "DB2");System.out.println(jedis.lrange("redisList", 0, -1));//lrange()方法可以遍歷List中的元素返回list,當(dāng)開始坐標(biāo)是0結(jié)束坐標(biāo)是-1時(shí)表示遍歷整個(gè)redisListList<String>redisList=jedis.lrange("redisList", 0, -1);System.out.print("Element in redisList:[");for (int i = 0; i < redisList.size(); i++ ){System.out.print(redisList.get(i)+" ");}System.out.println("]");//根據(jù)指定索引獲取值,索引為正從左往右獲取,索引為負(fù)從右向左獲取String index2=jedis.lindex("redisList", 2);String index_2=jedis.lindex("redisList", -2);System.out.println("from left to right the index 2 is:"+index2);System.out.println("from right to left the index 2 is:"+index_2);//修改列表指定索引元素,若不存在則報(bào)錯(cuò)jedis.lset("redisList", 1, "updateValue");System.out.println("update index 1 value:"+jedis.lindex("redisList", 1));//刪除列表左側(cè)頭部元素String lrem=jedis.lpop("redisList");System.out.println("Remove left top element:"+lrem);//刪除列表右側(cè)頭部元素String rrem=jedis.rpop("redisList");System.out.println("Remove right top element:"+rrem);//去除索引范圍外的元素String ltrim=jedis.ltrim("redisList", 1, 3);System.out.println("trim redisList 1-3 other element:"+ltrim);System.out.println("find redisList:"+jedis.lrange("redisList", 0, -1));//移出指定值的索引位置,如果count>0從左往右刪除count個(gè)該元素,如果count=0刪除列表中全部該元素,如果count<0從右往左刪除count個(gè)該元素jedis.lrem("redisList", 1, "DB2");System.out.println("remove from left to right DB2 in redisList:"+jedis.lrange("redisList", 0, -1));}catch (Exception e){e.printStackTrace();}finally{RedisClient.releaseConn(jedis);}}輸出結(jié)果如下:
********操作List類型************ ------[Oracle, Mysql, Redis] [Oracle, Mysql, DB2, Mysql, Redis, Mongodb, DB2] Element in redisList:[Oracle Mysql DB2 Mysql Redis Mongodb DB2 ] from left to right the index 2 is:DB2 from right to left the index 2 is:Mongodb update index 1 value:updateValue Remove left top element:Oracle Remove right top element:DB2 trim redisList 1-3 other element:OK find redisList:[DB2, Mysql, Redis] remove from left to right DB2 in redisList:[Mysql, Redis]操作Set類型數(shù)據(jù):
public static void operateSet(){Jedis jedis=RedisClient.getJedis();try{//清空數(shù)據(jù)庫(謹(jǐn)慎操作)//jedis.flushDB();//添加元素,注意與List類型的區(qū)別,Set不會(huì)存儲(chǔ)重復(fù)元素,比較適合做博客標(biāo)簽等應(yīng)用場(chǎng)景jedis.sadd("redisSet", "Redis");jedis.sadd("redisSet", "Redis","Mysql");jedis.sadd("redisSet", "Redis","Mysql","Oracle","DB2");//查詢Set<String> redisSet=jedis.smembers("redisSet");System.out.print("Element in set:[");Iterator<String> iterator=redisSet.iterator();while (iterator.hasNext()){System.out.print(iterator.next()+" ");}System.out.println("]");//Set集合元素個(gè)數(shù)long slen=jedis.scard("redisSet");System.out.println("redisSet's size is:"+slen);//判斷元素是否存在于集合內(nèi)boolean isExists=jedis.sismember("redisSet", "Mysql");System.out.println("Mysql is in redisSet?"+(isExists?"是":"否"));//集合運(yùn)算//并集jedis.sadd("redisSet2", "Redis","Mysql","SqlServer");Set<String> unionSet=jedis.sunion("redisSet","redisSet2");System.out.println("union result:"+unionSet);//并集結(jié)果存入redisSet集合System.out.println("unionSet in Redis:"+jedis.sunionstore("unionSet", "redisSet","redisSet2"));//交集Set<String> interSet=jedis.sinter("redisSet","redisSet2");System.out.println("interSet result:"+interSet);//交集結(jié)果存入redisSet集合System.out.println("interSet in Redis:"+jedis.sinterstore("interSet", "redisSet","redisSet2"));//差集Set<String> diffSet=jedis.sdiff("redisSet","redisSet2");System.out.println("diffSet result:"+diffSet);//差集結(jié)果存入redisSet集合System.out.println("diffSet in Redis:"+jedis.sdiffstore("diffSet","redisSet","redisSet2"));//自交就相當(dāng)于去除集合中所以元素interSet=jedis.sinter("interSet","interSet");//刪除指定集合元素jedis.srem("redisSet", "Mysql");//將一個(gè)集合中的元素移入另一個(gè)集合中jedis.smove("redisSet", "redisSet2", "DB2");System.out.println("Element in redisSet is:"+jedis.smembers("redisSet"));System.out.println("Element in redisSet2 is:"+jedis.smembers("redisSet2"));}catch (Exception e){e.printStackTrace();}finally{RedisClient.releaseConn(jedis);}}輸出結(jié)果如下:
********操作Set類型數(shù)據(jù)************ Element in set:[DB2 Mysql Oracle Redis ] redisSet's size is:4 Mysql is in redisSet?是 union result:[SqlServer, DB2, Mysql, Oracle, Redis] unionSet in Redis:5 interSet result:[DB2, Redis, Mysql] interSet in Redis:3 diffSet result:[Oracle] diffSet in Redis:1 Element in redisSet is:[Oracle, Redis] Element in redisSet2 is:[SqlServer, DB2, Redis, Mysql]操作有序集合類型:
public static void operateSortedSet(){Jedis jedis=RedisClient.getJedis();try{//清空數(shù)據(jù)庫(謹(jǐn)慎操作),這里只是為了便于觀察輸出結(jié)果//jedis.flushDB();//增加jedis.zadd("scores", 69,"zhangsan");jedis.zadd("scores", 83,"lisi");jedis.zadd("scores", 73,"wanger");//zadd()方法也有重載的傳入map類型,分?jǐn)?shù)是Double類型Map<String, Double> scoresMap=new HashMap<String, Double>();scoresMap.put("zhaosi", new Double(59));scoresMap.put("qianyi", new Double(99));jedis.zadd("scores",scoresMap);//查詢System.out.println("按照分?jǐn)?shù)從低到高查詢zrange:"+jedis.zrange("scores", 0, -1));System.out.println("按照分?jǐn)?shù)從高到低查詢zrange:"+jedis.zrevrange("scores", 0, -1));//使用Set存儲(chǔ)元組遍歷元組內(nèi)分?jǐn)?shù)和元素Set<Tuple> sortSet=jedis.zrangeWithScores("scores", 0, -1);Iterator<Tuple>iterator=sortSet.iterator();while(iterator.hasNext()){Tuple tuple=iterator.next();System.out.println(tuple.getScore()+":"+tuple.getElement());}//根據(jù)分?jǐn)?shù)范圍查詢?cè)?60<=score<=100)Set<String> zrangeByScore=jedis.zrangeByScore("scores", new Double(60), new Double(100));System.out.print("zrangeByScore(60-100):");for (Iterator<String> it=zrangeByScore.iterator();it.hasNext();){System.out.print(it.next()+" ");}System.out.println();//查詢指定zset鍵的元素個(gè)數(shù)long setcount=jedis.zcard("scores");//查詢指定分?jǐn)?shù)范圍內(nèi)(60<=score<=100)zset鍵的元素個(gè)數(shù)long rangeCount=jedis.zcount("scores", 60, 100);//查詢指定元素的下標(biāo),不存在則返回nulllong zrank=jedis.zrank("scores", "zhangsan");//查詢指定元素的分?jǐn)?shù),不存在則返回nullDouble zscore=jedis.zscore("scores", "zhangsan");System.out.println("scores's size:"+setcount+"\nrangeCount(60-100):"+rangeCount+"\nzrank(zhangsan):"+zrank+"\nzscore(zhangsan):"+zscore);//修改分?jǐn)?shù)Double zincrby=jedis.zincrby("scores", 99, "zhangsan");System.out.println("zincrby:"+zincrby);//刪除指定元素jedis.zrem("scores", "zhangsan");//根據(jù)分?jǐn)?shù)刪除jedis.zremrangeByScore("scores", 60, 80);System.out.println("scores's elements:"+jedis.zrange("scores", 0, -1));}catch (Exception e){e.printStackTrace();}finally{RedisClient.releaseConn(jedis);}}輸出結(jié)果如下:
********操作ZSet類型數(shù)據(jù)************ 按照分?jǐn)?shù)從低到高查詢zrange:[zhaosi, zhangsan, wanger, lisi, qianyi] 按照分?jǐn)?shù)從高到低查詢zrange:[qianyi, lisi, wanger, zhangsan, zhaosi] 59.0:zhaosi 69.0:zhangsan 73.0:wanger 83.0:lisi 99.0:qianyi zrangeByScore(60-100):zhangsan wanger lisi qianyi scores's size:5 rangeCount(60-100):4 zrank(zhangsan):1 zscore(zhangsan):69.0 zincrby:168.0 scores's elements:[zhaosi, lisi, qianyi]Jedis事務(wù)處理:
使用MULTI開啟事務(wù),EXEC提交事務(wù)。
在執(zhí)行事務(wù)期間使用discard可以回滾事務(wù)
使用watch可以監(jiān)視鍵,如果在事務(wù)之前和事務(wù)期間都修改同一鍵值,那么在事務(wù)之前的修改生效,事務(wù)期間的修改無效。
輸出結(jié)果如下:
********Jedis事務(wù)處理************ 提交事務(wù) list:OK list:OK list:redis.clients.jedis.exceptions.JedisDataException: ERR value is not an integer or out of range總結(jié)
- 上一篇: tcpdump 详细解读
- 下一篇: 优秀的 Android 开源项目