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 # 刪除指定排名內的升序元素
實戰 排行榜(音樂,書籍,贊數最多的文章 等等)