1. 程式人生 > >Redis基礎語法入門

Redis基礎語法入門

通用命令

  1. 通用命令
    • keys
    • dbsize
    • exists key
    • del key [key…]
    • expire key seconds
    • type key
  2. keys(一般不在生產環境中使用)

    keys *
    
    # 遍歷所有key
    
    
    127.0.0.1:6379> set hello world
    OK
    127.0.0.1:6379> set php good
    OK
    127.0.0.1:6379> set java best
    OK
    127.0.0.1:6379> keys *
    1) "hello"
    2) "java" 3) "php" keys [pattern] # 使用萬用字元 127.0.0.1:6379> mset hello world heh haha php good phe his OK 127.0.0.1:6379> keys he* 1) "heh" 2) "hello" 127.0.0.1:6379> keys he[h-l]* 1) "heh" 2) "hello" 127.0.0.1:6379> keys ph? 1) "php" 2) "phe" 由於redis是基於單執行緒,在生成環境中使用keys命令會造成其他執行緒的阻塞,如果需要使用keys
    的話可以使用一下方式代替(以後的部落格會補充) 1. 熱備從節點 2. 使用scan
  3. dbsize

    dbsize
    
    #計算key的總數
    
    
    127.0.0.1:6379> dbsize
    (integer) 5
  4. exists

    exists key
    
    #檢查key是否存在
    
    
    127.0.0.1:6379> set a b
    OK
    127.0.0.1:6379> exists a
    (integer) 1   (1代表存在)
    127.0.0.1:6379> del a
    (integer) 1
    127.0.0.1:6379> exists a
    (integer) 0   (0代表不存在)
  5. del

    
    del key
    
    #刪除指定的key-value
    
    127.0.0.1:6379> set c d
    OK
    127.0.0.1:6379> del a c
    (integer) 1  (1代表刪除成功)
    127.0.0.1:6379> exists c
    (integer) 0
  6. expire,ttl,persist

    expire key seconds
    
    #key在seconds秒後過期
    
    
    ttl key
    
    #檢視key剩餘的過期時間
    
    
    persist key
    
    #清除key的過期時間
    
    
    127.0.0.1:6379> set hello world
    OK
    127.0.0.1:6379> expire hello 10
    (integer) 1
    127.0.0.1:6379> ttl hello
    (integer) 7
    127.0.0.1:6379> ttl hello
    (integer) -2   (-2代表已經過期,被刪除)
    127.0.0.1:6379> set hello world
    OK
    127.0.0.1:6379> expire hello 20
    (integer) 1
    127.0.0.1:6379> ttl hello
    (integer) 16
    127.0.0.1:6379> persist hello
    (integer) 1
    127.0.0.1:6379> ttl hello
    (integer) -1   (-1代表沒有設定過期時間)
    
  7. type

    type key
    
    #返回key的型別
    
    
    127.0.0.1:6379> set str stri
    OK
    127.0.0.1:6379> type str
    string
    127.0.0.1:6379> sadd myset 1 2 3
    (integer) 3
    127.0.0.1:6379> type myset
    set
    
    
    redis的type有string,hash,list,set,zset,none
  8. 時間複雜度
命令 時間複雜度
keys O(n)
dbsize O(1)
del O(1)
exists O(1)
expire O(1)
type O(1)

資料結構

  1. 字串

    • 鍵值對 key-value
    • API

      
      get key
      
      # 獲取key對應的value
      
      
      set key value
      
      # 設定key-value
      
      
      del key
      
      # 刪除key-value
      
      
      incr key
      
      # key自增1,如果key不存在,自增後get(key)=1
      
      
      decr key
      
      # key自減1,如果key不存在,自減後get(key)=-1
      
      
      incrby key k
      
      # key自增k,如果key不存在,自增後get(key)=k
      
      
      decr key k
      
      # key自減k,如果key不存在,自減後get(ke  y)=-k
      
      
      set key value
      
      # 不管key是否存在,都設定
      
      
      setnx key value
      
      # key不存在,才設定
      
      
      set key value xx
      
      # 當key存在,才設定
      
      
      mget key1 key2 key3 ...
      
      # 批量獲取key,原子操作(相較之於多次執行單次查詢,
      
      每次查詢都會連線一次網路,批量操作節約了大量的網路時間)
      
      
      mset key1 value1 key2 value2 ...
      
      # 批量設定key-value
      
      
      getset key newvalue
      
      # set key newvalue並返回舊的value
      
      
      append key value
      
      # 將value追加到舊的value
      
      
      strlen key
      
      # 返回字串的長度(注意中文)
      
      
      incrbyfloat key 3.5
      
      # 增加key對應的值3.5
      
      
      getrange key start end
      
      # 獲取字串指定下標所有的值
      
      
      setrange key index value
      
      # 設定指定下標所有對應的值
      
  2. 實戰:

    1. 記錄網站每個使用者個人主頁的訪問量

      incr userid:pageview(單執行緒:無競爭)
    2. 快取視訊的基本資訊(資料來源在mysql中)虛擬碼

      
      public VideoInfo get(long id){
         String redisKey = redisPrefix + id;
         VideoInfo videoInfo = redis.get(redisKey);
         if(videoInfo == null){
           videoInfo = mysql.get(id);
           if(videoInfo!=null){
              //序列化
              redis.set(redisKey,serialize(videoInfo));
           }
         }
      }
    3. 分散式id生成器

      
      incr id(原子操作)
  3. 雜湊

    1. key-field-value(相當於map中存的是map)
    2. API

      hget key field
      
      # 獲取hash key對應的field的value
      
      
      hset key field value
      
      # 設定hash key對應的field的value
      
      
      hdel key field
      
      # 刪除hash key對應的field的value
      
      
      hexists key field
      
      # 判斷hash key是否有field
      
      
      hlen key
      
      # 獲取hash key field的數量
      
      
      hmget key field1 field2...
      
      # 批量獲取hash key的一批field對應的值
      
      
      hmset key field1 value1 field2 value2...
      
      # 批量設定hash key的一批field value
      
      
      hgetall key
      
      # 返回hash key對應所有field的和value
      
      
      hvals key
      
      # 返回hash key對應所有field的value
      
      
      hkeys key
      
      # 返回hash key對應所有的field
      
      
      hsetnx key field value
      
      # 設定hash key對應的field的value(如果field已經存在,則失敗)
      
      
      hincrby key field intCounter
      
      # hash key 對應的field的value自增intCounter
      
      
      hincrbyfloat key field floatCounter
      
      # 自增浮點數
      
    3. 實戰

      1. 記錄個人網站主頁訪問量
          hincrby user:1:info pageview count
      1. 快取視訊的基本資訊(資料來源在mysql中)虛擬碼

        
        public VideoInfo get(long id){
            String redisKey = redisPrefix + id;
            Map<String,String> hashMap = redis.hgetAll(redisKey);
            VideoInfo videoInfo = transferMapToVideo(hashMap);
            if(videoInfo == null){
               videoInfo = mysql.get(id);
               if(videoInfo!=null){
              redis.hmset(redisKey,transferVideoToMap(videoInfo));     
               }
            }
            return videoInfo;
        }
  4. list

    1. key-elements
    2. API

      rpush key value1 value2...valueN
      
      # 從列表右端插入值(1-N)個
      
      
      lpush key value1 value2...valueN
      
      # 從列表左端插入值(1-N)個
      
      
      lpop key
      
      # 從列表左側彈出一個item
      
      
      rpop key
      
      # 從列表右側彈出一個item
      
      
      lrem key count value
      
      # 根據count值,從列表中刪除所有value相等的項
      
      (1)count>0,從左到右,刪除最多count個value相等的項
      (2)count<0,從右到左,刪除最多Math.abs(count)個value相等的項
      (3)count=0,刪除所有value相等的項
      
      ltrim key start end
      
      # 按照索引範圍修剪列表
      
      
      lrange key start end(包含end)
      
      # 獲取列表指定索引範圍所有item
      
      
      lindex key index
      
      # 獲取列表指定索引的item
      
      
      llen key
      
      #獲取列表長度
      
      
      lset key index newValue
      
      # 設定列表指定索引值為newValue
      
      
      blpop key timeout
      
      # lpop阻塞版本,timeout是阻塞超市時間,timeout=0是永遠不阻塞
      
      
      brpop key timeout
      
      # rpop阻塞版本,timeout是阻塞超市時間,timeout=0是永遠不阻塞
      
      
  5. 集合

    1. key-values(無序,不允許有重複元素,相當於set)
    2. API

      sadd key element
      
      # 向集合key新增element(如果element已經存在,新增失敗)
      
      
      srem key element
      
      # 將集合key中的element移出掉
      
      
      scard key 
      
      # 計算集合大小
      
      
      sismember key item
      
      # 判斷item是否屬於集合(1存在,0不存在)
      
      
      srandmember key count
      
      # 從集合中隨機取出count個元素
      
      
      spop key
      
      # 從集合中隨機彈出一個元素
      
      
      smembers key
      
      # 取出集合中所有的元素(返回結果是無序的,涉及到遍歷,小心使用)
      
      
      
      假設存在兩個集合:
          1. s1:a,b,c
          2. s2:a,c,d
      sdiff(差集):
      sdiff s1 s2 = b
      sdiff s2 s1 = d
      
      sinter(交集):
      sinter s1 s2 = a c
      
      sunion(並集):
      sunion s1 s2 = b a d c
      
      將以上結果儲存在指定集合(destkey):
      
      sdiff|sinter|sunion + store destkey
  6. 有序集合

    1. key-value(score-value)本身無序,使用score排序
    2. API

      zadd key score element(可以是多對)
      
      # 新增score和element
      
      
      zrem key element(可以是多個)
      
      # 刪除元素
      
      
      zscore key element
      
      # 返回元素的分數
      
      
      zincrby key increScore element
      
      # 增加或減少元素的分數
      
      
      zcard key
      
      # 返回元素的總個數
      
      
      zrange key start end[WITHSCORES](zrevrange 倒序)
      
      # 返回指定索引範圍內的升序元素[分值]
      
      
      zrangebyscore key minScore maxScore[WITHSCORES](zrevrangebyscore 倒序)
      
      # 返回指定分數範圍的升序元素[分值]
      
      
      zcount key minScore maxScore
      
      # 返回有序集合內在指定分數範圍內的個數
      
      
      zremrangebyrank key start end
      
      # 刪除指定排名內的升序元素
      
      
      zremrangebyscore key minScore maxScore
      
      # 刪除指定分數內的升序元素
      
      
      zrank key member
      
      # 獲取memeber元素對應的排名(升序,zrevrank倒序)
      
      
      zinterstore destination numkey key[key...] [WEIGHTS weight] [AGGREGATE sum|min|max]
      
      # 用於對給定的有序集合執行交集運算,運算結果集儲存到DESTINATION中
      
      
      # numkey是有序集合的數量;
      
      
      # WEIGHTS選項,用於指定一個乘法因子,有序集合中每個成員的SCORE值乘以該因子後,結果傳遞給聚合函式。並且,乘法因子的設定需要根據有序集合的個數分別指定。預設為1。
      
      
      
      # AGGREGATE選項,用於指定該交集的結果集的聚合方式。預設使用的是SUM。
      
      
      ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
      
      # 求並集