1、Jedis基本使用
Jedis的基本使用很是簡單,只須要建立Jedis對象的時候指定host,port, password便可。固然,Jedis對象又不少構造方法,都大同小異,只是對應和Redis鏈接的socket的參數不同而已。redis
jedis = new Jedis("localhost", 6379); //指定Redis服務Host和port jedis.auth("xxxx"); //若是Redis服務鏈接須要密碼,制定密碼 String value = jedis.get("key"); //訪問Redis服務 jedis.close(); //使用完關閉鏈接
Jedis基本使用十分簡單,在每次使用時,構建Jedis對象便可。在Jedis對象構建好以後,Jedis底層會打開一條Socket通道和Redis服務進行鏈接。
因此在使用完Jedis對象以後,須要調用Jedis.close()方法把鏈接關閉,否則會佔用系統資源。固然,若是應用很是平凡的建立和銷燬Jedis對象,對應用的性能是很大影響的,由於構建Socket的通道是很耗時的(相似數據庫鏈接)。咱們應該使用鏈接池來減小Socket對象的建立和銷燬過程數據庫
2、鏈接池使用
Jedis鏈接池是基於apache-commons pool2實現的。在構建鏈接池對象的時候,須要提供池對象的配置對象,及JedisPoolConfig(繼承自GenericObjectPoolConfig)。咱們能夠經過這個配置對象對鏈接池進行相關參數的配置(如最大鏈接數,最大空數等)。apache
JedisPoolConfig config = new JedisPoolConfig(); config.setMaxIdle(8); config.setMaxTotal(18); JedisPool pool = new JedisPool(config, "127.0.0.1", 6379, 2000, "password"); Jedis jedis = pool.getResource(); String value = jedis.get("key"); ...... jedis.close(); pool.close();
使用Jedis鏈接池以後,在每次用完鏈接對象後必定要記得把鏈接歸還給鏈接池。Jedis對close方法進行了改造,若是是鏈接池中的鏈接對象,
調用Close方法將會是把鏈接對象返回到對象池,若不是則關閉鏈接。能夠查看以下代碼api
public void close() { if (this.dataSource != null) { if (this.client.isBroken()) { this.dataSource.returnBrokenResource(this); } else { this.dataSource.returnResource(this); } } else { this.client.close(); } }
3、Redis的訂閱
Redis爲咱們提供了publish/subscribe(發佈/訂閱)功能。咱們能夠對某個channel(頻道)進行subscribe(訂閱),當有人在這個channel上publish(發佈)消息時,redis就會通知咱們,這樣咱們能夠收到別人發佈的消息。 做爲Java的redis客戶端,Jedis提供了publish/subscribe的接口app
/** * 消息接收器 */ public class JedisReceiveMsg extends Thread { @Override public void run() { System.out.println("...頻道一...."); Jedis jedis = JedisUtils.getJedis(); JedisPubSub jedisPubSub=new JedisPubSub() { @Override public void onMessage(String channel, String message) { // 執行訂閱消息 super.onMessage(channel, message); //終止訂閱 //super.unsubscribe(); System.out.println(message); } }; jedis.subscribe(jedisPubSub,"channel1"); } }
/** * 定義消息發送方法和消息監聽器,繼承JedisPubSub */ public class JedisChannel extends JedisPubSub { private static boolean ifOpen=false; static { if(ifOpen==false){ ifOpen=true; System.out.println("初始化消息接收器"); JedisReceiveMsg jedisReceiveMsg=new JedisReceiveMsg(); jedisReceiveMsg.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } //發佈消息 public void sendMessage(String message){ System.out.println("sendMessage.."+message); Jedis jedis = JedisUtils.getJedis(); jedis.publish("channel1", message); } }
/** * 測試 * @return */ @RequestMapping("/test5") @ResponseBody public String test5() { JedisChannel jedisChannel=new JedisChannel(); jedisChannel.sendMessage("hello hello"); return "ok"; }
4、jides經常使用apisocket
(1).鍵的操做
jedis.flushDB();//清空數據
jedis.set("key1","value1");//設置數據
jedis.exists("key1");//判斷鍵是否存在
Set<String> keys= jedis.keys("*");//獲取全部鍵
jedis.del("key1");//刪除鍵
jedis.expire("key1",10);//設置鍵過時/秒
jedis.ttl("key1");//獲取鍵的剩餘生存時間
jedis.type("key1");//查看鍵對應值的數據類型ide
(2).字符串的操做
jedis.set("key","value");//增長或覆蓋數據項
jedis.setnx("key","value");//非覆蓋增長
jedis.setex("key",3,"value");//增長數據項並設置過時時間
jedis.get("key");//獲取key的數據項
jedis.append("key","1");//在key的value後面追加1,若是key不存在就建立
jedis.mset("key1","value1","key2","value2");//增長多個鍵值對
List<String> strs=jedis.mget("key1","key2");//獲取多個key對應value
jedis.del(new String[]{"key1","key2"});//刪除多個key
jedis.getSet("key","123");//獲取value並更新value性能
(3).整數和浮點數操做
jedis.set("key","1");//value爲可轉化的數字
jedis.incr("key");//value加1
jedis.incrBy("key",2);//value加n
jedis.decr("key");//value減1
jedis.decrBy("key",2);//value減n測試
(4).List操做
jedis.lpush("key","1","2","3");//添加一個list
jedis.rpush("key","1","2","3");//添加一個list
jedis.lpop("key");//對應list左出棧一個元素
jedis.rpop("key");//對應list右出棧一個元素
jedis.llen("key");//獲取key對應list長度
jedis.lset("key",1,"f");//修改key對應list下標n對應的元素
jedis.lindex("key",1);//獲取key對應list下標n對應元素
jedis.sort("key");//key對應list的元素從小到大排序this
(5).set操做
jedis.sadd("key","1","2","3","4");//添加一個set
jedis.sadd("key1","12","2","33","4");//添加一個set
Set<String> strings= jedis.smembers("key");//獲取set對應元素
jedis.srem("key","1");//刪除set下值爲1的元素
jedis.spop("key");//隨機出棧set裏的某個元素
jedis.scard("key");//獲取set裏元素個數
strings=jedis.sinter("key","key1");//獲取key和key1下對應元素的交集
strings=jedis.sunion("key","key1");//獲取key和key1下對應元素的並集
strings=jedis.sdiff("key","key1");//獲取key和key1下對應元素的差集
(6).hash操做
jedis.hmset("key",map);//添加hashMap
jedis.hset("key","a","2");//修改hashMap中key=a的元素
Map<String,String> map2=jedis.hgetAll("key");//獲取hashMap下全部key-value元素
Set<String> keys =jedis.hkeys("key");//獲取hashMap下的全部key
List<String> hvals =jedis.hvals("key");//獲取hashMap下的全部value
jedis.hexists("key","a");//判斷hashMap中是否存在key=a
jedis.hlen("key");//獲取key下的元素個數
(7).有序集合操做
Map<String,Double> map=new HashMap<>();//key=member,value=score
map.put("1",1.51);
map.put("2",8.51);
map.put("3",3.51);
map.put("4",4.51);
map.put("5",2.71);
jedis.zadd("key",map);//添加zset
jedis.zadd("key",1.18,"6");//插入zset
Set<Tuple>strings= jedis.zrangeWithScores("key",0,2);//獲取區間內score-member
long n=jedis.zcard("key");//獲取元素個數
double score=jedis.zscore("key","1");//獲取map下member=1的score
n=jedis.zrank("key","6");//獲取map下member=6在全部score中的排名
jedis.zrem("key","1");//移除map下member=1的元素
(8).排序操做
jedis.lpush("key","5","3","10","1","2");
List<String> list= jedis.sort("key",new SortingParams().desc());
for (int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
文章參考:https://www.jianshu.com/p/a1038eed6d44