Jedis基本使用

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

相關文章
相關標籤/搜索