Redis是key-value數據庫,key一般是字符串型,value可以是其他的
String、Hash、List、、Set、SortedSet(五個基本類型)GEO、BitMap、HyperLog
官方文檔Commands | Docs
層級格式
結構
key允許有多個單詞形成層級結構,多個單詞之間用:隔開,格式如下:
項目名:業務名:類型:id
可以將對象序列化為JSON字符串後存儲
避免id衝突
通用命令
MSET
可以一次設置多個鍵值對的命令,屬於原子性操作,要麼成功,要麼失敗
KEYS
查看符合末班的所有key(不建議生產環境)
DEL
有中括號,可以刪除多個
EXISTS
也可以一對多
判斷是否存在
EXPIRE
給key設置有效期,有效期到期時key會被刪除
TTL
查看剩餘有效期
-2相當於已經刪除了
-1相當於永久有效
String類型
意味着它的value是字符串,不過根據字符串的格式不同,又可以分為string、int、float。無論哪種格式,底層都是字節數組形式存儲,只不過是編碼方式不同。字符串類型空間不超過512m
基礎命令
SET
設置一個值(覆蓋已有值)
SET name "Qfish"
GET
取值
GET name
批量操作
MSET
一次設置多個值
MSET a 1 b 2 c 3
MGET
MGET a b c
設置時間
SETEX
設置值 + 過期時間
秒級過期
SETEX code 60 "123456"
PSETEX
毫秒級過期
PSETEX temp 500 "hi"
SETNX key value
僅當 key 不存在時才設置(常用於分佈式鎖)
SETNX lock 1
數字操作
INCR
自增加1
INCR count
DECR
自減1
DECR count
INCRBY
自增n
INCRBY count 10
DECRBY
自減n
DECRBY count 10
INCRBYFLOAT
自增浮點數
INCRBYFLOAT price 0.8
字符串追加與長度
APPEND
往原值後追加內容
APPEND msg " world"
STRLEN
獲取字符串長度
STRLEN name
子串操作
GETRANGE key start end
按範圍取子串
GETRANGE title 0 4
SETRANGE key offset value
從偏移位置開始覆蓋寫入(不會刪除之後的內容)
SETRANGE name 2 "fish"
GETSET
GETSET key newValue
返回舊值,同時設置新值
GETSET token "new_token"
set key value nx==setnx
setex同理
List類型
可以看做一個雙向鏈表結構,或者也可以説很像雙端隊列,既可以支持正向檢索,也可以支持反向檢索。所以它是有序、可重複、插入和刪除快、查詢速度一般
添加元素
LPUSH key value [value ...]和RPUSH key value [value ...]
分別是向列表左邊和右邊添加數據,同時返回最後一個值
LPUSH mylist a b c → 列表變 [c,b,a] 返回c
RPUSH mylist a b c → [a,b,c] 返回c
刪除元素
LPOP key和RPOP key
顧名思義就是對於列表分別從左和從右刪除元素,並且返回元素
列表是[a,b,c]
LPOP mylist → 列表變 [b,c]返回a
RPOP mylist → 列表變[a,b]返回c
LREM key count value
移除列表中與 value 匹配的元素,這裏的count意思是從頭開始三處幾個value
LREM mylist 2 a → 從頭開始刪除 2 個 a
獲取元素
LINDEX key index
獲取指定索引的元素(0為頭,-1為尾)
LINDEX mylist 0 → 獲取頭元素
LRANGE key start stop
獲取指定區間的元素(包含 start 和 stop)
LRANGE mylist 0 -1 → 獲取所有
修改插入元素
LSET key index value
設置指定索引的值
LSET mylist 0 x
LINSERT key BEFORE|AFTER pivot value
在 list 中找到 pivot(基準值),然後把新元素插入到它 前面(BEFORE) 或 後面(AFTER)。
LINSERT mylist BEFORE "b" "x"
那麼這時候可能會有人要問,如果有多個怎麼辦,不用擔心,它只會匹配第一個出現的。所以引出一個思考:應該怎麼解決想要特定的值呢?個人建議可以加一個唯一標識,比如id這種
彈出元素
BLPOP key [key ...] timeout和BRPOP key [key ...] timeout
分別是阻塞彈出左邊和右邊元素,timeout 秒。timeout是等待,因為不可能一直等下去,如果沒有元素就會等待timeout
BLPOP mylist 5
BRPOP mylist 5
長度
LLEN key
獲取列表長度
LLEN mylist
LTRIM key start stop
裁剪列表,只保留指定區間
LTRIM mylist 0 9 → 只保留前 0-9的元素,包括start和stop
Hash類型
也叫散列,其value是一個無序字典,類似於Java中的HashMap結構
Hash結構可以將對象中的每個字段獨立存儲,可以針對單個字段做CRUD
基礎操作
HSET key field value
設置一個字段的值,
HSET user:1 name "tom"
HGET key field
獲取一個字段值
HGET user:1 name
HDEL key field [field ...]
刪除一個或多個字段
HDEL user:1 name age
HEXISTS key field
字段是否存在
HEXISTS user:1 age
然後就會發現,hash相比於string前面只是多了一個h,這還是很好記的,然後多了一個field,其實可以直接當做map一樣理解就可以了
批量操作
HMSET key field value [field value ...](8.0 之後推薦 HSET 多字段)
HMSET user:1 name "tom" age 18
HMGET key field [field ...]
HMGET user:1 name age
HGETALL key
返回所有字段和值
HGETALL user:1
遍歷操作
HKEYS key
返回所有字段名
HKEYS user:1
HVALS key
返回所有字段值
HVALS user:1
HLEN key
返回字段數量
HLEN user:1
數字操作(字段裏的數字也能自增)
HINCRBY key field increment
HINCRBY user:1 age 1
HINCRBYFLOAT key field increment
HINCRBYFLOAT wallet balance 8.5
HSETNX key field value
作用參考string版,當然過期的話只能用EXPIRE,不存在HSETEX這
Set類型
可以看成value為null的HashMap,也是一個Hash表。所以它是無序、元素不可重複、查找快、支持交集、並集、差集等功能。如果是學過C++的小夥伴,千萬不要和STL裏面的Set搞混了。
添加元素
SADD key member [member ...]
SADD myset a b c
刪除元素
SREM key member [member ...]
SREM myset a
判斷是否存在
SISMEMBER key member
SISMEMBER myset a # 1 或 0
獲取所有元素
SMEMBERS key
SMEMBERS myset
獲取元素數量
SCARD key
SCARD myset
返回隨機元素(不刪除)
SRANDMEMBER key [count]
count是返回的個數
SRANDMEMBER myset # 返回一個
SRANDMEMBER myset 3 # 返回三個(可重複)
隨機彈出(返回並刪除)
SPOP key [count]
SPOP myset # 隨機刪除並返回
SPOP myset 2
交集
SINTER key [key ...]
SINTER set1 set2
保存交集
SINTERSTORE key destkey
SINTERSTORE result set1 set2
並集
SUNION key [key ...]
SUNION set1 set2
保存並集
SUNIONSTORE result set1 set2
差集(屬於 A 不屬於 B)
SDIFF key [key ...]
SDIFF set1 set2
差集合並
SDIFFSTORE result set1 set2
掃描
SSCAN key cursor [MATCH pattern] [COUNT count]
SortedSet類型
可排序、查詢速度快、元素不重複
添加 / 更新元素
ZADD key score member [score member ...]
添加或者更新成員的 score。
ZADD rank 100 user1
ZADD rank 200 user2 150 user3
獲取元素(按排名或分數)
ZRANGE key start stop [WITHSCORES]
按 score 從小到大 + 按 rank 獲取元素。
ZRANGE rank 0 -1 WITHSCORES
ZREVRANGE key start stop [WITHSCORES]
按 score 從大到小。
按 score 區間查詢
ZRANGEBYSCORE key min max [WITHSCORES]
按 score 範圍查成員。
ZRANGEBYSCORE rank 100 200
ZREVRANGEBYSCORE key max min
倒序版。
獲取排名 / 分數
ZSCORE key member
查看某成員分數。
ZSCORE rank user1
ZRANK key member
成員在 升序 排名中的位置(0-based)。
ZRANK rank user1
ZREVRANK key member
下降序排名。
刪除相關
ZREM key member [member ...]
刪除成員。
ZREM rank user1 user2
ZREMRANGEBYSCORE key min max
按 score 刪除。
ZREMRANGEBYRANK key start stop
按排名刪除。
計數相關
ZCARD key
獲取成員數量。
ZCOUNT key min max
統計 score 在範圍內的數量。
修改 score
ZINCRBY key increment member
讓成員 score 增加/減少。
ZINCRBY rank 10 user1
集羣/集合操作
ZINTERSTORE destination numkeys key [key ...]
多個 ZSet 求交集並存儲。
ZUNIONSTORE destination numkeys key [key ...]
多個 ZSet 求並集並存儲。
可以搭配 WEIGHTS、AGGREGATE 做更復雜權重計算。
其它常用
ZPOPMax / ZPOPMin
彈出 score 最大/最小的成員。