1. 程式人生 > >redis中對基本資料型別的操作

redis中對基本資料型別的操作

一、redis中對字串型別的資料結構的操作與使用

    字串是redis的最基礎的資料結構,其他的集中型別的資料結構都是在字串的基礎上構建的。字串型別的值可以是字串、數字、二進位制,但是指最大不能超過512M。

1、字串的基本操作

(1)設定值

    命令:SET key value [EX seconds] [PX milliseconds] [NX|XX]

    選項:EX seconds:為鍵設定妙級的過期時間, 相當於setex命令

              PX milliseconds:為鍵設定毫秒級別的過期時間

              NX:鍵必須不存在,才可以設定成功,用於新增,相當於setnx命令

              XX:鍵必須存在,才可以設定,用於更新

# 設定一個鍵,值為dayi1234
127.0.0.1:6379> SET name dayi1234
OK
# 新增一個鍵hello,值為world
127.0.0.1:6379> SETNX hello world
(integer) 1
# 更新鍵name的值
127.0.0.1:6379> set name dayi123 xx
OK

(2)獲取值

     命令:GET key

# 獲取設定的name的值
127.0.0.1:6379> GET name
"dayi123"

(3)批量設定值

     命令:MSET key value [key value ...]

# 同時設定多個鍵值對
127.0.0.1:6379> MSET name liuy age 25 job it
OK

(4)批量獲取值

      命令:MGET key [key ...]

# 獲取剛才設定的多個鍵的值
127.0.0.1:6379> MGET name age job
1) "liuy"
2) "25"
3) "it"

     相對於獲取及設定單個值,批量操作有助於提高業務效率。

(5)計數

     命令:INCR key

     Inrc用於對值做自增操作,返回結果中,如果值不是整數,則返回錯誤;值是整數,則返回自增後的結果;如果鍵不存在,按照值為0自增,返回結果為1。

     除了inrc外,redis還有自減decr命令,自增指定數字incrby命令、自減指定數字decrby命令以及自增浮點數incrbyfloat命令。

# 對年齡自增
127.0.0.1:6379> INCR age
(integer) 26
# 由於name為字串所以報錯
127.0.0.1:6379> incr name
(error) ERR value is not an integer or out of range
# 對一個不存在的鍵自增,則返回1
127.0.0.1:6379> incr age1
(integer) 1
# 對年齡進行自減
127.0.0.1:6379> DECR age
(integer) 25
# 對年齡自減指定的數字
127.0.0.1:6379> DECRBY age 8
(integer) 17

(6)追加值

      命令:APPEND key value

# 向字串末尾追加字串
127.0.0.1:6379> APPEND name an
(integer) 6
127.0.0.1:6379> get name
"liuyan"

(7)獲取字串的長度

     命令:STRLEN key

# 獲取name的值得長度
127.0.0.1:6379> STRLEN name
(integer) 6

(8)設定值並返回原值

     命令:GETSET key value

# 設定一鍵值
127.0.0.1:6379> GETSET city shanghai
(nil)
127.0.0.1:6379> get city
"shanghai"
# 重新設定時會返回上一個值
127.0.0.1:6379>  GETSET city beijing
"shanghai"
127.0.0.1:6379> get city
"beijing"

(9)設定指定位置的字串

     命令:SETRANGE key offset value

127.0.0.1:6379> get name
"liuyan"
127.0.0.1:6379> SETRANGE name 3 L
(integer) 6
127.0.0.1:6379> GET name
"liuLan"

(10)獲取部分字串

      命令:GETRANGE key start end

# 檢視第0個到第二個字串
127.0.0.1:6379> GETRANGE name 0 2
"liu"

2、字串的內部編碼

    字串的內部編碼有三種,分別是8個位元組的長整型(int),小於等於39個位元組的字串(embstr),大於39個位元組的字串(raw),redis會根據當前值得型別和長度決定使用哪種內部編碼實現。

# name的內部編碼為raw
127.0.0.1:6379> OBJECT encoding name
"raw"
# age的內部編碼為int
127.0.0.1:6379> OBJECT encoding age
 "int"

3、字串型別主要應用場景

(1)快取

(2)計數

(3)共享session

(4)限速

二、redis中對hash型別的資料的操作與使用

    Redis中雜湊型別的資料結構是指鍵值本身又是一個鍵值對的結構。雜湊型別中的對映關係叫做field-value,value值field對應的值。

1hash型別資料結構的操作命令

(1)設定值

      命令:HSET key field value

# 設定一個hash型別的鍵值
127.0.0.1:6379> HSET user:1 name dayi
(integer) 1
127.0.0.1:6379> HSET user:1 age 22
(integer) 1

(2)獲取值

     命令:HGET key field

# 獲取user:1的name域對應的值
127.0.0.1:6379> HGET user:1 name
"dayi"
# 獲取user:1下的所有值
127.0.0.1:6379> HGETALL user:1
1) "name"
2) "dayi"
3) "age"
4) "22"

(3)刪除field

     命令:HDEL key field [field ...]

# 刪除user:1的age
127.0.0.1:6379> HDEL user:1 age
(integer) 1

(4)計算field的個數

      命令:HLEN key

# 計算user:1中field的 
127.0.0.1:6379> HLEN user:1
(integer) 1

(5)批量設定faield-value

      命令:HMSET key field value [field value ...]

# 設定一個user:3,同時設定多個faield-value
127.0.0.1:6379> HMSET user:3 name day age 25 job it city shanghai
OK

(6)批量獲取faield-value

     命令:HMGET key field [field ...]

# 獲取剛設定的user:3中的name、city、age的值
127.0.0.1:6379> HMGET user:3 name age city
1) "day"
2) "25"
3) "shanghai"

(7)判斷field是否存在

     命令:HEXISTS key field

# 判斷user:3中的name是否存在
127.0.0.1:6379> HEXISTS user:3 name
(integer) 1

(8)獲取所有的field

     命令:HKEYS key

# 獲取user:3中的所有key
127.0.0.1:6379> HKEYS user:3
1) "name"
2) "age"
3) "job"
4) "city"

(9)獲取所有的value

     命令:HVALS key

# 獲取user:3中的所有value
127.0.0.1:6379> HVALS user:3
1) "day"
2) "25"
3) "it"
4) "shanghai"

(10)計算value的字串長度

      命令:HSTRLEN key field

# 計算user:3中city值得字串長度
127.0.0.1:6379> HSTRLEN user:3 city
(integer) 8

2hash型別的內部編碼

(1)ziplist(壓縮列表):當hash型別元素個數小於hash-max-ziplist-entries配置(預設512個),同時所有的值都小於hash-max-ziplist-value配置(預設64位元組),redis會使用ziplist。Ziplist節省記憶體。

(2)hashtable(雜湊表):hash無法滿足ziplist時會使用hashtable。

# 檢視user:3的內部編碼
127.0.0.1:6379> OBJECT encoding user:3
"ziplist"

3、應用場景

    主要用於快取。

三、redis中對list型別的資料的操作與使用

    Redis中列表是用來儲存多個有序的字串,列表中的每個字串稱之為元素,一個列表最多可以儲存2^32-1個元素,redis中,可以對列表兩端插入(push)和彈出(pop),還可以獲取指定範圍的元素列表,獲取指定索引下表元素。列表可以充當棧和佇列的角色。

    列表的特點:列表中的元素是有序的,可以通過索引或者下標獲取某個元素或者某個範圍內的原色列表;列表中的元素可以是重複的。

1、列表型別的資料操做命令

(1)新增

     命令:

         從右邊插入元素:RPUSH key value [value ...]

         從左邊插入元素:LPUSH key value [value ...]

        向某個元素前或者後插入元素:LINSERT key BEFORE|AFTER pivot value

# 從右邊插入元素3、2、1
127.0.0.1:6379> RPUSH list1 3 2 1
(integer) 3
# 從左邊插入元素4、5、6
127.0.0.1:6379> LPUSH list1 4 5 6
(integer) 6
# 在3的後面插入0
127.0.0.1:6379> LINSERT list1 AFTER 3 0
(integer) 7

(2)查詢元素

     命令:

         獲取指定範圍內的元素列表:LRANGE key start stop

         獲取列表指定索引下表的元素:LINDEX key index

         獲取列表的長度:LLEN key

#獲取當前列表的長度
127.0.0.1:6379> LLEN list1
(integer) 7
#檢視當前列表中的所有元素
127.0.0.1:6379> LRANGE list1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "0"
6) "2"
7) "1"
#獲取列表的最後一個元素
127.0.0.1:6379> LINDEX list1 -1
"1"
#獲取列表中的第二個元素
127.0.0.1:6379> LINDEX list1 2
"4"

(3)刪除元素

     命令:

         從列表的左側彈出元素:LPOP key

         從列表的右側彈出元素:RPOP key

         按照索引範圍修改列表:LTRIM key start stop

         刪除指定的元素:LREM key count value

     LREM會從列表中找到等於value的元素進行刪除,當count大於0時,從左到右,    刪除最多count個元素,當count小於0時,從右到左,刪除最多count絕對值個元素, 當count等於0時,刪除所有的值為value的元素。

#從列表的最左側刪除一個元素
127.0.0.1:6379> LPOP list1
"6"
#從列表的最右側刪除一個元素
127.0.0.1:6379> RPOP list1
"1"
# 只保留第二道第六個元素,即第一個元素會被刪除
127.0.0.1:6379> LTRIM list1 1 5
OK
# 從左邊開始新增五個元素
127.0.0.1:6379> LPUSH list1 1 1 1 1 1
(integer) 9
# 從左邊開始刪除4個1 
127.0.0.1:6379> LREM list1 4 1
(integer) 4

(4)修改元素

     命令(根據索引下表修改):LSET key index value

# 將第0個元素的值修改為start
127.0.0.1:6379> LSET list1 0 start
OK

(5)阻塞操作

    命令:阻塞式彈出命令:BLPOP key [key ...] timeout

                                            BRPOP key [key ...] timeout

    blpop和brpop是lpop和rpop的阻塞版本,在使用的過程中,如果列表為空,客戶端會等到timeout時間到後會自動返回,如果timeout等於0則會一直等待下去;如果列表不為空,則會立即返回。

# 列表為空等待三秒後返回結果
127.0.0.1:6379> BRPOP list2 3
(nil)
(3.05s)
# 列表不為空,會立即返回結果
127.0.0.1:6379> BRPOP list1 3
1) "list1"
2) "2

    在使用brop時,如果是多個鍵,那麼brop會從左至右遍歷鍵,一旦有一個鍵能彈出鍵,客戶端立即返回;如果多個客戶端對同一個鍵執行brpop,那麼最先執行brpo命令的客戶端可以獲取彈出的值。

2、列表型別的內部編碼

(1)ziplist(壓縮列表):當列表的元素個數小於list-max-ziplist-entries配置(預設512),同時列表中每個元素的值都小於list-max-ziplist-value(預設64位元組)時使用ziplist。

(2)linkdedlist(連結串列):當列表型別五碼滿足ziplist時。

(3)quicklist(快速列表):Redis 3.2版本中新加的資料結構,用在列表的底層實現

#檢視剛才設定的列表的內部編碼
127.0.0.1:6379> OBJECT encoding list1
 "quicklist"

3、列表應用場景

(1)lpush+lpop=stack(棧)

(2)lpush+rpop=queue(佇列)

(3)lpush+ltrim=capped collection(有限集合)

(4)lpush+brpop=message queue(訊息佇列)

四、redis中對set型別的資料的操作與使用

       集合型別也是用來儲存多個字串元素,並且集合中不能有重複元素,並且集合中的元素是無序的,也就意味著集合不能通過下標獲取元素。一個集合最多可以儲存2^32-1個元素。Redis對集合的操作除了增刪改查外,還可以對多個集合取交集、並集、差集。

1、集合內的操作命令

(1)新增元素

    命令:SADD key member [member ...]

# 對集合新增元素
127.0.0.1:6379> SADD set1 a b c d
(integer) 4

(2)刪除元素

    命令:SREM key member [member ...]

# 刪除集合set中的元素a、b
127.0.0.1:6379> SREM set1 a b
(integer) 2

(3)計算元素的個數

     命令:SCARD key

     Scard不會遍歷集合所有元素,直接用redis內部變數

# 計算集合set11元素的數量
127.0.0.1:6379> SCARD set1
(integer) 2

(4)判斷元素是否在集合中

     命令:SISMEMBER key member

# 判斷元素c是否在集合set1中
127.0.0.1:6379> SISMEMBER set1 c
(integer) 1

(5)隨機從集合返回指定個數元素

     命令:SRANDMEMBER key [count]

     Count為返回元素的個數,不指定個數,預設為1

# 從集合set1中隨機彈出一個元素
127.0.0.1:6379> SRANDMEMBER set1
"c"

(6)獲取集合中所有的元素

     命令:SMEMBERS key

# 獲取集合set1中的所有元素
127.0.0.1:6379> SMEMBERS set1
1) "d"
2) "c"

(7)從集合中隨機彈出元素

     命令: SPOP key [count]

     Count為隨機彈出元素的個數,不指定則預設為1

# 從集合set1中隨機彈出一個元素
127.0.0.1:6379> SPOP set1
"d"
# 檢視彈出後剩餘的元素個數
127.0.0.1:6379> SMEMBERS set1
1) "c"

2、集合間的操作命令

   集合間的操作主要有求集合的交集、並集及差集

# 在操作前先設定兩個集合
127.0.0.1:6379> SADD myset1 a b c d e
(integer) 5
127.0.0.1:6379> SADD myset2 e f 0 1 2
(integer) 5

(1)求多個集合的交集

     命令:SINTER key [key ...]

     求到的交集儲存到新的集合中命令:SINTERSTORE destination key [key ...]

# 求集合myset1和myset2的交集
127.0.0.1:6379> SINTER myset1 myset2
1) "e"
# 將求到的交集儲存到新的集合mytestsinter中
127.0.0.1:6379> SINTERSTORE mytestsinter myset1 myset2
(integer) 1

(2)求多個集合的並集

     命令:SUNION key [key ...]

     將求到的並集儲存到新的集合中命令:SUNIONSTORE destination key [key ...]

# 求集合myset1和myset2的並集
127.0.0.1:6379> SUNION myset1 myset2
1) "a"
2) "f"
3) "e"
4) "0"
5) "b"
6) "1"
7) "d"
8) "c"
9) "2

(3)求集合的差集

     命令:SDIFF key [key ...]

     將求到的差集儲存到新的集合中的命令: SDIFFSTORE destination key [key ...]

# 求集合myset1和myset2的差集,會將myset1中有的,myset2中沒有的元素打印出來
127.0.0.1:6379> SDIFF myset1 myset2
1) "a"
2) "b"
3) "d"
4) "c

3、集合的內部編碼

(1)intset(整數集合):當集合中的元素都是整數且元素個數小於set-max-intest-entries配置時。

(2)hashtable(雜湊表):無法滿足inset時會使用hashtable

# 集合myset2中有字母,所以編碼為hashtable
127.0.0.1:6379> OBJECT encoding myset2
"hashtable"

4、集合使用場景

(1)sadd = tagging(標籤)

(2)spop/srandmember = random item(生成隨機數,如抽獎)

(3)sadd + sinter = Social Graph(社交需求)

五、redis中對有序集合型別的資料的操作與使用

    有序集合相對於集合而言,有序集合中的元素是可以排序的,有序集合排序的依據是是給每個元素設定一個分數(score)做為排序的依據。有序集合中的元素是不能重複的,但是元素的分數(score)是可以重複的。

1、有序集合內的操作命令

(1)新增成員

     命令:ZADD key [NX|XX] [CH] [INCR] score member [score member ...]

     選項說明:

         Nx:member必須不存在,才可以設定成功,用於新增

         Xx: member必須存在,才可以設定成功,用於更新。

         Ch: 返回此次操作後,有序集合元素和分數發生變化的個數。

         Incr:對score做增加

# 向有序集合中新增一個元素
127.0.0.1:6379> ZADD class:1 100 dayi123
(integer) 1
# 向有序集合中新增多個元素
127.0.0.1:6379> ZADD class:1 101 liu 102 liuyi 103 dyi
(integer) 3
# 更新dayi123的分數,並返回操作後分數發生變化的元素的個數
127.0.0.1:6379> ZADD class:1 xx ch 200 dayi123
(integer) 1

(2)計算成員的個數

    命令:ZCARD key

# 計算class:1的元素個數
127.0.0.1:6379> ZCARD class:1
(integer) 4

(3)計算某個成員的分數

    命令:ZSCORE key member

# 計算class:1中dayi123的分數
127.0.0.1:6379> ZSCORE class:1 dayi123
"200"

(4)計算成員的排名

    命令:ZRANK key member

              ZREVRANK key member

    ZRANK依據分數從低到高進行排名,ZREVRANK是依據分數從高到低進行排名

# 從高到低獲取dayi123的名次
127.0.0.1:6379> ZREVRANK class:1 dayi123
(integer) 0
# 從低到高獲取dayi123的名次
127.0.0.1:6379> ZRANK class:1 dayi123
(integer) 3

(5)刪除成員

    命令:ZREM key member [member ...]

# 刪除class:1中的成員liu
127.0.0.1:6379> ZREM class:1 liu
(integer) 1

(6)增加成員分數

    命令:ZINCRBY key increment member

# 給class:1中成員dayi123再增加50分
127.0.0.1:6379> ZINCRBY class:1 50 dayi123
"250"

(7)返回指定排名範圍的成員

    命令:ZRANGE key start stop [WITHSCORES]

              ZREVRANGE key start stop [WITHSCORES]

    ZRANGE是依據分數從低到高返回,ZREVRANGE是依據分數從高到低返回。

# 依據分數從高到低返回class:1中的排名一二的成員
127.0.0.1:6379> ZREVRANGE class:1 0 1
1) "dayi123"
2) "dyi"
# 依據分數從低到高返回class:1中排名一二的成員
127.0.0.1:6379> ZRANGE class:1 0 1
1) "liuyi"
2) "dyi"

(8)返回指定分數範圍的成員

    命令: ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

               ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

               ZRANGEBYSCORE按照分數從低到高返回,ZREVRANGEBYSCORE按照分數從高到低返回,

    Max,min支援開區間,-inf和+inf分別代表無限小和無限大

    選項:

       WITHSCORES:同時返回每個成員的分數

       [LIMIT offset count]:限制輸出的起始位置和個數

# 輸出分數100到兩百之間的元素並依據分數從小到大排序
127.0.0.1:6379> ZRANGEBYSCORE class:1 100 200 withscores
1) "liuyi"
2) "102"
3) "dyi"
4) "103"
# 輸出分數100到兩百之間的元素並依據分數大到小排序
127.0.0.1:6379> ZREVRANGEBYSCORE class:1 200 100 withscores
1) "dyi"
2) "103"
3) "liuyi"
4) "102
# 輸出分數小於200的元素,並依據分數從高到底排序
127.0.0.1:6379> ZREVRANGEBYSCORE class:1 (200 -inf withscores
1) "dyi"
2) "103"
3) "liuyi"
4) "102"

(9)返回指定分數範圍成員個數

    命令:ZCOUNT key min max

# 返回分數為100到兩百之間的成員的個數
127.0.0.1:6379> ZCOUNT class:1 100 200
(integer) 2

(10)刪除指定排名內的成員(按照升序)

    命令:ZREMRANGEBYRANK key start stop

# 按照升序刪除排名第一二的元素
127.0.0.1:6379> ZREMRANGEBYRANK class:1 0 1
(integer) 2

(11)刪除指定分數的成員

    命令:ZREMRANGEBYSCORE key min max

# 刪除分數大於兩百分的成員
127.0.0.1:6379> ZREMRANGEBYSCORE class:1 (200 +inf
(integer) 1

2、有序集合間的操作

# 操作前先插入先設定兩個有序集合
127.0.0.1:6379> ZADD class:1 100 dayi123 99 lisi 89 wanger 96 zhangsan
(integer) 4
127.0.0.1:6379> ZADD class:2 99 dayi 95 lisi 60 zhangsan 80 liu
(integer) 4

(1)求交集

    命令:ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]

    引數:

       destination:將交集的結果儲存到這個鍵

       numkeys:需要做交集計算鍵的個數

        key [key ...] :需要做交集的鍵

       [WEIGHTS weight]:鍵的權重,預設是1,做交集是每個鍵的member將自己的分數乘以這個權重

       [AGGREGATE SUM|MIN|MAX]:做交集後的彙總方式,預設是sum

# 求class:1和class:2的交集
127.0.0.1:6379> ZINTERSTORE class 2 class:1 class:2
(integer) 2
127.0.0.1:6379> ZRANGE class 0 -1 withscores
1) "zhangsan"
2) "156"
3) "lisi"
4) "194"

(2)並集

    命令:ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]

    引數:同求交集命令引數相同

# 求class:1和class:2的並集,會對相同元素的分數相加
127.0.0.1:6379> ZUNIONSTORE class:union 2 class:1 class:2 
(integer) 6
127.0.0.1:6379> ZRANGE class:union 0 -1 withscores
 1) "liu"
 2) "80"
 3) "wanger"
 4) "89"
 5) "dayi"
 6) "99"
 7) "dayi123"
 8) "100"
 9) "zhangsan"
10) "156"
11) "lisi"
12) "194"

3、有序集合的內部編碼

(1)ziplist(壓縮列表):有序元素的個數小於zset-max-ziplist-entries配置(預設128個),同時每個元素的值都小於zset-max-ziplist-value配置(預設64位元組)時,redis會用ziplist,ziplist能有效減少記憶體的使用。

(2)skiplist(跳躍表):ziplist條件不滿足時使用。

# class:union滿足ziplist條件,所以內部編碼是ziplist
127.0.0.1:6379> OBJECT encoding class:union
"ziplist"

4、有序集合的使用場景

   排行榜系統