1. 程式人生 > >Redis進階實踐之四Redis的基本數據類型

Redis進階實踐之四Redis的基本數據類型

規模 card 擴展 系統 fse nat 四大 軟件使用 html

轉載來源:http://www.cnblogs.com/PatrickLiu/p/8328669.html

一、引言

今天正式開始了Redis的學習,如果要想學好Redis,必須先學好Redis的數據類型。Redis為什麽會比以前的Memchaed等內存緩存軟件使用的更頻繁,適用範圍更廣呢?就是因為Redis使用起來更方便,之所以方便,是因為Redis支持的數據類型比以前的Memchaed緩存支持數據類型的更多了。Redis有五種基本數據類型,String(字符串),Hash(哈希),List(鏈表),Set(集合),ZSet(有序集合),在這五種基本的數據類型中,String類型是最基礎的。為什麽說String類型是最基礎的,就拿List為例來說,它是以列表的形式組織字符串數據,Set類型是以集合類型來組織字符串數據的。今天就讓我們比較全面的來認識一下redis的基本數據類型吧。

二、NoSQL的介紹



NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,意為反Sql運動,提倡運用非關系型的數據存儲,隨著Web2.0網站的興起,傳統的關系型數據庫在應付web2.0網站,特別是超大規模和高並發的SNS類型的web2.0純動態網站已經力不從心,暴露了很多難以克服的問題,而非關系型數據庫則由於其本身的特點得到了迅速發展。

NoSQL是以key-value形式存儲,和傳統的關系型數據庫不一樣,不一定遵循傳統數據庫的一些基本要求,比如:遵循Sql標準,ACID屬性、表結構特性等等。分關系型數據庫的特點如下:非關系型的、分布式的、開源的、水平可以擴展的。

NoSQL數據庫的四大分類


1、鍵值(Key-Value)存儲數據庫:該類數據庫主要會使用到一個哈希表,這個表中有一個特定的鍵和一個指針指向特定的數據。例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.

2、列存儲數據庫:該庫通常是用來應對分布式存儲的海量數據。鍵仍然存在,但是它們的特點是指向了多個列。如:Cassandra, HBase, Riak.

3、文檔型數據庫:該類型的數據模型是版本化的文檔,半結構化的文檔以特定的格式存儲,比如JSON。文檔型數據庫可以看作是鍵值數據庫的升級版,允許之間嵌套鍵值,而且文檔型數據庫比鍵值數據庫的查詢效率更高。如:CouchDB, MongoDb. 國內(SequoiaDB,已經開源)。

4、圖形(Graph)數據庫:圖形結構的數據庫同其他行列以及剛性結構的SQL數據庫不同,它是使用靈活的圖形模型,並且能夠擴展到多個服務器上。

NoSQL使用場景:


1、對數據高並發的讀寫,可以使用NoSQL類型數據庫。

2、對海量數據的高效率的存儲和訪問,可以使用NoSQL類型數據庫。

3、對數據的高可擴展性和高可用性要求比較高的也可以使用NoSQL類型數據庫。

三、Redis的介紹

redis是一個key-value存儲系統。它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。為了保證效率,數據都是緩存在內存中。為了可靠性,redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。

redis的優點如下:

(1) 速度快,因為數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間復雜度都是O(1)

(2) 支持豐富數據類型,支持string,list,set,sorted set,hash

(3) 支持事務,操作都是原子性,所謂的原子性就是對數據的更改要麽全部執行,要麽全部不執行

(4) 豐富的特性:可用於緩存,消息,按key設置過期時間,過期後將會自動刪除

有了這些優點,才會有這麽多的人使用它。

四、Redis的數據類型

redis的數據類型是學好redis的基礎,所以要想很好的掌握redis,必須把它的數據類型掌握好,並且熟練記憶各個類型的基本操作。這裏面針對每種數據類型的操作不是全部都涉及到,只是會涉及到一些常用的命令,如果大家想觀看全部的命令,可以去官網上查看,地址如下:https://redis.io/commands。還有一點需要說明一下,有些例子,可能幾個命令都是相關聯的,比如說第一個命令執行了增加操作,我在介紹第二個命令的時候有時候會使用第一個命令的結果。

1、String字符串類型使用

1.1、redis一共分為五種基本數據類型:String(字符串),Hash(哈希)、List(鏈表),Set(集合),ZSet(有序集合)

1.2、String類型是包含很多種類型的特殊類型,並且是二進制安全的。比如:序列化的對象可以以String類型進行存儲,也可以把一張圖片的二進制數據以String類型進行存儲,當然也可以存儲簡單的字符串數據,也可以以String類型存儲數字。字符串最大的容量是512M,也就是2的32次方-1。

1.3、常用命令如下:

1.3.1】、語法:set key value [EX seconds] [PX milliseconds] [NX|XX] 設置成功OK,如果針對同一個key設置,會覆蓋原來的值。

1】、192.168.127.128:6379>set name HuangFeiHong 可以針對同一個key重復設置值
OK

2】、EX:(expired過期時間,單位秒),設置成功返回OK。查看過期時間ttl key,組合命令:setex

           192.168.127.128:6379>set age 18 ex 10
           OK

           192.168.127.128:6379>ttl age  返回0過期,-2已經刪除該標誌
           (integer)8


3】、PX:(過期時間,單位毫秒),設置成功返回OK,查看過期時間pttl

技術分享圖片
          192.168.127.128:6379>set sex nan px 5000
          OK

          192.168.127.128:6379>pttl sex 返回0為過期,-2已經刪除標誌
          (integer)1125

          192.168.127.128:6379>pttl sex
          (integer)-2
技術分享圖片


4】、NX(not exists):如果指定的Key不存在,就設置該值,組合命令:sexnx

技術分享圖片
         192.168.127.128:6379>set name FangShiYu nx
         (nil)

          192.168.127.128:6379>set name1 FangShiYu nx
         OK

         設置失敗,因為為name 的key 已經存在了,設置成功返回OK,設置失敗返回nil
技術分享圖片


5】、XX:如果key存在就設置該值

技術分享圖片
         192.168.127.128:6379>set address hebeisheng xx(該值不存在)
         (nil)

         192.168.127.128:6379>set address hebeisheng xx(該值存在在)
         OK

         設置失敗,因為key不存在,返回nil,存在才可以設置,成功返回OK。
技術分享圖片


1.3.2】、語法:get key,獲取指定key的值,有值返回值,無值返回nil。

           192.168.127.128:6379>get name
           "HuangFeiHong"


1.3.3】、語法:del key [key...],刪除多個key的值,刪除成功返回刪除的個數,刪除失敗返回0

        192.168.127.128:6379>del name
       (integer)1


1.3.4】、語法:keys Pattern,查看有什麽key

             192.168.127.128:6379>keys *
             1)"name"
             2)"name1"


1.3.5】、語法:dbsize,可以查看key的數量

            192.168.127.128:6379>dbsize
             (integer) 1


1.3.6】、語法:setrange key offset value,從第幾位開始替換成我們想要得值,第幾位就是offset的值。替換字符串,最後返回整個字符串的長度。

             192.168.127.128:6379>set email 1234567890@com
             OK

             192.168.127.128:6379>setrange email 10 #
             (integer)13


1.3.7】、語法:mset key value [key value ...],設置成功返回OK,重復設置會覆蓋

             192.168.127.128:6379>mset name zhangsan sex nan address hebei
              OK


1.3.8】、語法:mget key [key ...],有值得返回值,無值的返回nil

              192.168.127.128:6379>mget name sex address
               "ZhangSan"
               (nil)


1.3.9】、語法:msetnx key value [key value ...],設置成功會返回成功的個數,失敗返回0

             192.168.127.128:6379>msetnx school daxue postnum 1234567
              (integer) 1 或者 (integer) 0


1.3.10】、語法:getset key value,支持並發,是原子操作的,先返回該key的原始值,然後用新值替換原來的值。

技術分享圖片
              192.168.127.128:6379>get name
              "zhangsan"

              192.168.127.128:6379>getset name lisi
              "zhangsan"

              192.168.127.128:6379>get name
              "lisi"
技術分享圖片


1.3.11】、語法:incr key,該key的值必須是數值類型字符串表示,該函數對key的值加一

技術分享圖片
             192.168.127.128:6379>set age 18
             OK

             192.168.127.128:6379>get age
             "18"

             192.168.127.128:6379>incr age
             (integer)19
技術分享圖片


1.3.12】、語法:decr key,該key的值必須是數值型字符串表示,該函數對key的值減一

技術分享圖片
            192.168.127.128:6379>set age 18
            OK

            192.168.127.128:6379>get age
            "18"

            192.168.127.128:6379>decr age
            (integer)17
技術分享圖片


1.3.13】、語法:incrby key increment,該key的值必須是數值型字符串表示,該函數對key的值增加指定的數值(正數情況)或者減少指定數值(負數情況)

技術分享圖片
            192.168.127.128:6379>set age 18
            OK

            192.168.127.128:6379>get age
            "18"

            192.168.127.128:6379>incrby age 3(增加3)-3(減少3)
            (integer)21
技術分享圖片


1.3.14】、語法:decrby key decrement,該key的值必須是數值型字符串表示,該函數對key的值增加指定的數值(負數情況)或者減少指定數值(正數情況)

技術分享圖片
            192.168.127.128:6379>set age 18
            OK

            192.168.127.128:6379>get age
            "18"

            192.168.127.128:6379>decrby age 3(減少3)-3(增加3)
            (integer)15
技術分享圖片


1.3.15】、語法:incrbyfloat key increment,該key的值必須是數值型字符串表示,如果想要給key的值增加或者減少有小數的情況,可以使用該命令,正小數(增加),負小數(減少)

技術分享圖片
            192.168.127.128:6379>set age 18
            OK

            192.168.127.128:6379>get age
            "18"

            192.168.127.128:6379>decrby age 3.5(減少3)-3.5(增加3)
            "21.5"
技術分享圖片


1.3.16】、語法:append key value,向指定的key追加內容,不會覆蓋原始的內容。返回追加後字符串的總長度

            192.168.127.128:6379>append name zhangsan(該key不存在會有set的效果,如果存在就追加)
           (integer)3


1.3.17】、語法:strlen key,獲取指定key值的長度

            192.168.127.128:6379>strlen name
            (integer)10


1.3.18】、語法:type key,返回當前key的值的類型。

            192.168.127.128:6379>type age
            string
      

以上就是Redis的String類型的基本操作,但是這裏沒有包含所有的命令,只是一些經常用到的命令,string類型是redis基本數據類型中最基本,最重要的類型,其他的類型都是基於此的,所以該命令大家要熟練使用。

2、Hash哈希類型的使用

2.1、redis一共分為五種基本數據類型:String(字符串),Hash(哈希)、List(鏈表),Set(集合),ZSet(有序集合)

2.2、Hash類型是String類型的field和value的映射表,或者說是一個string 集合,它特別適合存儲對象,相比較而言,將一個對象類型存儲在Hash類型裏比存儲在string類型占用的內存空間更少,並方便對象的存取。Hash類型的field字段必須是字符串類型,不能是其他數據類型,換句話說Hash類型不能嵌套其他數據類型。一個Hash類型可以包含的key(其實是field)是2的32次方減去1個,也就是說40多億個key(這裏的key也是指field)都可以被支持,所以說Hash可以存儲很大的數據量。

2.3、常用命令如下:

2.3.1】、語法:hset key field value,向鍵值為key的裏面增加field和value的映射數據。增加成功返回1,如果重復增加,會覆蓋,但是返回值是0。

技術分享圖片
               192.168.127.128:6379>hset key1 name zhangsan
               (integer)

               192.168.127.128:6379>hset key1 age 18
               (integer)1

               192.168.127.128:6379>hset key1 age 18
               (integer)0       
技術分享圖片


2.3.2】、語法:hget key field,根據指定的key和field獲取其對應的值。如果有值就返回其值,如果沒有返回值為nil。

               192.168.127.128:6379>hget key1 name
               "zhangsan"

               192.168.127.128:6379>hget key1 address (沒有該field值)
               (nil)


2.3.3】、語法:hmset key field value [field value ...],可以一次設置多個值。設置成功返回OK。如果重復設置會覆蓋原來的值。

               192.168.127.128:6379>hmset key name zhangsan sex nan age 18
               OK


2.3.4】、語法:hmget key field [field ...],可以一次性獲取指定key的多個field的值,有值的field會返回其值,沒有值的返回nil。

               192.168.127.128:6379>hmget key name sex age address(地址屬性沒定義,會返回nil)
               "zhangsan"
               "nan"
               "18"
               (nil)


2.3.5】、語法:hsetnx key field value,如果指定key的field的值不存在,則增加該值。增加成功返回1,增加失敗返回0.

               192.168.127.128:6379>hsetnx key name li
               (integer)0

               192.168.127.128:6379>hsetnx key name1 li(該key的field的值不存在,則增加成功)
               (integer)1


2.3.6】、語法:hincrby key field increment,該value的值必須是數字類型的字符串,否則有錯。讓指定key的指定field的值增加(正值)或者減少(負值)多少。(ERR hash value is not an integer)

               192.168.127.128:6379>hincrby key age 5
               (integer)25

               192.168.127.128:6379>hincrby key age -5
               (integer)20


2.3.7】、語法:hincrbyfloat key field increment,該value的值必須是數字類型的字符串,否則有錯。讓指定key的指定field的值增加(正值)或者減少(負值)多少小數。(ERR hash value is not an integer)

               192.168.127.128:6379>hincrbyfloat key age 0.54
               "20.54"


2.3.8】、語法:hexists key field,判斷指定key的field字段是否有值,有值返回1,無值返回0.

               192.168.127.128:6379>hexists key age
               (integer)1

               192.168.127.128:6379>hexists key age1
               (integer)0


2.3.9】、語法:hlen key,判斷指定key下有幾個field。有值返回就是幾個,沒有紙就返回0。

               192.168.127.128:6379>hlen key
               (integer)4

               192.168.127.128:6379>hlen key1
               (integer)0


2.3.10】、語法:hdel key field,刪除指定key的field鍵值對,刪除成功返回1,刪除失敗返回0.

               192.168.127.128:6379>hdel key name1
               (integer)1

               192.168.127.128:6379>hdel key name1
               (integer)0


2.3.11】、語法:hkeys key,列出指定key的field字段值。

               192.168.127.128:6379>hkeys key
               "name"
               "sex"
               "age"


2.3.12】、語法:hvals key,列出指定key的field的所對應的值,也就是value。

               192.168.127.128:6379>hvals key
               "zhangsan"
               "nan"
               "20.54"


2.3.13】、語法:hgetall key,列出指定key的field和value的映射值。

技術分享圖片
               192.168.127.128:6379>hgetall key
               "name"
               "zhangsan"
               "sex"
               "nan"
               "age"
               "20.54"
技術分享圖片


3、List列表類型的使用

3.1、redis一共分為五種基本數據類型:String(字符串),Hash(哈希)、List(鏈表),Set(集合),ZSet(有序集合)

3.2、List類型是一個鏈表結構的集合,並且是有序的集合,其值是可以重復的,其主要功能操作有push,pop、獲取元素等。更詳細的說,List類型是一個雙端鏈表結構,我們可以通過相關操作在集合的頭部和尾部增加或者刪除元素。List類型設計的非常巧妙,既可以做【棧-先進後出】使用,也可以做【隊列-先進先出】使用,能滿足絕大多數的需求。List類型有點類似數組的概念,所以具有下標,可以針對指定下標進行操作,比如替換。

3.3、常用命令如下:

3.3.1】、語法:lpush key value [value ...] ,向指定列表key從左面增加元素。增加成功,返回當前列表元素的個數。這個顯示的方式是堆棧的形式,先進後出。

技術分享圖片
               192.168.127.128:6379>lpush list1 hello
               (integer)1

               192.168.127.128:6379>lpush list1 world
               (integer)2

               192.168.127.128:6379>lpush list1 world(可以重復增加)
               (integer)3
技術分享圖片


3.3.2】、語法:rpush key value [value ...],向指定的列表key從右面增加元素。增加成功,返回當前列表元素的個數。這個顯示的方式是隊列的形式,先進先出。

技術分享圖片
              192.168.127.128:6379>rpush list2 hello
               (integer)1

               192.168.127.128:6379>rpush list2 world
               (integer)2

               192.168.127.128:6379>rpush list2 !!!
               (integer)3

               先進先出的顯示方式:
               192.168.127.128:6379>lrange list1 0 -1
               "hello"
               "world"
               "!!!"
技術分享圖片


3.3.3】、語法:linsert key BEFORE|AFTER pivot value,向指定列表key在指定元素【前|後】插入元素,成功返回列表當前元素的個數。

技術分享圖片
               192.168.127.128:6379>linsert list2 before world my
               (integer)4

               192.168.127.128:6379>lrange list2 0 -1
               "hello"
               "my"
               "world"
               "!!!"
技術分享圖片


3.3.4】、語法:lrange key start stop,將制定列表key的元素按指定範圍顯示出來。 因為list是雙端列表,如果計數是從左到右開始,那就是從0開始,依次是1,2,3等,如果計數是從右到左開始,那就是從-1開始,依次為-2,-3等。

               192.168.127.128:6379>lrange list1 0 -1 這個意思就是從左邊第一位到右面最後一位,全部顯示
               "world"
               "world"
               "hello"


3.3.5】、語法:lset key index(列表下標) value,將指定下標的元素替換掉,替換成功返回OK,可以重復操作,會替換以前的值。

技術分享圖片
               192.168.127.128:6379>lset list2 3 !!,將hello my world !!!裏面的三個!替換成2個!
               OK

               192.168.127.128:6379>lrange list2 0 -1
               "hello"
               "my"
               "world"
               "!!"
技術分享圖片


3.3.6】、語法:lrem key count value,刪除和指定元素想相等的元素並返回刪除的個數,刪除正確返回個數,刪除錯誤返回0。count,刪除個數,如果count是正數,從列表表頭開始搜索,如果count是負數,從列表表尾開始搜索,刪除的個數就是count的絕對值。

技術分享圖片
               當前值:
               192.168.127.128:6379>lrange list2 0 -1
               "hello"
               "my"
               "world"
               "!!"

               192.168.127.128:6379>lrem list2 1 my
               (integer)1

               192.168.127.128:6379>lrange list2 0 -1
               "hello"
               "world"
               "!!"

               192.168.127.128:6379>lrem list2 1 my(已經沒有my這個值了)
               (integer)0
技術分享圖片


3.3.7】、語法:ltrim key start(開始值) stop(結束值),保留指定key的索引值範圍內的數據,其他數據刪除,開始從0開始。修剪成功返回OK,可以重復執行。

技術分享圖片
               當前值:
               192.168.127.128:6379>lrange list2 0 -1
               "hello"
               "world"
               "!!"

               192.168.127.128:6379>ltrim list2 0 1
               (integer)1

               192.168.127.128:6379>lrange list2 0 -1
               "hello"
               "world"
技術分享圖片


3.3.8】、語法:lpop key,從list的頭部刪除元素,並返回刪除元素

               192.168.127.128:6379>rpush list3 a b c d e f
               (integer)6

               192.168.127.128:6379>lpop list3
               "a"


3.3.9】、語法:rpop key,從list的尾部刪除元素,並返回刪除元素。

               192.168.127.128:6379>rpop list3
               "f"


3.3.10】、語法:rpoplpush source destination,第一步從指定list列表的尾部刪除元素,第二步,從指定list列表頭部加入元素。

               192.168.127.128:6379>rpoplpush list3 list4
               "e"

               192.168.127.128:6379>lrange list4 0 -1
               1)"e"


3.3.11】、語法:lindex key index,返回指定list列表中index為止的元素。

               192.168.127.128:6379>lindex list2 0
               "hello"


3.3.12】、語法:llen key,返回指定key列表的元素的個數。

               192.168.127.128:6379>llen list2
               (integer)2

這裏,我要說明一下,這裏面的所有代碼,上下是有關系的,這個大家要知道一下,否則不知道為什麽會有這樣的結果。

4、Set集合類型的使用

4.1、redis一共分為五種基本數據類型:String(字符串),Hash(哈希)、List(鏈表),Set(集合),ZSet(有序集合)

4.2、set集合是string類型的無需集合,集合裏面的元素不能重復,或者說必須是唯一的。set內部是通過Hashtable來實現的,並且這個Hashtable的value是沒有值的,既然是集合,因此,我們可以對集合實施交集(Inter--InterStore)、並集(Union--UnionStore)和差集(Diff--DiffStore)的操作。操作復雜度都是:O(1)

4.3、常用命令如下:

4.3.1】、語法:sadd key member [member ...],可以向名稱為key的set集合中添加元素,一次可以添加多個,也可以添加一個,以空格為分隔符,並且增加的元素不能有重復。成功返回添加的元素的個數。

               192.168.127.128:6379>sadd set1 aaa bbb ccc ddd eee
               (integer)5

               192.168.127.128:6379>sadd set1 eee
               (integer)1


4.3.2】、語法:smembers key,我們可以通過該方法查看名稱為key集合的元素

技術分享圖片
               192.168.127.128:6379>smembers set1
               1)"bbb"
               2)"ddd"
               3)"ccc"
               4)"aaa"
               5)"fff"
               6)"eee"
技術分享圖片


4.3.3】、語法:srem key member [member ...],刪除set集合元素,可以刪除一個,也可以刪除多個。成功刪除返回刪除個數,失敗返回0。

               192.168.127.128:6379>srem set1 aaa bbb ccc ddd eee fff
               (integer)6


4.3.4】、語法:spop key [count],隨機返回刪除的key,可以返回【count】個,返回的元素會被刪除。

               原始值:aaa bbb ccc ddd eee fff
               192.168.127.128:6379>spop set1 3
               1)"aaa"
               2)"ddd"
               3)"ccc"


4.3.5】、語法:sinter key [key ...],取兩個或者多個集合的交集。

技術分享圖片
               原始值:
               set1 aaa bbb ccc ddd
               set2 bbb ccc ddd eee

               192.168.127.128:6379>sinter set1 set2
               1)"bbb"
               2)"ddd"
               3)"ccc"
技術分享圖片


4.3.6】、語法:sinterstore destination key [key ...],取兩個或者多個集合的交集並存到指定集合裏。

技術分享圖片
               原始值:
               set1 aaa bbb ccc ddd
               set2 bbb ccc ddd eee

               192.168.127.128:6379>sinterstore setinter set1 set2
               (integer)3

               192.168.127.128:6379>smembers setinter
               1)"bbb"               
               1)"ccc"
               1)"ddd"
技術分享圖片


4.3.7】、語法:sunion key [key ...],取兩個或者多個集合的並集。如果有重復元素,會去掉重復元素然後在顯示。

技術分享圖片
               原始值:
               set1 aaa bbb ccc ddd
               set2 bbb ccc ddd eee

               192.168.127.128:6379>sunion set1 set2
               1)"aaa"
               2)"bbb"
               3)"eee"
               4)"ddd"
               5)"ccc"
技術分享圖片


4.3.8】、語法:sunionstore destination key [key ...],取兩個或者多個集合的並集並存儲到指定集合裏。

技術分享圖片
               原始值:
               set1 aaa bbb ccc ddd
               set2 bbb ccc ddd eee

               192.168.127.128:6379>sunionstore setunion set1 set2
               (integer)5


               192.168.127.128:6379>smembers setunion
               1)"aaa"
               2)"bbb"
               3)"eee"
               4)"ddd"
               5)"ccc"
技術分享圖片


4.3.9】、語法:sdiff key [key ...],取兩個或者多個集合不同的元素,第一個參數集合為參考對象,由於參考對象不同,結果可能也不同。

技術分享圖片
               原始值:
               set1 aaa bbb ccc ddd
               set2 bbb ccc ddd eee

               192.168.127.128:6379>sdiff set1 set2
               1)"aaa"
技術分享圖片


4.3.10】、語法:sdiffstore destination key [key ...],取兩個或者多個集合不同的元素,並把結果存儲到指定集合裏。

技術分享圖片
               原始值:
               set1 aaa bbb ccc ddd
               set2 bbb ccc ddd eee

               192.168.127.128:6379>sdiffstore setdiff set1 set2
               (integer)1

               192.168.127.128:6379>smembers setdiff
               1)"aaa"
技術分享圖片


4.3.11】、語法:smove source destination member,把一個元素member從一個set集合移動到另一個set集合。

技術分享圖片
               原始值:
               set1 aaa bbb ccc ddd
               set2 bbb ccc ddd eee

               192.168.127.128:6379>smove set1 set2 aaa
               (integer)1

               192.168.127.128:6379>smembers set2
               1)"eee"
               2)"bbb"
               3)"ddd"
               4)"ccc"
               5)"aaa" "移動過來的"
技術分享圖片


4.3.12】、語法:scard key,查看集合裏元素的個數。

               原始值:
               set1 aaa bbb ccc ddd

               192.168.127.128:6379>scard set1
               (integer)4


4.3.13】、語法:sismember key member,判斷某個元素是否在指定的集合裏面,存在返回1,不存在返回0

               原始值:
               set1 aaa bbb ccc ddd

               192.168.127.128:6379>sismember set1 aaa
               (integer)1


4.3.14】、語法:srandmember key [count],隨機返回一個或者幾個元素,不會刪除元素,默認返回一個元素。每次執行都會返回不同的結果。

技術分享圖片
               原始值:
               set1 aaa bbb ccc ddd

               192.168.127.128:6379>srandmember set1 3
               1)"bbb"
               1)"ddd"
               1)"ccc"
技術分享圖片


5、ZSet有序集合類型的使用

5.1、redis一共分為五種基本數據類型:String(字符串),Hash(哈希)、List(鏈表),Set(集合),ZSet(有序集合)

5.2、ZSet數據類型,是有序的集合類型,集合裏面的元素必須保證唯一,不會出現重復的元素。無論以什麽方式訪問有序集合都很快,因為它內部是通過哈希表和跳躍表來實現的。默認排序是由小到大。

5.3、常用命令如下:

5.3.1】、語法:zadd key [NX|XX] [CH] [INCR] score member [score member ...],向有序集合中添加一個h或者多個元素,該元素如果存在,則更新順序。如果在重復插入的時候,會根據順序屬性更新。

技術分享圖片
               192.168.127.128:6379>zadd set1 7 aaa 5 bbb 10 ccc
               (integer)3

               如果想要修改某元素的分數,例如把aaa的分數改成10,可以如下:

               zadd set1 10 aaa

               當前返回值為0,但是分數已經成功修改。默認返回值是增加到有序集合裏面元素的個數。

              nx參數:如果該元素不存在則增加該元素

              xx參數:如果該元素存在則修改該元素

              ch參數:可以讓方法返回值是更改分數的元素的個數

              incr參數:可以對指定元素的分數進行增加或者減少指定數值,正數增加,負數減少

              zadd set1 [nx|xx|ch|incr] 10 aaa
技術分享圖片


5.3.2】、語法:zrange key start stop [WITHSCORES],查看有序集合的元素,分數可以是選項,可以顯示,也可以不顯示。

技術分享圖片
               原始值:
               set1 7 aaa 5 bbb 10 ccc

               192.168.127.128:6379>zrange set1 0 -1 [withscores]
               1)"bbb"
               2)"5"
               3)"aaa"
               4)"7"
               5)"ccc"
               6)"10"
技術分享圖片


5.3.3】、語法:zrevrange key start stop [WITHSCORES],按分數從大到小的排序集合元素,默認是小到大排序。

技術分享圖片
               原始值:
               set1 7 aaa 5 bbb 10 ccc

               192.168.127.128:6379>zrevrange set1 0 -1 [withscores]
               1)"ccc"
               2)"10"
               3)"aaa"
               4)"7"
               5)"bbb"
               6)"5"
技術分享圖片


5.3.4】、語法:zrem key member [member ...],刪除名稱為key的zset中的元素member,可以刪除一個,也可以刪除多個。成功返回刪除個數,失敗返回0。

               原始值:
               set1 7 aaa 5 bbb 10 ccc

               192.168.127.128:6379>zrem set1 aaa bbb
               (integer)2


5.3.5】、語法:zincrby key increment member,以指定值去自動遞增或者遞減少指定元素的分數,用法和之前的incryby類似

               原始值:
               set1 7 aaa 5 bbb 10 ccc

               192.168.127.128:6379>zincrby set1 3 ccc
               “13”


5.3.6】、語法:zrangebyscore key min max [WITHSCORES],查找分數在指定區間範圍的元素,返回找到的個數。

技術分享圖片
               原始值:
               set1 7 aaa 5 bbb 10 ccc

               192.168.127.128:6379>zrangebyscore set1 7(分數最小值) 10(分數最大值) withscores
               1)"aaa"
               1)"7"
               1)"ccc"
               1)"10"
技術分享圖片


5.3.7】、語法:zremrangebyrank key start stop,根據索引值刪除指定的元素,返回刪除的個數,沒有數據返回0.

               原始值:
               set1 7 aaa 5 bbb 10 ccc

               192.168.127.128:6379>zremrangebyrank set1 0(索引值) 1(索引值)
               (integer)2


5.3.8】、語法:zremrangebyscore key min max根據指定的分數刪除元素,返回刪除的個數,沒有數據返回0.

               原始值:
               set1 7 aaa 5 bbb 10 ccc

               192.168.127.128:6379>zremrangebysocre set1 5(分數最小值) 6(分數最大值)
               (integer)1


5.3.9】、語法:zrank key member,(從小到大)返回排序索引從小到大排序的某有序集合裏面某元素的索引,無值返回nil,索引從0開始計數。

               原始值:
               set1 7 aaa 5 bbb 10 ccc

               192.168.127.128:6379>zrank set1 aaa
               (integer)1


5.3.9】、語法:zrevrank key member,返回排序索引從大到小排序的索引值,也就是說最大的分數的索引是0(降序排序之後再找索引)

               原始值:
               set1 7 aaa 5 bbb 10 ccc

               192.168.127.128:6379>zrevrank set1 ccc
               (integer)0


5.3.10】、語法:zcard key,返回集合裏所有元素的個數。

               原始值:
               set1 7 aaa 5 bbb 10 ccc

               192.168.127.128:6379>zcard set1
               (integer)3


5.3.11】、語法:zcount key min max,返回集合中score在給定區間中的數量

               原始值:
               set1 7 aaa 5 bbb 10 ccc

               192.168.127.128:6379>zcount set1 7(分數最小值) 10(分數最大值)
               (integer)2


五、總結

redis的數據類型今天就寫到這裏了,學了更多的東西在更新吧。每一步走的都挺艱難的,革命還沒成功,我輩還需努力啊。現在對redis的認識和以前不一樣了,整體輪廓有了。下一步要掌握集群的高可用性和可擴展方面的知識點了,繼續上路吧。

Redis進階實踐之四Redis的基本數據類型