1. 程式人生 > >redis之Jedis-API介紹和連線池使用

redis之Jedis-API介紹和連線池使用

Redis的各種語言客戶端列表,請參見Redis Client。其中Java客戶端在github上start最高的是Jedis和Redisson。Jedis提供了完整Redis命令,而Redisson有更多分散式的容器實現。

新增maven 依賴

        <!--redis - jedis-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
<version>2.9.0</version> </dependency>

JedisTest操作程式碼

package com.us.redis;

import redis.clients.jedis.BinaryClient;
import redis.clients.jedis.Jedis;

import java.util.*;

/**
 * Created by yangyibo on 2018/1/12.
 */
public class JedisTest {

    public static void
main(String[] args) { // testString(); // testMap(); // testList(); // testSet(); testSortSet(); } public static Jedis connect() { // 不使用連線池 // Jedis jedis = new Jedis("192.168.100.76", 6379); // jedis.auth("admin"); // //ping通顯示PONG // System.out.println(jedis.ping());//去ping我們redis的主機所在ip和埠
//從redis 連線池中獲取 Jedis jedis = JedisPoolTest.getJedis(); return jedis; } /** * 操作string型別的key 如圖1 * string 是最基本的型別,而且 string 型別是二進位制安全的。意思是 redis 的 string 可以 包含任何資料。 * 比如 jpg 圖片或者序列化的物件。從內部實現來看其實 string 可以看作 byte陣列,最大上限是 1G 位元組 */ public static void testString() { Jedis jedis = connect(); jedis.set("name", "abel"); // set 多個key and value jedis.mset("name", "abel", "age", "23", "qq", "123244232"); //age + 1 jedis.incr("age"); System.out.println(jedis.get("name")); // delete key jedis.del("name"); jedis.close(); } /** * 操作map 如圖2 * hash 是一個 string 型別的 field 和 value 的對映表。新增,刪除操作都是 O(1)(平均)。 * hash 特別適合用於儲存物件。相對於將物件的每個欄位存成單個 string 型別。將一個物件儲存在 hash 型別中會佔用更少的記憶體,並且可以更方便的存取整個物件。 */ public static void testMap() { Map<String, String> map = new HashMap<>(); map.put("address", "上海"); map.put("name", "abel"); map.put("age", "23"); Jedis jedis = connect(); jedis.hmset("user", map); // 從map 中取出 value // 第一個引數是存入redis中map物件的key,後面跟的是放入map中的物件的key,後面的key可以跟多個,是可變 List<String> getmap = jedis.hmget("user", "address"); System.out.println(getmap); List<String> getmap2 = jedis.hmget("user", "address", "age"); System.out.println(getmap2); //刪除map中的某個鍵值 jedis.hdel("user", "age"); System.out.println(jedis.hlen("user")); //返回key為user的鍵中存放的值的個數2 System.out.println(jedis.exists("user"));//是否存在key為user的記錄 返回true System.out.println("all keys : " + jedis.hkeys("user"));//返回map物件中的所有key System.out.println("all values : " + jedis.hvals("user"));//返回map物件中的所有value //獲取 user 中的所有key Set<String> keys = jedis.hkeys("user"); keys.stream().forEach(x -> System.out.println("key: " + x)); } /** * list 連結串列 如圖3 * list 是一個連結串列結構,可以理解為一個每個子元素都是 string 型別的雙向連結串列 */ private static void testList() { Jedis jedis = connect(); //移除 lists 中所有的內容 jedis.del("lists"); // 向key lists 連結串列頭部新增字串元素 jedis.lpush("lists", "abel1"); jedis.lpush("lists", "abel2"); jedis.lpush("lists", "abel3"); // 向key lists 連結串列尾部新增字串元素 jedis.rpush("lists", "abel4"); jedis.rpush("lists", "abel5"); //獲取lists 的長度 System.out.println(jedis.llen("lists")); //按順序輸出連結串列中所有元素 System.out.println(jedis.lrange("lists", 0, -1)); //在abel4 前插入 abelLinsert jedis.linsert("lists", BinaryClient.LIST_POSITION.BEFORE, "abel4", "abelLinsert"); System.out.println(jedis.lrange("lists", 0, -1)); //修改列表中指定下標2 的值 為abelLset jedis.lset("lists", 2, "abelLset"); System.out.println(jedis.lrange("lists", 0, -1)); //插入兩個 abel2 為了後面的刪除 jedis.lpush("lists", "abel2"); jedis.lpush("lists", "abel2"); // 從 lists 中刪除 3 個 value = abel2 的元素 , 可以不連續 // 當刪除 count = 0 個 時則刪除全部 value = abel2 的元素 jedis.lrem("lists", 0, "abel2"); System.out.println(jedis.lrange("lists", 0, -1)); } /** * 如圖4 * set 是無序集合,最大可以包含(2 的 32 次方-1)40多億個元素。 * set 的是通過 hash table 實現的, 所以新增,刪除,查詢的複雜度都是 O(1)。hash table 會隨著新增或者刪除自動的調整大小。 */ public static void testSet() { Jedis jedis = connect(); jedis.sadd("person", "abel1"); jedis.sadd("person", "abel2"); jedis.sadd("person", "abel3"); jedis.sadd("person", "abel4"); jedis.sadd("person", "abel4"); //獲取所有加入的value System.out.println(jedis.smembers("person")); // 從 person 中 移除 abel4 jedis.srem("person", "abel4"); //獲取所有加入的value System.out.println("values: " + jedis.smembers("person")); //判斷 abels 是否是 person 集合的元素 System.out.println(jedis.sismember("person", "abels")); //返回集合中的一個隨機元素 System.out.println(jedis.srandmember("person")); //返回集合的元素個數 System.out.println(jedis.scard("person")); } /** * sorted 如圖5 * sorted set 是有序集合,它在 set 的基礎上增加了一個順序屬性,這一屬性在新增修 改元素的時候可以指定,每次指定後,會自動重新按新的值調整順序。 * 可以理解了有兩列的 mysql 表,一列存 value,一列存順序。 * <p> * sort set和set型別一樣,也是string型別元素的集合,也沒有重複的元素,不同的是sort set每個元素都會關聯一個權, * 通過權值可以有序的獲取集合中的元素新增,刪除,查詢的複雜度都是O(1) */ public static void testSortSet() { Jedis jedis = connect(); System.out.println(jedis.flushDB()); jedis.zadd("sortKey", 300, "abel"); jedis.zadd("sortKey", 20, "mysql"); jedis.zadd("sortKey", 40, "redis"); // 按權值從小到大排序 System.out.println(jedis.zrange("sortKey", 0, -1)); // 按權值從大到小排序 System.out.println(jedis.zrevrange("sortKey", 0, -1)); // 元素個數 System.out.println("元素個數:" + jedis.zcard("sortKey")); // 元素abel 的 下標 System.out.println("元素xxx 的 下標:" + jedis.zscore("sortKey", "abel")); // 刪除元素 abel // jedis.zrem("sortKey", "abel"); //權值 0-100的總數 System.out.println("0-100 的總數: " + jedis.zcount("sortKey", 0, 100)); //給元素 redis 的 權值 + 50 System.out.println("給元素的 權值 + 50: " + jedis.zincrby("sortKey", 50, "redis")); //權值在0-100的值 System.out.println("權值在0-100的值: " + jedis.zrangeByScore("sortKey", 0, 100)); //返回 mysql 的權值的排名,從0開始計數 System.out.println(jedis.zrank("sortKey", "mysql")); // 輸出整個集合值 System.out.println("輸出整個集合值: " + jedis.zrange("sortKey", 0, -1)); } }

圖1

這裡寫圖片描述

圖2

這裡寫圖片描述

圖3

這裡寫圖片描述

圖4

這裡寫圖片描述

圖5

這裡寫圖片描述

JedisPool 連線池

package com.us.redis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * Created by yangyibo on 2018/1/12.
 */
public class JedisPoolTest {
    /**
     * host
     */
    private static String ADDR = "192.168.100.76";
    /**
     * password
     */
    private static String AUTH = "admin";
    /**
     * port
     */
    private static int PORT = 6379;

    private static JedisPool jedisPool = null;
    private static int TIMEOUT = 10000;
    /**
     * 等待可用連線的最大時間,單位毫秒,預設值為-1,表示永不超時。如果超過等待時間,則直接丟擲JedisConnectionException;
     */
    private static int MAX_WAIT = 10000;
    /**
     * 在borrow一個jedis例項時,是否提前進行validate操作;如果為true,則得到的jedis例項均是可用的;
     */
    private static boolean TEST_ON_BORROW = true;
    /**
     * 控制一個pool最多有多少個狀態為idle(空閒的)的jedis例項,預設值也是8。
     */
    private static int MAX_IDLE = 200;


    static {
        try {
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxIdle(MAX_IDLE);
            config.setTestOnBorrow(TEST_ON_BORROW);
            config.setMaxWaitMillis(MAX_WAIT);
            jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public synchronized static Jedis getJedis() {
        if (jedisPool != null) {
            Jedis jedis = jedisPool.getResource();
            return jedis;
        }
        return null;
    }

    public synchronized static void close(Jedis jedis) {
        if (jedis != null) {
            jedis.close();
        }
    }
}