1. 程式人生 > >Redis學習筆記一

Redis學習筆記一

Redis單執行緒

redis一次只會執行一條命令,單執行緒還快的原因

  1. redis是純記憶體的,記憶體的響應時間特別快

  2. 非阻塞IO

  3. 單執行緒避免了執行緒切換和競態消耗

個人感覺主要還是因為記憶體,響應時間100納秒。

拒絕長/慢命令   keys,flushall.flushdb,slow lua script ,mutil/exec, operate big value

其實redis也不是完全的單執行緒,如fysnc file descriptor.

API的理解與使用

通用命令

keys命令 遍歷所有key

一般生產環境不用,因為實際情況key太多了。

使用

  1. 熱備從節點,主節點有從節點都有,可以在從節點使用keys。

  2. scan命令

dbsize   看key-value的個數,內建的計數器,不是遍歷的,時間複雜度O(1)

exists    是否存在

del         刪除指定key-value

expire    過期時間

ttl      檢視剩餘的過期時間

persist   去掉過期時間

type  返回key型別

資料結構

因為記憶體還是比較貴的,所以使用了很多的壓縮資料結構。比如list,redis3.2提出了quicklist,解決了ziplist,linkedlist在某些場景下的效能缺陷,使用者不用去關心它的實際情況,只要知道list資料結構的使用方法就可以了。

1. 字串  

字串value 上限512M,併發和流量的時候不會特別大。

字串常用在快取,計數器,分散式鎖等等。

操作API    get, set, del。

incr,decr,incrby , decrby命令

實戰

 1. 記錄網站每個使用者個人主頁的訪問量? incr userid:pageview

    2. 快取視訊的基本資訊,資料來源在MySQL中

public VideoInfo get(long id) {
    String redisKey = redisPrefix + id;
    VideoInfo vidoInfo = redis.get(redisKey); 
     #redis只能取二進位制,字串,不能取物件,這裡只是抽象
   
   if(videoInfo == null ) {
        videoInfo == mysql.get(id);
        if(videoInfo != null) {
            redis.set(redisKey, serialize(videoInfo));
            }
        }    
}

    3.  分散式id生成器    原子單執行緒,incr id 

set  key value  不管是否存在都設定,

setnx  key value不存在才設定 ,

setxx  key  value存在才設定.

mget 批量獲取key,原子操作

mset 批量設定key-value

append key value 將value追加到舊的value

strlen  返回字串的長度 

2. hash

key   --->  field  value  

hash的API都是以 h 開頭 hget, hset, hdel, hmget, hmset , hexists, hlen, hgetall(返回hash key 對應所有的field和value) , hvals (返回hash key對應所有field的value),hkeys(返回hash key對應所有field)

例子  hset user:1:info age 23  設定user 1 的info中age 為23

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

    hincrby user:1:info pageview  count

          2.  快取視訊資訊

Hash就是個小Redis。

3. list

key  ----> elements    與Python中類似, 有序,可以重複,可以左右彈出

列表的api   

增 rpush 右插入   lpush 左插入   linsert key before| after value newvalue 在某值之前或之後插入新值  

刪 lpop 左彈出 rpop 右彈出  lrem key count value   count > 0  從左到右 刪除最多count個value相等的值 

                        count < 0 從右到左,刪除最多 -count個value相等的值

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

      ltrim  按照索引範圍修剪列表

查 lrange  lrange key start end(包含end)

     lindex key index  獲得指定索引的item

  llen  key  獲取列表長度  

改  lset  lset key index newValue     複雜度 O(n) 

實戰  TimeLine    rpush, lpush 很相似,微博頁面分頁,可以用lrange,每條微博的資訊是個實體,微博序列號。

        關注的人更新了微博,lpush,

blpop,brpop  bloop  key timeout   # lpop的阻塞版本,timeout為阻塞超時時間

集合set

集合是無序,無重複,支援集合間操作

兩集合的關係運算 sinter,sdiff,sunion 交,差,並

實戰,我關注的人也關注她,共同關注

集合api以 s開頭

sadd ,srem,scard(計算集合大小),sismember(判斷是否在集合中),srandmember(睡覺挑一個),spop(隨機彈出一個元素)

smembers(獲取集合所有元素) 集合較大時,要慎重使用,也是有 sscan

實戰: 抽獎, srandmember,  

           點贊,踩,可以存在集合中

   標籤,給使用者新增標籤

有序集合 zset

有序集合相比於集合是有序的,無序中只存element,有序中存element + score

API以z開頭

zadd key score element #新增 score和element  O(logn)

zrem key element O(1)  #刪除

zscore  key element #返回元素分數

zincrby  key increScore element #增加或減少元素的分數  O(1)

zcard key #返回元素的個數 O(1)  有計數器,會自動計數。

zrange 和 lrange相似  zrange key start end [withscores] #返回索引範圍的升序元素

zrangebyscore zrangebyscore key minScore maxScore #返回指定分數範圍內的升序元素  

zcount  zcount key minscore maxScore #返回有序集合內在指定分數範圍內的個數

zremrangebyrank   # 刪除指定排名內的升序元素

實戰  排行榜(音樂,書籍,贊數最多的文章 等等)