1. 程式人生 > 實用技巧 >Redis 的基本資料型別 和 基礎應用場景

Redis 的基本資料型別 和 基礎應用場景

Redis 的基礎應用場景

  1. 獲取中獎使用者ID,隨機彈出之後集合中就不存在了【set】
  2. 儲存活動中中獎的使用者ID,保證同一個使用者不會中獎兩次【set】
  3. 儲存粉絲列表,value 為粉絲的使用者ID,score 是關注時間【zset】
  4. 儲存學生成績,value 為學生的ID,score 是考試成績【zset】
  5. 記錄帖子的點贊數、評論數、和點選率【hash】
  6. 記錄使用者的帖子ID列表,便於快速顯示使用者的帖子列表【zset】
  7. 記錄帖子的標題、摘要、作者和封面資訊,用於列表展示頁【hash】
  8. 記錄帖子的點贊ID列表,評論ID列表,用於顯示和去重計數【zset】
  9. 快取近期熱帖內容,減少資料庫壓力【hash】
  10. 記錄熱榜帖子ID列表,總熱榜和分類熱榜【zset】
  11. 收藏和貼子之間的關係【zset】
  12. 快取使用者的歷史行為,過濾惡意行為【zset,hash】

Redis 的基本資料型別

  1. 建值對:相當於字典的 key 和 value,支援簡單的增刪改查操作。

    1. set/get/exists/del
    2. mset/mget => 批量鍵值對
    3. expire => 設定過期時間
    4. setex => 5秒後過期,set + expire
    5. setnx => 如果不存在就建立,如果存在就建立不成功
    6. incr/incrby => value是整數,可以進行自增,自增是有範圍的。
    7. 獲取所有的key:keys *
    8. 清空所有的資料: flushall
    127.0.0.1:6379> ## 單個鍵值對
    127.0.0.1:6379> ## 設定 key 為 name,value 為 laowen
    127.0.0.1:6379> set name laowen
    OK
    127.0.0.1:6379> get name ## 獲取
    "laowen"
    127.0.0.1:6379> exists name ## 檢查是否存在
    (integer) 1
    127.0.0.1:6379> del name ## 刪除
    (integer) 1
    127.0.0.1:6379> get name ## 獲取
    (nil)
    127.0.0.1:6379> set name1 boy ## 設定
    OK
    127.0.0.1:6379> set name2 girl ## 設定
    OK
    127.0.0.1:6379> mget name1 name2 # 放回一個列表
    1) "boy"
    2) "girl"
    127.0.0.1:6379> ## 批量新增多個
    127.0.0.1:6379> mset name1 boy name2 girl name3 unknow
    OK
    127.0.0.1:6379> mget name1 name2 name3
    1) "boy"
    2) "girl"
    3) "unknow"
    127.0.0.1:6379> ## 設定過期時間
    127.0.0.1:6379> set name a
    OK
    127.0.0.1:6379> get name
    "a"
    127.0.0.1:6379> expire name 5 # 5秒後過期
    (integer) 1
    127.0.0.1:6379> get name # 不到5秒
    "a"
    127.0.0.1:6379> get name # 5秒之後
    (nil)
    127.0.0.1:6379> ## 5秒後過期,set + expire
    127.0.0.1:6379> setex name 5 aa
    OK
    127.0.0.1:6379> get name
    "aa"
    127.0.0.1:6379> get name
    (nil)
    127.0.0.1:6379> ## 如果不存在就建立,如果存在就建立不成功
    127.0.0.1:6379> setnx name a # 如果不存在就建立
    (integer) 1
    127.0.0.1:6379> get names
    "a"
    127.0.0.1:6379> setnx name b # 如果存在就建立不成功
    (integer) 0
    127.0.0.1:6379> get name # 沒有改變
    "a"
    127.0.0.1:6379> ## 計數
    127.0.0.1:6379> set age 20
    OK
    127.0.0.1:6379> get age
    "20"
    127.0.0.1:6379> incr age
    (integer) 21
    127.0.0.1:6379> get age
    "21"
    127.0.0.1:6379> incrby age 5
    (integer) 26
    127.0.0.1:6379> get age
    "26"
  2. list 列表,注意它是連結串列而不是陣列。

    ​ Redis的列表結構常用於做非同步佇列使用。佇列是先進先出的資料結構,常用於訊息佇列和非同步邏輯處理,會確保元素的訪問順序性。

    ​ 當列表彈出最後一個元素之後,該資料結構被自動刪除,記憶體被回收。

    1. 【佇列:右進左出】

      1. rpush 尾部追加
      2. llen 獲取長度
      3. lpop 頭部刪除
      127.0.0.1:6379> ## 新增一個 books 佇列
      127.0.0.1:6379> rpush books php java net golang
      (integer) 4
      127.0.0.1:6379> ## books 佇列尾部繼續新增內容
      127.0.0.1:6379> rpush books c
      (integer) 5
      127.0.0.1:6379> ## books 佇列尾部繼續新增內容
      127.0.0.1:6379> rpush books python
      (integer) 6
      127.0.0.1:6379> ## books 佇列尾部繼續新增內容
      127.0.0.1:6379> rpush books vue
      (integer) 7
      127.0.0.1:6379> ## 獲取 books 佇列的長度
      127.0.0.1:6379> llen books
      (integer) 7
      127.0.0.1:6379> ## 彈出 books 佇列的第一個內容
      127.0.0.1:6379> lpop books
      "php"
      127.0.0.1:6379> ## 彈出 books 佇列的第一個內容
      127.0.0.1:6379> lpop books
      "java"
      127.0.0.1:6379> ## 彈出 books 佇列的第一個內容
      127.0.0.1:6379> lpop books
      "net"
      127.0.0.1:6379> ## 彈出 books 佇列的第一個內容
      127.0.0.1:6379> lpop books
      "golang"
      127.0.0.1:6379> ## 彈出 books 佇列的第一個內容
      127.0.0.1:6379> lpop books
      "c"
      127.0.0.1:6379> ## 彈出 books 佇列的第一個內容
      127.0.0.1:6379> lpop books
      "python"
      127.0.0.1:6379> ## 彈出 books 佇列的第一個內容
      127.0.0.1:6379> lpop books
      "vue"
      127.0.0.1:6379> ## 彈出 books 佇列的第一個內容
      127.0.0.1:6379> lpop books
      (nil)
      127.0.0.1:6379>
    2. 【棧:右進右出】

      1. rpush 尾部追加
      2. llen 獲取長度
      3. rpop 從尾部刪除
      127.0.0.1:6379> ## 新增一個 books 棧
      127.0.0.1:6379> rpush books php java net golang
      (integer) 4
      127.0.0.1:6379> ## 獲取 books 棧的長度
      127.0.0.1:6379> llen books
      (integer) 4
      127.0.0.1:6379> ## 彈出棧尾部的內容
      127.0.0.1:6379> rpop books
      "golang"
      127.0.0.1:6379> ## 彈出棧尾部的內容
      127.0.0.1:6379> rpop books
      "net"
      127.0.0.1:6379> ## 彈出棧尾部的內容
      127.0.0.1:6379> rpop books
      "java"
      127.0.0.1:6379> ## 彈出棧尾部的內容
      127.0.0.1:6379> rpop books
      "php"
      127.0.0.1:6379> ## 彈出棧尾部的內容
      127.0.0.1:6379> rpop books
      (nil)
      127.0.0.1:6379>
    3. 【慢操作】

    4. 【快速列表】

  3. hash 雜湊字典

    類似與字典,一個key對應一個value。適用於 key為標題,value為內容的儲存。當hash移除最後一個元素之後,該資料結構被自動刪除,記憶體被回收。

    1. hset key filed value 設定單個
    2. hget key filed 獲取單個
    3. hgetall key 獲取所有
    4. hdel key filed 刪除單個
    5. hlen key 獲取長度
    6. hmset key file value 批量設定
    127.0.0.1:6379> ## 設定 name 的雜湊、注意 如果字串中包含空格、需要使用引號
    127.0.0.1:6379> hset name wang wangzong
    (integer) 1
    127.0.0.1:6379> hset name wen wenzong
    (integer) 1
    127.0.0.1:6379> hset name zhang zhangzong
    (integer) 1
    127.0.0.1:6379> ## 獲取所有
    127.0.0.1:6379> hgetall name
    1) "wang"
    2) "wangzong"
    3) "wen"
    4) "wenzong"
    5) "zhang"
    6) "zhangzong"
    127.0.0.1:6379> ## 獲取長度
    127.0.0.1:6379> hlen name
    (integer) 3
    127.0.0.1:6379> ## 獲取單個
    127.0.0.1:6379> hget name wen
    "wenzong"
    127.0.0.1:6379> ## 更新單個,成功返回0
    127.0.0.1:6379> hset name wen wenzongbin
    (integer) 0
    127.0.0.1:6379> hget name wen
    "wenzongbin"
    127.0.0.1:6379> ## 更新單個,成功返回0
    127.0.0.1:6379> hset name wen xiaowen
    (integer) 0
    127.0.0.1:6379> hgetall name
    1) "wang"
    2) "wangzong"
    3) "wen"
    4) "xiaowen"
    5) "zhang"
    6) "zhangzong"
    127.0.0.1:6379> ## 批量 set
    127.0.0.1:6379> hmset name zhao zhaozong li lizong fei feizong
    OK
    127.0.0.1:6379> hgetall name
    1) "wang"
    2) "wangzong"
    3) "wen"
    4) "xiaowen"
    5) "zhang"
    6) "zhangzong"
    7) "zhao"
    8) "zhaozong"
    9) "li"
    10) "lizong"
    11) "fei"
    12) "feizong"
    127.0.0.1:6379> hget name wen
    "xiaowen"
    127.0.0.1:6379> ## 刪除單個
    127.0.0.1:6379> hdel name wen
    (integer) 1
    127.0.0.1:6379> hget name wen
    (nil)
    127.0.0.1:6379>
  4. set 集合

    Redis 的集合內部是鍵值對,是無序的、唯一的。

    1. sadd key value => 新增
    2. smembers key => 獲取所有
    3. smembers key value => 檢查某個值是否存在
    4. scard key => 獲取長度
    5. spop key => 隨機彈出
    127.0.0.1:6379> ## 新增一個,不存在,返回1
    127.0.0.1:6379> sadd num 100
    (integer) 1
    127.0.0.1:6379> ## 新增一個,存在, 返回0
    127.0.0.1:6379> sadd num 100
    (integer) 0
    127.0.0.1:6379> ## 新增多個
    127.0.0.1:6379> sadd num 99 89
    (integer) 2
    127.0.0.1:6379> ## 獲取所有
    127.0.0.1:6379> ## 和插入的順序是不一致的,因為 set 是無序的
    127.0.0.1:6379> smembers num
    1) "89"
    2) "99"
    3) "100"
    127.0.0.1:6379> ## 查詢某個值是否存在 存在返回 1
    127.0.0.1:6379> sismember num 100
    (integer) 1
    127.0.0.1:6379> ## 查詢某個值是否存在 不存在返回 0
    127.0.0.1:6379> sismember num 90
    (integer) 0
    127.0.0.1:6379> scard num ## 獲取長度
    (integer) 3
    127.0.0.1:6379> spop num ## 隨機彈出一個
    "100"
    127.0.0.1:6379> spop num ## 隨機彈出一個
    "89"
    127.0.0.1:6379> spop num ## 隨機彈出一個
    "99"
    127.0.0.1:6379> spop num
    (nil)
  5. zset 有序列表

    1. zadd key score value => 新增
    2. zrange key 範圍 => 按 score 正序列出,引數為排名範圍
    3. zrevrange key 範圍 => 按 score 逆序列出,引數為排名範圍
    4. zcard key => 獲取長度,相當於 count()
    5. zscore key value => 獲取指定 value 的 score
    6. zrank key value => 獲取指定 value 的排名
    7. zrangebyscore key 範圍 => 根據 score 範圍取值
    8. zrem key value => 刪除指定 value 的 score
    127.0.0.1:6379> ## 新增有序列表 zadd key score value
    127.0.0.1:6379> ## score:成績
    127.0.0.1:6379> ## key:fan
    127.0.0.1:6379> ## value:wen
    127.0.0.1:6379> zadd fan 100 wen
    (integer) 1
    127.0.0.1:6379> zadd fan 99 zhang
    (integer) 1
    127.0.0.1:6379> zadd fan 101 li
    (integer) 1
    127.0.0.1:6379> zadd fan 98 zhao
    (integer) 1
    127.0.0.1:6379> zadd fan 97 jin
    (integer) 1
    127.0.0.1:6379> ## zrange key 範圍
    127.0.0.1:6379> ## 按 score 正序取出;引數為範圍
    127.0.0.1:6379> zrange fan 0 -1
    1) "jin"
    2) "zhao"
    3) "zhang"
    4) "wen"
    5) "li"
    127.0.0.1:6379> ## zrevrange key 範圍
    127.0.0.1:6379> ## 按 score 逆序取出;引數為範圍
    127.0.0.1:6379> zrevrange fan 0 -1
    1) "li"
    2) "wen"
    3) "zhang"
    4) "zhao"
    5) "jin"
    127.0.0.1:6379> ## zcard key 獲取總數。相當於 count()
    127.0.0.1:6379> zcard fan
    (integer) 5
    127.0.0.1:6379> ## 獲取指定 value 的 score
    127.0.0.1:6379> ## zscore key value
    127.0.0.1:6379> zscore fan wen
    "100"
    127.0.0.1:6379> ## 獲取指定 value 的 排名
    127.0.0.1:6379> ## zrank key value
    127.0.0.1:6379> zrank fan wen
    (integer) 3
    127.0.0.1:6379> ## 獲取指定範圍的資料
    127.0.0.1:6379> ## zrangebyscore key 範圍
    127.0.0.1:6379> zrangebyscore fan 99 100
    1) "zhang"
    2) "wen"
    127.0.0.1:6379> ## 獲取指定範圍的資料
    127.0.0.1:6379> ## zrangebyscore key -inf inf 【只有value】
    127.0.0.1:6379> ## zrangebyscore key -inf inf withscores 【value 和 score 同時返回】
    127.0.0.1:6379> ## -inf/inf 代表 infinite,無窮大的意思,∞大
    127.0.0.1:6379> zrangebyscore fan -inf inf
    1) "jin"
    2) "zhao"
    3) "zhang"
    4) "wen"
    5) "li"
    127.0.0.1:6379> zrangebyscore fan -inf inf withscores
    1) "jin"
    2) "97"
    3) "zhao"
    4) "98"
    5) "zhang"
    6) "99"
    7) "wen"
    8) "100"
    9) "li"
    10) "101"
    127.0.0.1:6379> zrange fan 0 -1
    1) "jin"
    2) "zhao"
    3) "zhang"
    4) "wen"
    5) "li"
    127.0.0.1:6379> ## 刪除 value
    127.0.0.1:6379> ## zrem key value
    127.0.0.1:6379> zrem fan wen
    (integer) 1
    127.0.0.1:6379> zrange fan 0 -1
    1) "jin"
    2) "zhao"
    3) "zhang"
    4) "li"
    127.0.0.1:6379>