1. 程式人生 > >Redis學習筆記之二:Redis的資料儲存結構

Redis學習筆記之二:Redis的資料儲存結構

Redis與Mysql等關係型資料庫的第一點區別就是Redis的資料儲存結構,Mysql等關係型資料庫以表的形式存放資料,而Redis提供Key-Value形式的儲存格式。與Mysql等資料庫的第二點區別就是資料結構不同,Mysql等關係型資料庫支援整數、浮點數、字串、文字、時間戳等等,而Redis的Key-Value格式中Key只能是String型別,但Redis的Value型別有5種,Value可以為String,List,雜湊型別(Map),Set(集合型別),ZSet(有序集合型別)。這一點看起來好像Mysql要更勝一籌,但你需要知道Redis的原始碼僅僅只有3萬行左右,相比Mysql,這已經很不錯了。

      Redis的Value型別有5種,其中String型別是基礎,其他四種格式包含的只能是String型別,且這5種格式不能有相互巢狀。什麼意思? 例如,在列表中的各項只能是字串,而不能是列表、map、集合,而對於集合等其他資料結構來講也是一樣。

     前面也說過,在Redis中是使用指令來進行資料操縱的。Redis一共提供了100個指令,上面所說的各個型別都需要不同的指令來操縱。這指令聽起來好像很多,但其實真正使用的只有一部分,而且這些執行很簡單,非常容易記憶。例如,將字串儲存到Redis中使用set指令。


可以看到,鍵入set指令會有一個提示,然後繼續輸入:


當然,還有適用於Key的指令,看一百遍不如動手練一練,現在可以開啟電腦上的Redis輸入Redis-cli -h host -p port實際練一練。如果你沒有安裝Redis,也是有辦法的,進入到

Redis官網,點選try it下方的連結,然後會跳轉到下面如圖所示的頁面,然後在綠色框內輸入指令體會一下吧。


Redis的部分指令

順帶提一下,Redis的指令與SQL一樣,是不區分大小寫的,但後面的Key-Value是區分大小寫的。下面命令均使用String型別練習。

   1、EXISTS 這個指令用於判斷指定的Key是否存在,存在返回1,不存在則返回0


EXISTS是可以跟多個Key的,key存在則返回值+1,否則+0,但如果跟多個Key,那就不能知道到底哪個Key存在,哪個Key不存在,例如上圖的test與test2.

   2、DEL,(DELETE)這個指令用於刪除Key,同樣是可以跟多個Key值的,會返回刪除鍵的個數。


   3、TYPE,這個指令類似於Linux中的typeof和java中的instanceof操作符,用於返回Key對應的Value型別,只能跟一個Key。如果對應的Key不存在,返回為none。


   4、EXPIRE,Redis常常用作快取伺服器,自然快取是有時效的,可以使用這個指令設定時間,單位是秒。只能跟一個Key,返回值為1表示設定成功,返回為0表示設定失敗或者Key不存在,所以不能使用這個指令來判斷Key是否存在。


   5、TTL,這個指令用於檢視Key的有效時間(Time To Live),單位秒。只能跟一個Key,如果Key不存在返回-2,如果Key沒有使用EXPIRE設定時間,則返回-1.


   6、PERSIST,這個命令用於取消Key的失效時間,取消成功則返回1,失敗則返回0(Key本身就是永久的或者Key不存在)


   7、Redis還提供了更精確的時間控制,使用指令PEXPIRE設定,單位是毫秒,同時使用PTTL檢視,單位毫秒。除此之外,與EXPIRE和TTL沒有什麼不同。


   8、KEYS pattern。這個指令用於返回有哪些Key,後面pattern支援正則。?表示匹配一個字元,*表示0或者多個,轉義字元使用\轉義。


   ps:除了KEYS指令,其他上面的TYPE、DEL等均不支援正則匹配,例如:


   看完上述幾個指令應該體會到Redis的簡單吧,下面看一下Redis的Java客戶端吧。

Redis的Java客戶端

   測試程式碼如下:
package org.yamikaze.redis.test;

import redis.clients.jedis.Jedis;

import java.util.Set;

/**
 * 測試Java的Client
 * @author yamikaze
 */
public class TestClient {

    public static void main(String[] args) {
        //host填寫對應的域名或者ip,埠不填預設6379
        Jedis client = new Jedis("192.168.1.99");

        String key = "test";
        String key1 = "test2";
        String value = "yamikaze";
        setValue(client, key, value);
        /**
         * 對應EXISTS指令,但區別在於引數只有一個時返回Boolean,多引數時返回Long
         */
        client.exists(key);
        client.exists(key, key1);

        /**
         * 對應DEL指令,返回值為Long
         */
        client.del(key);
        client.del(key, key1);

        /**
         * 對應TYPE指令,返回值為String
         */
        setValue(client, key, value);
        String type = client.type(key);
        System.out.println(type);

        /**
         * 對應EXPIRE以及TTL,PERSIST指令
         */
        client.expire(key, 10);
        Long seconds = client.ttl(key);
        System.out.println(seconds);
        client.persist(key);

        /**
         * pexpire有兩個版本,引數分別為String, int和String,long
         *                  int版本已被棄用
         */
        client.pexpire(key, 10000L);
        Long millSeconds = client.pttl(key);
        System.out.println(millSeconds);
        client.persist(key);

        /**
         * 對應KEYS指令
         */
        setValue(client, key1, value);
        Set<String> keys = client.keys("test*");
        for(String k : keys) {
            //test test2
            System.out.println(k);
        }

    }

    private static void setValue(Jedis client, String key, String value) {
        client.set(key, value);
    }
}
   可以看到Redis的客戶端與用到的指令一樣,這就減小了Redis的學習難度。

Redis的Key-Value是否允許為Null

   我們知道,在Java中,Hashtable對Key以及Value是有限制的,Key和Value均不能為null,那Redis中的Key-Value呢?


   可以看到,set這個指令是有引數限制的,Key-Value必須同時存在,這兒可能看不出是否允許null,那我們可以用程式碼測試一個null時的情況。


   從圖可以看出,set時Value不能為null,Key也不能為null,那我們測試下在伺服器存入Key-null,使用程式碼拉取看看是什麼情況。

package org.yamikaze.redis.test;

import redis.clients.jedis.Jedis;

/**
 * 從Redis伺服器拉取Key-Value為test-null的資料
 * @author yamikaze
 */
public class GetKeyValue {

    public static void main(String[] args) {
        Jedis client = new Jedis("192.168.1.99");
        String key = "test";
        String value = client.get(key);
        //false
        System.out.println(value == null);
        //null字串
        System.out.println(value);
    }
}
   以上說明,在客戶端往服務端設定資料時不能為null值,但伺服器可以設定為null(字串形式的null),而從伺服器拉取資料時只有Key不存在,則會返回null。所以往伺服器set資料時,需要判空(Key和Value都要),get資料時也要判空(Key判空是因為不能向Redis傳送null,而伺服器對值判空是程式需要,避免NPE)。如果Redis儲存的是null-null,則要用null字串取資料。

參考資料

   《Redis入門指南》


相關推薦

Redis學習筆記Redis資料儲存結構

Redis與Mysql等關係型資料庫的第一點區別就是Redis的資料儲存結構,Mysql等關係型資料庫以表的形式存放資料,而Redis提供Key-Value形式的儲存格式。與Mysql等資料庫的第二

Redis學習筆記Redis用作訊息佇列

package org.yamikaze.redis.messsage.subscribe; import org.yamikaze.redis.test.MyJedisFactory; import redis.clients.jedis.Jedis; import redis.clients.jedis

Redis學習筆記)——Redis資料型別

歡迎訪問:zrxJuly’s Bolg Redis支援5種資料型別: - string:字串 - hash:雜湊 - list:列表 - set: 集合 - zset:有序集合(sorted set) String:字串 string是Red

JAVA Redis 學習筆記Redis的連線IP、埠號、連線密碼的修改以及與JAVA簡單互動

一、專案中引入Redis包              根據上一篇文章中給的jar包路徑,將jar包下載,匯入自己的專案。(jedis-2.7.2.jar) 二、與Redis連線  (1)連線IP和埠

Vue.js 學習筆記資料驅動開發

在 Vue.js 框架中,與 HTML 頁面元素的互動方式沒有像原生 JavaScript 介面那麼直接,它是通過先在 HTML 元素標籤中嵌入一系列類似於普通標籤屬性的 Vue 指令屬性來繫結資料,然後再通過在 JavaScript 程式碼中修改這些被繫結的資料來修改頁面元素的顯示方式與內容。在程式設計方法

Linux運維學習筆記常用命令2

linux 運維 筆記71、passwd:修改用戶密碼語法passwd [參數]username選項-k --keep-tokens :保留即將過期的用戶在期滿後仍能使用-l --lock :鎖定用戶無權更改其密碼,只能root才能操作-u --unlock :解除鎖定-S --status :查看用戶狀

《逐夢旅程Windows遊戲編程從零開始》學習筆記GDI框架

register 開發 操作 程序 turn use 繪制 cal 完整 1 //===========================================【程序說明】=================================== 2 //

Memcached學習筆記入門使用

使用 現在伺服器已經正常運行了,下面我們就來寫java的客戶端連線程式。 將java_memcached-release.zip解壓,把java_memcached-release.jar檔案複製到java專案的lib目錄下, 然後我們來編寫程式碼,比如我提供的一個應用類如下: &n

hive程式設計指南學習筆記hive資料庫及其中的表查詢

show databases;                                      /*

SpringSecurity學習筆記SpringSecurity結構及基本配置

Spring Security3.2分為11個模組,如下表所示: Spring Security3.2引入了新的Java配置方案,完全不在需要通過XML來配置安全性功能。如下,展現了Spring Security最簡單的Java配置: @EnableWebSecurity

Redis大總結Redis 事務,WATCH命令,生存時間

事務 Ø  MULTI,EXEC操作:事務的開始和結束標記 n 執行Multi命令,redis反饋ok表示開始事務;執行EXEC命令,結束事務,開始順序執行事務中的操作。 127.0.0.1:6379[5]> MULTI OK 127.0.0.1:6379[5]&g

DirectX 9 UI設計學習筆記第2章Introducing DirectX+第3章Introducing Direct3D

       此文由哈利_蜘蛛俠原創,轉載請註明出處!有問題歡迎聯絡本人! 上一期的地址:        別看這一期似乎要講很多內容,其實大部分是一帶而過的。其實我的重點在於弄了一個框架程式;詳情見本期最後。 第2章 Introducing DirectX ===

spark學習筆記寬依賴和窄依賴

1.如果父RDD裡的一個partition只去向一個子RDD裡的partition為窄依賴,否則為寬依賴(只要是shuffle操作)。 2.spark根據運算元判斷寬窄依賴:      窄依賴:map

博科SAN交換機學習筆記配置檔案備份與韌體升級 作者 LiaoJL | 轉載時請務必以超連結形式標明文章原文連結和作者資訊及本版權宣告。 原文連結http://www.liaojl.co

配置檔案恢復 當需要備份中恢復交換機配置時,可以通過configdownload命令將博科交換機的配置從遠端伺服器恢復到交換機。博科交換機支援將舊版本的配置檔案匯入新版本韌體的交換機,例如將v6.2.0的配置檔案匯入v6.3.0韌體版本的交換機,或者將v6.4.1 配置檔案匯入 v7.0.0 版本的交換機。

吳恩達機器學習 學習筆記 代價函式和梯度下降演算法

二、 2-1 Model Representation 我們學習的第一個演算法是線性迴歸,接下來會講什麼樣的模型更重要,監督學習的過程是什麼樣子。 首先舉一個需要做預測的例子:住房價格上漲,預測房價,我們擁有某一城市的住房價格資料。基於這些資料,繪製圖形。 在已有房價資

Java Web 學習筆記Java HttpURLConnection保持會話的方法

在Java Web開發中,會話保持是伺服器識別客戶端(一般指瀏覽器)的方式。對此,各大瀏覽器都是支援會話保持的。然而在開發者通過Java API HttpURLConnection 開發網路請求工具的

SpringSecurity學習筆記配置使用者儲存

沒有使用者儲存的應用相當於沒有使用者,因為任何使用者都會被拒之門外。我們所需要的是使用者儲存,也就是使用者名稱、密碼以及其他資訊儲存的地方,在進行認證決策的時候,會對其進行檢索。Spring Security非常靈活,能夠基於各種資料儲存來認證使用者。它內建了多種常見的使用者

Redis學習筆記Redis基本資料結構

Redis基礎資料結構 Redis有5種基本資料結構:String(字串)、list(列表)、set(集合)、hash(雜湊)、zset(有序集合) 字串string 字串型別是Redis的value最簡單的資料結構,類似與Java語言中的ArrayList(數字列表),不過在Redis裡String是一種動

Redis學習筆記基本資料結構

Redis基礎資料結構 Redis有5種基本資料結構:String(字串)、list(列表)、set(集合)、hash(雜湊)、zset(有序集合) 字串string 字串型別是Redis的value最簡單的資料結構,類似與Java語言中的ArrayList(數

redis學習筆記linux單機版redis安裝

info 目錄 tar daemon exit 單機 技術分享 gre shutdown Redis安裝   下載最新穩定版本: 官網: https://redis.io/     第一步:將redis.tar.gz解壓:tar -zxvf redis-4.0.10.ta