1. 程式人生 > >Redis的資料型別詳解

Redis的資料型別詳解

字串型別

雖然叫字串型別,但是裡面也可以由數字。

  • 建立一個字串型別的key
127.0.0.1:6379> set name tom
OK
127.0.0.1:6379> get name
"tom"
127.0.0.1:6379> type name
string
  • 還可以在value的尾部追加字串
string
127.0.0.1:6379> append name qq
(integer) 5
127.0.0.1:6379> get name
"tomqq"
  1. 用set可以設定一個鍵值對,用mset可以一次設定多個鍵值對,用mget可以一次獲取多個key的值
127.0.0.1:6379> mset name jerry age 2 addr hebei
OK
127.0.0.1:6379> mget name age addr
1) "jerry"
2) "2"
3) "hebei"
  1. 用strlen可以獲取key字串的長度
127.0.0.1:6379> strlen name
(integer) 5
127.0.0.1:6379> strlen age
(integer) 1
  1. 可以使用incr的decr將值加1或者減1,但需要注意的是隻能用在整數型別中
127.0.0.1:6379> set age 10
OK
127.0.0.1:6379> type age
string
127.0.0.1:6379> incr age
(integer) 11
127.0.0.1:6379> decr age
(integer) 10
  1. 也可以使用incrby或decrby設定每次自增或者自減不是1而是一個指定的值
127.0.0.1:6379> incrby age 3
(integer) 13
127.0.0.1:6379> decrby age 3
(integer) 10

雜湊型別

  • redis的hash其實就是鍵值對的集合
  • 每個hash中可以儲存2^32-1個鍵值對
  1. 使用hset和hget可以設定和獲取雜湊型別鍵值對得值
127.0.0.1:6379> hset userinfo name cx
(integer) 1
127.0.0.1:6379> hset userinfo age 20
(integer) 1
127.0.0.1:6379> hset userinfo addr beijing
(integer) 1
127.0.0.1:6379> type userinfo
hash
127.0.0.1:6379> hget userinfo age
"20"
  1. 使用hgetall可以返回雜湊中全部的鍵值對
127.0.0.1:6379> hgetall userinfo
1) "name"
2) "cx"
3) "age"
4) "20"
5) "addr"
6) "beijing"
  1. 使用hmset和hmget可以一次設定或者獲取多個key所對應的值。
127.0.0.1:6379> hmget userinfo name age
1) "cx"
2) "20"
  1. 可以使用keys *檢視全部資料物件,使用del命令刪除鍵值對
127.0.0.1:6379> keys *
1) "name"
2) "userinfo"
127.0.0.1:6379> del name

注意:del是刪除的一個數據物件,比如執行 del userinfo命令會刪除整個userinfo雜湊表,想要刪除雜湊表中的某個鍵值對需要使用hdel userinfo name.

列表型別

  • 列表中的元素是有順序的
  • 列表中最多儲存2^32-1個鍵值對
  • 列表的元素是從0開始的
  • 列表其實是雙向的(左L 右R)
  1. lpush可以將一個或者多個值插入到列表的首部(如果列表不存在,則建立列表)
127.0.0.1:6379> lpush citylist beijing shanghai guangzhou 
(integer) 3
  1. lrange可以顯示一個列表中的部分元素,在現實的是需要制定起始位置終止位置
127.0.0.1:6379> lrange citylist 0 2
1) "guangzhou"
2) "shanghai"
3) "beijing"
  1. rpush可以在列表末尾追加元素
127.0.0.1:6379> rpush citylist shenyang
(integer) 4
127.0.0.1:6379> lrange citylist 0 5
1) "guangzhou"
2) "shanghai"
3) "beijing"
4) "shenyang"
  1. rpop可以顯示列表末尾的一個元素,並將其從列表中刪除
127.0.0.1:6379> rpop citylist
"shenyang"
127.0.0.1:6379> lrange citylist 0 5
1) "guangzhou"
2) "shanghai"
3) "beijing"
  1. lpop可以顯示列表首部的一個元素,並將其從列表中刪除。
    llen可以返回列表長度
127.0.0.1:6379> llen citylist
(integer) 3
  1. lrem可以刪除指定個數的元素,比如從前往後找,找到的前兩個qq
    用正數指定個數:表示從前往後找
    用負數指定個數:表示從後往前找
127.0.0.1:6379> lpush list1 qq baidu taobao sina qq baidu qq taobao qq
(integer) 9
127.0.0.1:6379> lrange list1 0 10
1) "qq"
2) "taobao"
3) "qq"
4) "baidu"
5) "qq"
6) "sina"
7) "taobao"
8) "baidu"
9) "qq"
127.0.0.1:6379> lrem list1 2 qq   >>>刪除前兩個qq
(integer) 2
127.0.0.1:6379> lrange list1 0 10
1) "taobao"
2) "baidu"
3) "qq"
4) "sina"
5) "taobao"
6) "baidu"
7) "qq"
127.0.0.1:6379> lrem list1 -1 baidu   >>>刪除最後一個baidu
(integer) 1
127.0.0.1:6379> lrange list1 0 10
1) "taobao"
2) "baidu"
3) "qq"
4) "sina"
5) "taobao"
6) "qq"
127.0.0.1:6379> lrem list1 0 taobao  >>>刪除所有的taobao
(integer) 2
127.0.0.1:6379> lrange list1 0 10
1) "baidu"
2) "qq"
3) "sina"
4) "qq"

lset可以修改某個下標得值,比如說把下標為1的值改為360

127.0.0.1:6379> lset list1 1 360
OK
127.0.0.1:6379> lrange list1 0 10
1) "baidu"
2) "360"
3) "sina"
4) "qq"
  1. linsert可以在指定的值前面或者後面插入新的資料,比如在360的後面新增一個元素cx
127.0.0.1:6379> linsert list1 after 360 cx
(integer) 5
127.0.0.1:6379> lrange list1 0 10
1) "baidu"
2) "360"
3) "cx"
4) "sina"
5) "qq"
  1. 在生產環境中,列表使用還是比較廣泛的
    很多時候都是從左邊新增資料,從右邊讀取資料,比如我們在快取中快取五個資料
127.0.0.1:6379> lpush list2 q1
(integer) 1
127.0.0.1:6379> lpush list2 q2
(integer) 2
127.0.0.1:6379> lpush list2 q3
(integer) 3
127.0.0.1:6379> lpush list2 q4
(integer) 4
127.0.0.1:6379> lpush list2 q5
(integer) 5
  1. 會發現新新增的資料在最後面(最下面,最右邊)
127.0.0.1:6379> lrange list2 0 10
1) "q5"
2) "q4"
3) "q3"
4) "q2"
5) "q1"
  1. 那麼在讀取資料的時候就可以從後讀
127.0.0.1:6379> rpop list2
"q1"
127.0.0.1:6379> rpop list2
"q2"
127.0.0.1:6379> rpop list2
"q3"
127.0.0.1:6379> rpop list2
"q4"
127.0.0.1:6379> rpop list2
"q5"

這其實是一個生產者-消費者模型,也就是所謂的訊息佇列,通常來說訊息佇列會用在下訂單、使用者註冊場景中,比如一個使用者提交訂單了,這個訂單會首先儲存在訊息佇列中,那麼這個時候即使資料庫還沒有寫入就宕機了,也是沒有問題的,在啟動以後,通過讀取訊息佇列,就可以繼續執行了。

集合型別(set)

集合中會有比如交集、並集等這樣的概念。
sadd可以建立集合,這裡我們再結合中新增三個元素

127.0.0.1:6379> sadd myset qq
(integer) 1
127.0.0.1:6379> sadd myset baidu
(integer) 1
127.0.0.1:6379> sadd myset sina

smembers可以獲取集合中的全部元素

127.0.0.1:6379> smembers myset
1) "baidu"
2) "qq"
3) "sina"

sismember可以判斷一個元素是否在集合中

127.0.0.1:6379> sismember myset sina
(integer) 1           >>>在集合中
127.0.0.1:6379> sismember myset qqa
(integer) 0           >>>不在集合中

我們在怎樣的場景中會用到交集呢?比如在好友列表中,既是你的好友也是我的好友那就會用到交集。

有序集合(sortdset)

  1. ZADD key score member [[score member] [score member] …]
    將一個或多個 member 元素及其 score 值加入到有序集 key 當中。
# 新增單個元素
127.0.0.1:6379> zadd sortdset1 10 qq
(integer) 1
# 新增多個元素
127.0.0.1:6379> zadd sortdset1 7 baidu 8 sina 15 taobao 
(integer) 3
  1. ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
    有序整合員按 score 值遞增(從小到大)次序排列。
127.0.0.1:6379> zrange salary 0 100 withscores
1) "baidu"
2) "7"
3) "sina"
4) "8"
5) "qq"
6) "10"
7) "taobao"
8) "15"
  1. ZCARD key
    返回有序集 key 的基數
127.0.0.1:6379> zcard sortdset1
(integer) 4
  1. ZCOUNT key min max
    返回有序集 key 中, score 值在 min 和 max 之間(預設包括 score 值等於 min 或 max )的成員的數量。
127.0.0.1:6379> zcount sortdset1 5 10
(integer) 3    >>>有三個score值在5-10之間taobao的score是15不再這個之間
  1. ZSCORE key member
    返回有序集 key 中,成員 member 的 score 值。
    如果 member 元素不是有序集 key 的成員,或 key 不存在,返回 nil
127.0.0.1:6379> zscore salary baidu
"7"
  1. ZRANK key member
    返回有序集 key 中成員 member 的排名。其中有序整合員按 score 值遞增(從小到大)順序排列。
    排名以 0 為底,也就是說, score 值最小的成員排名為 0 。
    使用 ZREVRANK 命令可以獲得成員按 score 值遞減(從大到小)排列的排名。
127.0.0.1:6379> zrank salary baidu
(integer) 0        >>>baidu排名第一
127.0.0.1:6379> zrank salary qq
(integer) 2		    >>>qq排名第三
  1. ZINCRBY key increment member
    為有序集 key 的成員 member 的 score 值加上增量 increment。
    可以通過傳遞一個負數值 increment ,讓 score 減去相應的值,比如 ZINCRBY key -5 member ,就是讓 member 的 score 值減去 5 。
    當 key 不存在,或 member 不是 key 的成員時, ZINCRBY key increment member 等同於 ZADD key increment member 。
    當 key 不是有序集型別時,返回一個錯誤。
    score 值可以是整數值或雙精度浮點數。

  2. ZREM key member [member …]
    移除有序集 key 中的一個或多個成員,不存在的成員將被忽略。
    當 key 存在但不是有序集型別時,返回一個錯誤。

  3. ZREVRANGE key start stop [WITHSCORES]
    返回有序集 key 中,指定區間內的成員。
    其中成員的位置按 score 值遞減(從大到小)來排列。
    具有相同 score 值的成員按字典序的逆序(reverse lexicographical order)排列。
    除了成員按 score 值遞減的次序排列這一點外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一樣。