1. 程式人生 > >Java學習筆記:Redis-資料型別

Java學習筆記:Redis-資料型別

1、Redis介紹

Redis是一種面向“key-value”型別資料的分散式NoSQL資料庫系統,具有高效能、持久儲存、適應高併發應用場景等優勢,是一個高效能的鍵值對(key-value)資料庫。

2、Redis資料結構型別

Redis整體的資料結構都是key-value(鍵值對)形式的,key都是String型別,value具有五種資料型別,分別是:stirng、hash、list、set、sortedset(zset)。

關於key的定義,注意如下幾點:

  1. key不要太長,最好不要操作1024個位元組,這不僅會消耗記憶體還會降低查詢效率

  2. key不要太短,如果太短會降低key的可讀性(見名知意)

  3. 在專案中,key最好有一個統一的命名規範(一般在專案中根據模組以及功能來進行命名)

 

1、通用指令

  • keys pattern:獲取所有與pattern匹配的key,*表示任意一個或多個字元,?表示任意一個字元
    • keys *: 獲取資料庫中所有的key
  • type key值:獲得該key對應值的型別,該命令將以字串的格式返回。 
    • key存在:返回的字串為string、list、set、hash
    • key不存在:返回none
  • clear:清屏  
  • del key值1,key值2...:刪除指定key的資料(該key下的所有資料全部刪除),返回刪除的個數。
  • exists key:判斷該key是否存在,1代表存在,0代表不存在
  • ltrim key startIndex length:將key裁剪成指定長度【可能只適用於list】
  • FLUSHALL:重新整理全部

 

2、string型別(字元型別:String)

​ 字串型別是Redis中最為基礎的資料儲存型別,儲存的都是二進位制資料(在Redis中是二進位制安全的),這便意味著該型別存入和獲取的資料相同,因此不存在中文亂碼的問題(儲存的都是二進位制,存啥取啥<在工具里正常顯示,在命令列顯示二進位制資料>),在Redis中字串型別的Value最多可以容納的資料長度是512M。

儲存結構:[key:value]
    相當於:Map<String, String>
​
1、設定值:set key值 value值
    設定一個與key值關聯的value值。如果key不存在,那麼就先設定一個指定名稱(key值)的key,並將value值賦值給key;
如果該key已經存在,那麼使用新的value覆蓋該key的原始value。  ---> 新建或覆蓋
    
2、獲取值(只能獲取string型別):
    1)、get key值
        存在:該key值對應的是string型別,那麼返回該key值對應的value值;若該key值對應的不是string型別,報錯。
        不存在:返回nil(表示不存在)
    2)、 getset key值 value值
        先獲取key值對應的原始value值,再使用指定的value值替換掉原始的value值(必須是string型別)。
​
3、刪除值:del key值(通用指令)

 

3、hash型別(雜湊型別:Map)

​ 主要用於儲存物件類的資料[key相當於物件名,filed相當於屬性名,value相當於屬性值],但是在實際開發中一般使用 string型別 + json資料格式 替代hash資料型別<操作簡單>。

​ 如果Hash中包含很少的欄位,那麼該型別的資料也將僅佔用很少的磁碟 空間。每一個Hash可以儲存4294967295個鍵值對。

​ Redis中的Hash型別可以看成具有String Key和String Value的map容器。所以該型別非常適合於儲存鍵值對的信 息。

    public class User{
        private String username;
        private String sex;
        private int age;
    }
    也就是說user裡面有三個屬性:username sex age
    User user = new User("jack","boy",18);
​
    hash就可以直接將這個user物件裡面的資料儲存到redis資料中! ---> key相當於物件的引用(物件名),filed相當於屬性名,
value相當於屬性值  

     同一個key(物件)可以具有多個filed(屬性),一個filed(屬性)只能有一個value(屬性值)
        hset user name jack
        hset user age 18
        keys * // user
        hget user name // jack
        hget user age // 18
儲存結構:[key1:[filed1:value1,filed2:value2...],key2:[filed1:value1,filed2:value2...]...]
    key:物件名
    filed:屬性名
    value:屬性值
    相當於:Map<String, Map<String, String>>
​
​
1、設定值:為指定的key值,設定指定的filed值-value值(鍵值對)
    1)、一次設定單個值:hset key值 filed值 value值
    2)、一次設定多個值:hset key值 filed值1 value值1 filed值2 value值2...
    
2、獲取值:獲取key值中指定filed的value值。
    1)、一次獲取單個值:hget key值 filed值
    2)、一次獲取多個值:hmget key值 filed值1 filed值2...
    3)、獲取全部值:hgettall key值  ---> 獲取所有的filed及對應的value
    
3、刪除值:
    一次刪除單個值:hdel key值 filed值   ---> 可以刪除一個或多個欄位,返回值是被刪除的欄位個數
    刪除所有:hdel key

4、list型別(列表型別:雙向連結串列 --> 佇列)

​ 在Redis中,List型別是按照插入順序排序的字串連結串列。和資料結構中的普通連結串列一樣,我們可以在其頭部(left)和 尾部(right)新增新的元素。在插入時,如果該鍵並不存在,Redis將為該鍵建立一個新的連結串列。與此相反,如果鏈 表中所有的元素均被移除,那麼該鍵也將會被從資料庫中刪除。List中可以包含的最大元素數量是4294967295。

​ list型別採用的連結串列是雙向連結串列,一個key對應著一個連結串列,一個連結串列可以儲存若干個value。採用key+索引的方式區分不同的value,value可以重複。

 

儲存結構:[key1:[value1,value2...],key2:[value1,value2...]....] ----> value可以重複,有序
    key:集合名
    value:連結串列
    相當於:Map<String, 連結串列>
​
1、設定值:插入成功,返回元素的個數
    1)、左側(頭部)插入:lpush key值 value值1 value值2...
        key存在:在指定的key所關聯的連結串列的頭部依次插入所有的values
        key不存在:該命令在插入的之前先建立一個與該key關聯的空連結串列,之後再向該連結串列的頭部依次插入資料。                  
    2)、右側(尾部)插入:rpush key值 value值1 value值2...
        key存在:在指定的key所關聯的連結串列的尾部依次插入所有的values
        key不存在:該命令在插入的之前先建立一個與該key關聯的空連結串列,之後再向該連結串列的尾部依次插入資料。 
        
2、獲取值:
    1)、lrange key值 startIndex endIndex:獲取指定key對應的連結串列的指定索引範圍內的所有value。
        索引: 從零開始,最後一個可以用-1表示(索引可以使用負數,負數代表到數-1表示最後一個,-2到數第二個)。
    
3、彈出值:獲取並刪除
    1)、兩端彈出:一次只彈出一個
        lpop key值: 從連結串列的左側(頭部)彈出一個數據(刪除並返回)
        rpop key值: 從連結串列的右側(尾部)彈出一個數據(刪除並返回)
    2)、彈出並賦值:
        rpoplpush key值1 key值2:將key值1的連結串列最右側的資料彈出,並插入到key值2的連結串列的最左側。
        
4、刪除值:
    del key值:刪除整個list連結串列。

5、set型別(集合型別:無序集合)

​ 在Redis中,我們可以將Set型別看作為沒有排序的字元集合,和List型別一樣,我們也可以在該型別的資料值上執 行新增、刪除或判斷某一元素是否存在等操作。需要說明的是,這些操作的時間複雜度為O(1),即常量時間內完成 次操作。Set可包含的最大元素數量是4294967295,和List型別不同的是,Set集合中不允許出現重複的元素。

​ 不允許資料重複(同一個key中的value不能相同,相同的新增不進去<只新增一個>) ,無序的列表,多個set之間可以進行聚合操作(並集 交集 差集)。 ---> 底層採用的可能是Set集合

儲存結構:[key1:[value1,value2...],key2:[value1,value2...]....] ----> value不可以重複,無序
    key:集合名
    value:Set集合
    相當於:Map<String, Set集合>
​
1、設定值:
    sadd key值 value值1 value值2 value值3...:value寫的時候可以重複,但是執行插入時,重複的只新增第一個其餘的不新增
    
2、獲取值:
    smembers key值:獲取所有元素
    
3、判斷指定元素是否存在:
    sismember key值 value值:
        返回1:key值和value值同時存在。
        返回0:key值和value值均不存在,或者只存在一個。
        
4、刪除值:
    srem key值 value值1 value值2...:刪除指定的value
    del key:刪除整個set集合
    
​
5、多個集合進行聚合操作:
    交集:inter
        sinter key1 key2
        
    初始化資料:
    myset   a b 1 2
    myset1  a c 1 3
​
    並集:key1+key2-重複!
        執行指令:sunion myset myset1 
        結果:a b c 1 2 3
​
    交集:
        執行指令:sinter myset myset1
        結果:a 1
        // 並集 and 交集 中key的位置不會影響結果  
​
    差集:顯示key1裡面的內容(去掉重複的)
        執行指令:sdiff myset myset1
        結果:2 b
        執行指令:sdiff myset1 myset
        結果;3 c
        注意: 在差集中,key的位置會影響結果,只顯示第一個key中在其他key中沒有的資料     
        
    應用:維護物件之間的關係
        比如所有購買某一電子裝置的客戶ID被儲存在一個指定的Set中,而購買另外一種電子產品的客戶ID被儲存在另外一個Set中,
        如果此時我們想獲取有哪些客戶同時購買了這兩種商品時
​
        set1(iphone)    c1  c3  c4  c5  c7
        set2(ipad)      c1  c2  c5  c6  c7  
​
        sinter set1 set2 ====>>> c1 c5 c7

6、sortedset(zset,有序集合型別)

​ 一個key可以對應多個score,一個score可以對應多個value[相當於一個key對應著多個score,每個score對應著一個連結串列]score可以重複 但是value不可以重複<不同score中也不能含有相同的value>[預設按照分數從低到高的順序排序] ----> 底層:Map + 連結串列。