文章目錄
0.通用命令
一些簡單通用命令
主要包括keys、dbsize、exists key、del key[key …] 、expire key seconds、type key
- keys(redis數據庫中所有的鍵)
遍歷出所有的key
keys一般不建議在生產環境中使用,生產環境的key值比較多,一方面這麼多的key值找起來很麻煩,另一方面這個是一個o(n)的操作
keys hel*可以顯示出來所有的hel相關的 - dbsize(可以算出數據庫的大小)
可以算出key的總數,redis內置的計數器,實時的更新redis中key的總數。時間複雜度是o(1) - exists key
可以判斷一個key值是否存在,key可以是任意數據類型
如 exist a來判斷a這個鍵是否存在 - del key[key …]
刪除指定的key,value,這個命令可以刪除多個的
如刪除a:del a,成功刪除就是1,錯誤刪除就是0,刪除多個會返回刪除的數量
- expire key seconds(爲Key設置過期時間)
key在seconds秒後過期如:
ttl key
查看當前key剩餘的過期時間
persist key
去掉key的過期時間 - type key
返回key的類型,主要類型有string、hash、list、set、zSet、none
時間複雜度比較
命令 | 時間複雜度 |
---|---|
keys | o(n) |
dbsize | o(1) |
del | o(1) |
exists | o(1) |
expire | o(1) |
type | o(1) |
數據結構和內部編碼
編碼方式(encoding): string、hash、list、set、sorted set
單線程架構
redis使用了單線程的架構,那爲什麼使用了單線程速度還是那麼快呢?主要原因有一下幾點:
- 純內存(我們知道數據放入內存中是非常快的)
- 非阻塞IO
- 避免線程切換和競態消耗
主要還是第1條,第2、3條是起到輔助的作用
redis使用中需要注意的地方:
1.一次只運行一條命令
2.拒絕長(慢)命令
keys,flushall,flushdb,slow lua script,mutil/exec, operate big value(collection)
一般這些命令,比如你用了一個keys,而存在很多key,這樣後面的命令就會一直在等待。
3.其實redis也不是絕對的單線程,例如執行以下命令的時候,就會新開一個線程去執行
fysnc file descriptor
close file descriptor
1.字符串類型
基本結構和命令
對於redis,它的所有鍵都是字符串,它的值可以多種類型,值可以爲字符串、數字、bit形、JSON串等
字符串類型的value是不能大於512MB的,一般建議key、value在100M以內。
字符串類型的使用場景
- 緩存
- 計數器(如視頻網站的計數器,比如每次播放視頻)
- 分佈式鎖等
命令
- get(o(1))
get key獲取key指定的value - set(o(1))
設置key-value - del(o(1))
del key,刪除指定的key - incr(o(1))
incr key表示自增1,如果key不存在,自增後get(key)=1 - decr(o(1))
decr key 表示自減1,如果key不存在,自增後get(key)=-1 - incrby(o(1))
incrby key k 表示自增k,如果key不存在,自增後get(key)=k - decrby(o(1))
decrby key k 表示自減k,如果key不存在,自增後get(key)=-k
實戰
- 用redis寫個小程序來記錄網站每個用戶個人主頁的訪問量?
incr userId: pageview(單線程:無競爭),每個userId頁面訪問量進行了區分,自增,redis是天然適合作爲計數器的,因爲它是單線程:無競爭。 - 緩存視頻的基本信息(數據源在MySQL中)
先從緩存中根據Id取數據,如果沒有則從數據庫中取,並存入緩存中 - 分佈式id生成器
incr id(原子操作) - set key value(o(1))
不管key是否存在, 都設置 - setnx key vaue(o(1))
key不存在,才設置 - set key value xx(o(1))
key存在才設置,相當於更新操作 - mget (o(n))
批量獲取key,是一個原子操作,如:mget key1 key2 key3…
n次get=n次網絡時間+n次命令時間,像mget這種操作就可以省去大量的網絡時間,1次mget=1次網絡時間+n次命令時間。使用的時候也要節制去使用。 - mset(o(n))
批量設置key-value,mset key1 value1 key2 value2…
查缺補漏
- getset key newvalue o(1)
set key newvalue並返回舊的value - append key value o(1)
將value追加到舊的value - strlen key o(1)
返回字符串的長度(注意中文) - incrbyfloat o(1)
增加key對應的值3.5 - getrange key start end o(1)
獲取字符串指定下標所有的值 - setrange key index value o(1)
設置指定下標所有對應的值
字符串命令總結:
命令 | 含義 | 複雜度 |
---|---|---|
set key value | 設置key-value | o(1) |
get key | 獲取key-value | o(1) |
del key | 刪除key-value | o(1) |
setnx setxx | 根據key是否存在設置key-value | o(1) |
Incr desc | 計數 | o(1) |
mget mset | 批量操作key-value | o(n) |
2.哈希類型
重要API
所有Hash的命令都是以h開頭的,最簡單的三個命令hget、hset、hdel
- hget key field (o(1))
獲取hash key 對應的field的value - hset key field value(o(1))
設置hash key 對應field的value - hdel key field(o(1))
刪除hash key 對應field的value - hexists key field(o(1))
判斷hash key是否有field - hlen key(o(1))
獲取hash key field的數量 - hmget key field1 field2 … fieldN(o(n))
批量獲取hash key 的一批field對應的值 - hmset key field1 value1 field2 value2…fieldN valueN(o(n))
批量設置hash key的一批field value
hash實戰
- 記錄網站每個用戶個人主頁的訪問量?
使用的命令:hincrby user:1:info pageview count
hash vs string
string | hash |
---|---|
get | hget |
set setnx | hset hsetnx |
incr incrby decr decrby | hincrby |
del | hdel |
mset | hmset |
mget | hmget |
查缺補漏
-
hgetall key(o(n))
返回hash key對應所有的field和value -
hvals key(o(n))
返回hash key對應所有field的value -
hkeys key(o(n))
返回hash key對應所有field -
hsetnx(o(1))
hsetnx key field value:設置hash key對應field的value(如field已經存在,則失敗) -
hincrby(o(1))
hincrby key field intCounter: hash key對應的field的value自增intCounter -
hincrbyfloat(o(1))
hincrbyfloat key field floatCounter
hincrby浮點數版本
hash總結
命令 | 複雜度 |
---|---|
hget、hset、hdel | o(1) |
hexists | o(1) |
hincrby | o(1) |
hgetall、hvals、hkeys | o(n) |
hmget、hmset | o(n) |
3.列表類型
特點
有序、可以重複、左右兩邊插入彈出
重要API
-
rpush(o(1~n)根據實際插入的元素個數來計)
rpush key value1 value2 …valueN
從列表右端插入值(1-N個) -
lpush(o(1~n)根據實際插入的元素個數來計)
從列表左端插入值 -
linsert(o(n))
linsert key before | after value newValue
在list指定的值前|後插入newValue,它的時間複雜度是o(n)因爲它要遍歷這個列表
用法,比如:a->b->c->d
執行linsert listkey before b java之後
a->java->b->c->d -
lpop key(o(1))
從列表左邊彈出一個item -
rpop key(o(1))
從列表右邊彈出一個item -
lrem(o(n))
-
ltrim key start end(o(n))
按照索引範圍修剪列表 -
lrange(o(n))
lrange key start end(包含end),獲取列表指定索引範圍所有item -
lindex(o(n))
lindex key index
獲取列表指定索引的item -
llen(o(1))
llen key:算出列表的長度 -
lset(o(n))
lset key index newValue:設置列表指定索引值爲newValue
應用
比如微博中,你關注的人更新的微博動態,lpush
查缺補漏
- blpop(o(1))
blpop key timeout
lpop阻塞版本,timeout是阻塞超時時間,timeout=0爲永遠不阻塞 - brpop (o(1))
brpop key timeout
rpop 阻塞版本,timeout是阻塞超時時間,timeout=0爲永遠不阻塞
Tips
- LPUSH + LPOP = Stack
- LPUSH + RPOP = Queue
- LPUSH + LTRIM = Capped Collection
- LPUSH + BRPOP = Message Queue
4.集合類型
特點
無序、無重複元素、集合間操作
所有的API都是以s開頭
集合內API和實戰
-
sadd(o(1))
sadd key element
向集合key添加element(如果element已經存在,添加失敗) -
srem key element(o(1))
將集合key中的element移除掉
-
scard user:1:follow
計算集合大小
-
sismember user:1:follow it (存在)
判斷it是否在集合中
-
srandmember user:1:follow count
從集合中隨機挑count個元素
-
spop user:1:follow
從集合中隨機彈出一個元素 -
smembers user:1:follow
獲取集合所有元素,如果集合中有非常多的數據要注意,因爲redis是單線程的,這樣會阻塞。
注意:
spop從集合中彈出元素,srandmember不會破壞集合
應用
抽獎系統、like、贊、踩、標籤(tag)
集合間API和實戰
比如說微博中共同關注的好友呀,共同關注的興趣呀,就會用到set數據結構
- sdiff:差集
- sinter:交集
- sunion:並集
Tips
SADD = Tagging
SPOP/SRANDMEMBER = Random item
SADD + SINTER = Social Graph
5.有序集合類型
特點
按照scrore分值來組成有序的集合、有序集合都是以z開頭的命令
重要API
-
zadd(o(logN))
zadd key core element(可以是多對),添加score和element -
zrem(o(1))
zrem key element(可以是多個)
刪除元素 -
zscore(o(1))
zscore key element
返回元素的分數 -
zincrby(o(1))
zincrby key increScore element
增加或減少元素的分數 -
zcard(o(1))
zcard key
返回元素的總個數 -
zrank
獲取某個元素的排名 -
zrange (o(log(n) + m))
zrange key start end [WITHSCORES]
返回指定索引範圍內的升序元素[分值]
WITHSCORES:是否將元素的分值進行打印 -
zrangebyscore o(log(n) + m)
zrangebyscore key minScore maxScore[WITHSCORES]
返回指定分數範圍內的升序元素[分值] -
zcount (o(log(n) + m))
zcount key minScore maxScore
返回有序集合內在在指定分數範圍內的個數 -
zremrangebyrank(o(log (n) + m))
zremrangebyrank key start end
刪除指定排名內的升序元素 -
zremrangebyscore(o(log(n) + m))
zremrangebyscore key minScore maxScore
操作:
實戰
排行榜(銷售榜、音樂排行榜、圖書排行榜)
查缺補漏
- zrevrank
- zrevrange
- zrevrangebyscore
- zinterstore
- zunionstore
有序集合總結
操作類型 | 命令 |
---|---|
基本操作 | zadd、zrem、zcard、zincrby、zscore |
範圍操作 | zrange、zrangebyscore、zcount、zremrangebyrank |
集合操作 | zunionstore、zinterstore |