【Redis學習筆記一】Redis特點、基礎命令和數據結構

  • 更新時間:2018-10-15

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已經存在,則添加失敗,O(1)
      • srem key element:將集合key中的element移除掉,O(1)
      • scard user:1:follow:計算集合大小
      • sismember user:1:follow it:判斷it是否在集合中
      • srandmember user:1:follow count:從集合中隨機挑count個元素,不會破壞集合
      • smembers:取出集合中的所有元素,返回結果是無序的,小心使用,容易阻塞redis
      • spop user:1:follow:從集合中隨機彈出一個元素,會破壞集合
      • sdiff user:1:follow user:2:follow:求兩個集合的差集
      • sinter user:1:follow user:2:follow:求兩個集合的交集
      • sunion user:1:follow user:2:follow:求兩個集合的並集
      • sdiff|sinter|sunion + store destkey...:將差集、交集、並集的結果保存在destkey中
  • zset

    • 特點
      • 無重複元素
      • 有序
      • score + element
    • 常用命令
      • zadd key score element:添加score和element,可以是多對,O(logN)
      • zrem key element:刪除元素,O(1)
      • zscore key element:獲取score,O(1)
      • zincrby key increScore element:增加或減少元素的score
      • zcard key:返回元素總個數,O(1)
      • zrange key start end [WITHSCORES]:返回指定索引範圍內的升序元素[分值],O(logN+m)
      • zrangebyscore key minScore maxScore [WITHSCORES]:返回指定分數範圍內的升序元素[分值],O(logN+m)
      • zcount key minScore maxScore:返回有序集合內在指定分數範圍內的個數,O(logN+m)
      • zremrangebyrank key start end:刪除置頂排名的升序元素,O(logN+m)
      • zremrangebyscore key minScore maxScore:刪除置頂分數內的升序元素,O(logN+m)
    • 查缺補漏
      • zrevrank:zrank的倒序
      • zrevrange:zrange的倒序
      • zrevrangebyscore:zrangebyscore的倒序
      • zinterstore:有序集合的交集
      • zunionstore:有序集合的並集
  • 記錄網站訪問量

    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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章