Redis相較于其它的數(shù)據(jù)庫(kù)雖然簡(jiǎn)單,但是要熟記所有命令的用法也并非易事。一個(gè)簡(jiǎn)單的技巧是通過(guò)要操作的數(shù)據(jù)類型來(lái)將這些命令進(jìn)行結(jié)構(gòu)化。
數(shù)據(jù)類型和對(duì)應(yīng)命令
所有存儲(chǔ)于redis中的數(shù)據(jù)都對(duì)應(yīng)于一個(gè)鍵值對(duì)(key-value pair), key可以是任意二進(jìn)制序列,通常我們使用字符串來(lái)標(biāo)記一個(gè)特定的key。在redis中我們通常稱這個(gè)key為name或者就叫key, 而對(duì)于value,redis支持如下幾種類型:
- strings
- lists: list內(nèi)容只能是string
- sets: set中存儲(chǔ)非重復(fù)的string
- sorted sets: 與sets類似,但是每個(gè)string都會(huì)對(duì)應(yīng)一個(gè)float類型的score,從而用于排序
- hashes: 鍵值對(duì)hash類型,也就是Python中的dict,注意在redis中最外層的key一般叫做name或者key,而value中數(shù)據(jù)類型如果是dict,那么這個(gè)dict中的key通常被稱為field。
- Bit arrays (or simply bitmaps): 實(shí)際存儲(chǔ)的仍然是string,但是可以針對(duì)bit進(jìn)行操作
- HyperLogLogs: 用于估計(jì)unique value的數(shù)量
針對(duì)不同的數(shù)據(jù)類型,會(huì)有不同的命令,通過(guò)如下腦圖可以更加清晰地記憶redis的命令

strings
127.0.0.1:6379> set strtest xyz
OK
127.0.0.1:6379> get strtest
"xyz"
127.0.0.1:6379> mset a 1 b 2 c 3
OK
127.0.0.1:6379> mget a b c
1) "1"
2) "2"
3) "3"
# 注意以下增減操作只能針對(duì)整數(shù)數(shù)字(雖然類型仍然是string類型)
127.0.0.1:6379> incr a
(integer) 2
127.0.0.1:6379> incrby b 5
(integer) 7
127.0.0.1:6379> decr b
(integer) 6
127.0.0.1:6379> decrby b 3
(integer) 3
lists
lists類型中存儲(chǔ)的仍然是string類型
# left push用于從左將item壓入到list當(dāng)中
127.0.0.1:6379> lpush list_test 1 2 3
(integer) 3
# 注意如果想看list中的內(nèi)容,無(wú)法通過(guò)get直接去看,get只是針對(duì)string,而必須使用lrange
127.0.0.1:6379> get list_test
(error) WRONGTYPE Operation against a key holding the wrong kind of value
# 這里0 -1均為list index,表示從index 0 開(kāi)始到-1結(jié)束,-1即從右數(shù)最后一個(gè)item
127.0.0.1:6379> lrange list_test 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> rpush list_test 5 7
(integer) 5
127.0.0.1:6379> lrange list_test 0 -1
1) "3"
2) "2"
3) "1"
4) "5"
5) "7"
127.0.0.1:6379> lpop list_test
"3"
127.0.0.1:6379> lrange list_test 0 -1
1) "2"
2) "1"
3) "5"
4) "7"
# 從左trim截?cái)鄉(xiāng)ist,以下是截取index 0 到index 2 的item作為新的list
127.0.0.1:6379> ltrim list_test 0 2
OK
127.0.0.1:6379> lrange list_test 0 -1
1) "2"
2) "1"
3) "5"
hashes (dict)
哈希類型,在python中也就是dict類型。這也是非常常用的數(shù)據(jù)類型。
127.0.0.1:6379> hset htest a 1
(integer) 1
127.0.0.1:6379> hget htest a
"1"
127.0.0.1:6379> hmset htest a 1 b 2 c 3
OK
127.0.0.1:6379> hmget htest a b c
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> hgetall htest
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
127.0.0.1:6379> hkeys htest
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> hvals htest
1) "1"
2) "2"
3) "3"
在python程序中使用redis-py driver的時(shí)候,通過(guò)dict進(jìn)行操作會(huì)非常清晰和簡(jiǎn)單。
In [1]: import redis
In [2]: r = redis.StrictRedis(host='localhost', port=6379, db=0)
In [3]: d = {"a": 2, "b": 3}
In [4]: key = "test:2"
In [5]: r.hmset(key, d)
Out[5]: True
In [6]: r.hgetall(key)
Out[6]: {'a': '2', 'b': '3'}
sets
127.0.0.1:6379> sadd set_test a b 33
(integer) 3
127.0.0.1:6379> sadd set_test c a b 22
(integer) 1
# 可以看到不會(huì)有重復(fù)的item
127.0.0.1:6379> smembers set_test
1) "c"
2) "33"
3) "a"
4) "b"
# 用于測(cè)試set中是否包含指定的item,如有則返回1,沒(méi)有返回0
127.0.0.1:6379> sismember set_test a
(integer) 1
127.0.0.1:6379> sismember set_test xx
(integer) 0
127.0.0.1:6379> sadd set_test2 a b 56 66
(integer) 4
127.0.0.1:6379> smembers set_test2
1) "56"
2) "a"
3) "66"
4) "b"
# 求交集
127.0.0.1:6379> sinter set_test set_test2
1) "a"
2) "b"
# 求并集
127.0.0.1:6379> sunion set_test set_test2
1) "33"
2) "a"
3) "56"
4) "c"
5) "66"
6) "22"
7) "b"
sorted sets
sorted sets與sets類似,可以保證item不重復(fù),區(qū)別在于sorted sets中每個(gè)item對(duì)應(yīng)一個(gè)float類型的score
127.0.0.1:6379> zadd sort_set 2.2 a
(integer) 1
127.0.0.1:6379> zadd sort_set 2 bb
(integer) 1
127.0.0.1:6379> zadd sort_set 10 x
(integer) 1
# 獲取index 從0 到-1的(即所有) items
127.0.0.1:6379> zrange sort_set 0 -1
1) "bb"
2) "a"
3) "x"
# 獲取item bb對(duì)應(yīng)的index
127.0.0.1:6379> zrank sort_set bb
(integer) 0
127.0.0.1:6379> zrank sort_set x
(integer) 2
127.0.0.1:6379> zscore sort_set x
"10"
# 用于獲取對(duì)應(yīng)score set中item的數(shù)量
127.0.0.1:6379> zcard sort_set
(integer) 3
bit arrays
用于針對(duì)指定的key設(shè)置位數(shù)據(jù)為0 或 1。當(dāng)我們對(duì)存儲(chǔ)有較高要求,且對(duì)于統(tǒng)計(jì)為1的item的數(shù)量時(shí),使用bit array是一個(gè)好的辦法。
# 針對(duì)bit 7進(jìn)行設(shè)置,設(shè)置為1,返回該位之前存儲(chǔ)的值
127.0.0.1:6379> setbit bit_test 7 1
(integer) 0
127.0.0.1:6379> setbit bit_test 7 0
(integer) 1
127.0.0.1:6379> get bit_test
"\x00"
127.0.0.1:6379> setbit bit_test 8 1
(integer) 0
127.0.0.1:6379> setbit bit_test 9 1
(integer) 0
# 統(tǒng)計(jì)有多少位為1
127.0.0.1:6379> bitcount bit_test
(integer) 2
HyperLogLogs
redis實(shí)現(xiàn)了相應(yīng)算法可以估計(jì)hyperloglog中存儲(chǔ)的所有item中非重復(fù)的item的數(shù)量
127.0.0.1:6379> pfadd loglog 1 3 5 7 1
(integer) 1
127.0.0.1:6379> pfcount loglog
(integer) 4
通用的命令
- keys pattern: pattern可以為glob風(fēng)格的通配符格式,最常用的是
keys *查詢所有的keys - exists key: 查詢?cè)搆ey是否存在
- del key: 刪除該key對(duì)應(yīng)的數(shù)據(jù)
- type key: 查詢?cè)搆ey對(duì)應(yīng)的value的數(shù)據(jù)類型
- expire key: 定義多長(zhǎng)時(shí)間后key對(duì)應(yīng)的數(shù)據(jù)過(guò)期,過(guò)期后數(shù)據(jù)會(huì)被自動(dòng)刪除
- ttl key: 查詢?cè)搆ey對(duì)應(yīng)的剩余存活時(shí)間
- flushdb/flushall: flushdb用于清除當(dāng)前db的所有數(shù)據(jù),flushall清除所有數(shù)據(jù)庫(kù)的數(shù)據(jù)