1. 程式人生 > >【Redis學習】Redis筆記(一)——特點、基礎命令和資料結構

【Redis學習】Redis筆記(一)——特點、基礎命令和資料結構

  • 更新時間:2018-10-13

Redis的特性

  • 速度快
  • 持久化(斷電不丟資料)
  • 多種資料結構
  • 支援多種客戶端語言
  • 功能豐富
  • 操作簡單
  • 主從複製
  • 高可用,分散式

Redis的通用命令

  • keys:計算鍵

    key * # 遍歷所有key

    keys命令支援正則匹配,如keys h*表示便利店以h開頭的所有key。

    因為redis是單執行緒,keys命令一般不在生產環境中使用。

    keys *怎麼用?

    • 熱備從節點
    • scan
  • dbsize:計算key的總數

    dbsize

    時間複雜度是O(1),可以在線上隨意使用

  • exists:判斷key是否存在

    exists key

    時間複雜度是O(1),存在返回1,不存在返回0

  • del:刪除指定的key,可以同時刪除多個

    del key

    成功刪除返回1,如果key不存在返回0

  • expire:給key設定過期時間

    expire key seconds

  • ttl:檢視剩餘過期時間

    tth key

    返回-2表明key已經不存在,被刪除了;返回-1表明key存在,但沒有設定過期時間

  • persist:撤銷過期時間

    persist key

  • type:返回key的型別

    type key

    時間複雜度

    命令 時間複雜度
    keys O(n)
    dbsize O(1)
    del O(1)
    exists O(1)
    expire O(1)
    type O(1)

資料結構和內部編碼

資料結構

  • string

    • 結構和命令

      • 可以是“字串”、“數字”、“二進位制”
      • value limited:Up to 512MB
    • 使用場景

      • 快取
      • 計數器
      • 分散式鎖
    • 常用命令

      get key

      • mget key1 key2 ...:批量獲取key,原子操作
      • mset key1 value1 key2 value2 ...:批量設定key-value

      set key

      • set key value:不管key是否存在,都設定
      • setnx key value:key不存在時才設定
      • set key value xx:key存在時才設定

      del key

      incr:自增1

      decr:與incr相反

      incrby:自增k

      decrby:與incrby相反

    • 查缺補漏

      • getset key newvalue:設定新的value並返回舊的value,O(1)
      • append key value:將value追加到舊的value,O(1)
      • strlen key:返回字串的長度(注意中文,每個中文佔2個位元組),O(1)
      • incrbyfloat key 1.1:自增浮點數,自減時設定負值就ok
      • getrange key start end:獲取字串指定下標的所有值
      • setrange key index value:設定指定下標多有對應的值
    命令 複雜度
    set key value O(1)
    get key O(1)
    del key O(1)
    setnx or setxx O(1)
    incr or decr O(1)
    mget or mset O(n)
  • hash

    • 特點
      • 鍵值結構:key field value
    • 常用命令
      • hget key field:獲取hash key對應field的value,O(1)
      • hset key field:設定hash key對應field的value,O(1)
      • hdel key field:刪除hash key對應field的value,O(1)
      • hexists key field:判斷hash key是否有field,O(1)
      • hlen key:獲取hash key field的數量
      • hmget key field1 field2 ...:批量獲取hash key的一批field對應的值,O(n)
      • hmset key1 field1 key2 field2...:批量設定hash key的一批field value,O(n)
    • 查缺補漏
      • hsetnx key field value:設定hash key對應field的value,如果field已經存在,則失敗,O(1)
      • hincrby key field intCounter:hash key對應的field的value自增intCounter,O(1)
      • hincrbyfloat key field floatCountry:hincrby浮點數版,O(1)
  • list

    • 特點

      • 有序
      • 可重複
      • 左右兩邊插入彈出
    • 常用命令

      • rpush key value1 value2...:從列表右邊插入值

      • lpush key value1 value2...:從列表左邊插入值

      • linsert key before|after value newValue:在列表指定的值前|後插入值

      • lpop key:從左邊彈出元素

      • rpop key:從右邊彈出元素

      • lrem key count value :根據count的值,從列表中刪除所有value相等的項,O(n)

        (1)count>0,從左到右,刪除最多count個value相等的項

        (2)count<0,從右到左,刪除最多count個value相等的項

        (3)count=0,刪除所有value相等的項

      • ltrim key start end:按照索引範圍修建列表

      • lrange key start end:獲取列表指定索引範圍所有item,包含end

      • lindex key index:獲取列表索引對應的value

      • llen key:獲取列表長度

      • lset key index newValue:設定列表指定索引值為newValue

    • 查缺補漏

      • blpop key timeout:lpop 阻塞版本,timeout是阻塞超時時間,timeout=0為永遠不阻塞,O(1)
      • brpop key timeout:rpop阻塞版本,timeout是阻塞超時時間,timeout=0為永遠不阻塞,O(1)
    • Tips

      • LPUSH + LPOP = Stack
      • LPUSH + RPOP = Queue
      • LPUSH + LTRIM = Capped Collection
      • LPUSH + BRPOP = Message Queue
  • set

    • 特點
      • 無序
      • 不重複
    • 常用命令
      • sadd key element:向集合key新增element,如果element已經存在,則新增失敗
    • 查缺補漏
  • zset

  • 記錄網站訪問量

    incr userid:pageview

    hincrby user:1:info pageview count

單執行緒架構

redis是單執行緒架構,命令是序列的,上一個命令執行完了才會執行下一條命令。

  • 單執行緒為什麼這麼快?

    1.純記憶體:記憶體的響應速度快(主要原因)

    2.非阻塞IO

    3.避免前程切換和竟態消耗

單執行緒

  • 拒絕長命令,如:keys,flushall,flushdb,slow lua script,multi/exec,operate big value
  • redis其實不是完全單執行緒
    • fysnc file descriptor
    • close file descriptor