redis(二)redis概述與jedis的使用

weixin_33850890發表於2018-01-14

redis是一個高效能的、支援網路、可基於記憶體的key-value儲存機制的NoSQL資料庫。基於記憶體的特性使得redis有非比尋常的效能優勢。

關於redis的資料結構

作為key-value的資料庫,redis儲存的資料型別不止數值型別和字串型別,還包括以下幾種資料型別:

hash型別

hash型別是一種雜湊型別,和java中的hashMap很像,儲存的值可以包括多個不重複欄位,例如一個User物件的name和age都可以作為hash型別的一個欄位,相對於將每個欄位單獨儲存為String型別,hash型別更節省記憶體,因為redis的hash是用zipMap來儲存的,並不是hashTable, zipmap 相比正常的 hash實現可以節省不少hash本身需要的一些儲存開銷,雖然這樣使得hash的屬性的新增、刪除和查詢的時間複雜度為O(n),但是一般用hash型別儲存物件,而物件的屬性一般不會太多,因此平均時間複雜度接近於O(1),並且,當field或value的大小超過一定大小時,redis會將hash型別從zipMap轉換成正常的hash實現,這個限制可以在配置檔案中如下指定

hash-max-zipmap-entries 64 #配置欄位最多 64 個
hash-max-zipmap-value 512 #配置 value 最大為 512 位元組

list型別

list型別是一種有序的列表型別,實現是用雙向連結串列實現的。主要的功能有push、pop、獲取列表中某個範圍的元素等,儲存的值都是string型別,list因為是雙向連結串列結構,可以作為棧和佇列使用。

set型別

set 型別是一種集合型別,它是無序的不可重複的,set是通過hashTable實現的,因而增刪查詢的複雜度都是O(1),set的操作包括set型別的交併補。

sortedSet型別

sortedSet是一種有序的Set型別,通過指定一個Score屬性作為排序的域,這個域的值可以修改,每次指定score值後,sortedSet會對元素進行排序,因此插入的效率低於set,包括的功能和set型別相似,sortedSet最經常的使用方式應該是作為索引來使用.我們可以把要排序的欄位作為score 儲存,物件的id當元素儲存。

jedis 介紹

jedis是一個用java寫的redis資料庫操作的客戶端,通過jedis,可以很方便的對redis資料庫進行操作,jedis的api的學習成本也很低,原始碼很簡單,有時間的同學可以看一下原始碼,jedis很多對資料庫的操作的方法名都是和redis-cli的API一致,關於redis-cli的API ,常用的有以下:


2165432-d6dd509cae57eb89.png
redis-cli 常用命令

簡單程式碼演示:

@Test
public void useJedis(){
    //建立jedis物件
    Jedis jedis = new Jedis("127.0.0.1",6379,5000);
    //認證密碼,如果沒有密碼不需要此步
    jedis.auth("password");
    //選擇資料庫序號
    jedis.select(1);
    //存值
    jedis.set("testStringKey","Hello Redis!");
    jedis.hset("testHashKey","msg","Hello Redis too!");

    //取值
    System.out.println(jedis.get("testStringKey"));
    System.out.println(jedis.hget("testHashKey","msg"));

    jedis.close();
}

/**
 * 使用連線池
 */
@Test
public void useRedisPool(){
    JedisPoolConfig config = new JedisPoolConfig();
    //設定最大十個連線,具體程式設計需要根據情況配置
    config.setMaxTotal(10);
    JedisPool jedisPool = new JedisPool(config,"127.0.0.1",
            6379,5000,"password");
    Jedis jedis = jedisPool.getResource();

    //存值
    jedis.set("testStringKey","Hello Redis!");
    jedis.hset("testHashKey","msg","Hello Redis too!");

    //取值
    System.out.println(jedis.get("testStringKey"));
    System.out.println(jedis.hget("testHashKey","msg"));
    /**
     * 關閉資源,使用連線池的時候,jedis.close方法對資源的處理並不是釋放,而是歸還連線池
     */
    jedis.close();
    jedisPool.close();
}

更詳細的jedis的API介紹移步jedis-2.9-doc

相關文章