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,支持簡單的增刪改查操做。php

    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 列表,注意它是鏈表而不是數組。vue

    ​ Redis的列表結構經常使用於作異步隊列使用。隊列是先進先出的數據結構,經常使用於消息隊列和異步邏輯處理,會確保元素的訪問順序性。java

    ​ 當列表彈出最後一個元素以後,該數據結構被自動刪除,內存被回收。python

    1. 【隊列:右進左出】golang

      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. 【棧:右進右出】redis

      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. 【慢操做】shell

    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>
相關文章
相關標籤/搜索