1. Redis數(shù)據(jù)結(jié)構(gòu)
Redis可以存儲(chǔ)鍵與5種不同數(shù)據(jù)結(jié)構(gòu)類型之間的映射,分別為string(字符串)、list(列表)、set(集合)宿崭、hash(散列)和zset(有序集合)。日常使用的基本上就是如上的五種常見(jiàn)數(shù)據(jù)結(jié)構(gòu)才写。此外葡兑,Redis還支持bitmaps(位圖), hyperloglogs(超級(jí)日志), geospatial indexes with radius queries and streams(具有半徑查詢和流的地理空間索引)。
下面引用《Redis實(shí)戰(zhàn)》的表格赞草,介紹五種常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)
結(jié)構(gòu)類型 結(jié)構(gòu)存儲(chǔ)的值 結(jié)構(gòu)的讀寫(xiě)能力 STRING 可以是字符串讹堤、整數(shù)或浮點(diǎn)數(shù) 對(duì)整個(gè)字符串或者字符串的其中一部分執(zhí)行操作;對(duì)整數(shù)和浮點(diǎn)數(shù)執(zhí)行自增(increment)或者自減(decrement) LIST 一個(gè)鏈表房资,鏈表上的每個(gè)節(jié)點(diǎn)都包含一個(gè)字符串 從鏈表的兩端推入或者彈出元素蜕劝;根據(jù)偏移量對(duì)鏈表進(jìn)行修剪(trim);讀取單個(gè)或者多個(gè)元素轰异;根據(jù)值查找或者移除元素岖沛。 SET 包含字符串的無(wú)序收集器(unordered collection),并且被包含的每個(gè)字符串都是獨(dú)一無(wú)二搭独、各不相同的 添加婴削、獲取、移除單個(gè)元素牙肝;檢查一個(gè)元素是否存在于集合中唉俗;計(jì)算交集、并集配椭、差集虫溜;從集合里面隨機(jī)獲取元素。 HASH 包含鍵值對(duì)的無(wú)序散列表 添加股缸、獲取衡楞、移除單個(gè)鍵值對(duì);獲取所有鍵值對(duì)瘾境。 ZSET(有序集合) 字符串成員(member)與浮點(diǎn)數(shù)分值(score)之間的有序映射,元素的排列順序由分值的大小決定 添加镰惦、獲取迷守、刪除單個(gè)元素;根據(jù)分值范圍(range)或者成員來(lái)或許元素旺入。
-
string:字符串類型是非常常見(jiàn)的一種類型兑凿,Redis中的字符串類型和很多編程語(yǔ)言里的字符串類型差不多凯力,但相對(duì)要靈活些。字符串可以存儲(chǔ)以下三種類型:
- 字符串(字節(jié)組成的序列)
- 整數(shù)
- 浮點(diǎn)數(shù)
當(dāng)字符串中的值可以被解釋成十進(jìn)制數(shù)或者浮點(diǎn)數(shù)的時(shí)候礼华,Redis就會(huì)發(fā)現(xiàn)這一點(diǎn)沮协,并允許用戶對(duì)這個(gè)字符串進(jìn)行各種增(incr*)、減(decr*)操作卓嫂。如果對(duì)一個(gè)不存在的鍵或者保存了空串的鍵進(jìn)行增減操作,則Redis會(huì)將其值當(dāng)做0來(lái)處理聘殖。如果值無(wú)法被解釋為整數(shù)或浮點(diǎn)數(shù)晨雳,Redis將向用戶返回一個(gè)錯(cuò)誤。
list:列表可以看作是個(gè)雙端隊(duì)列奸腺,可以在列表兩端推入和彈出元素餐禁。對(duì)列表的不同操作可以實(shí)現(xiàn)其他編程語(yǔ)言中的堆棧(同一端進(jìn)出)和隊(duì)列(一端進(jìn),另一端出)數(shù)據(jù)結(jié)構(gòu)突照。
set:集合最顯著的特點(diǎn)應(yīng)該就是其中的元素互不相同帮非。用戶可以快速對(duì)集合進(jìn)行插入,刪除讹蘑,檢查某元素是否在集合中的操作末盔。此外,多個(gè)集合間也能很方便的執(zhí)行交座慰、并陨舱、差集運(yùn)算。
zset:有序集合存儲(chǔ)著成員與分值(權(quán)值版仔,在Redis中以IEEE 754雙精度浮點(diǎn)數(shù)的格式存儲(chǔ))之間的映射游盲,并且提供了分值處理命令。適用于按照權(quán)值獲取元素的情況蛮粮。如熱門(mén)帖子獲取益缎、基于投票數(shù)排序文章等。
hash:Redis中的散列可以讓用戶將多個(gè)鍵值對(duì)存儲(chǔ)到一個(gè)Redis鍵中然想,可以把這種數(shù)據(jù)聚集看作是關(guān)系數(shù)據(jù)庫(kù)中的行莺奔,或者文檔數(shù)據(jù)庫(kù)中的文檔。
2. Redis常用命令
2.1 key的有關(guān)命令
命令 | 操作 |
---|---|
exists key | 測(cè)試指定key是否存在 |
del key1 [key2 ...] | 刪除給定key |
type key | 返回給定key的類型 |
keys pattern | 以正則表達(dá)式的形式又沾,返回匹配的所有key |
rename oldkey newkey | 修改key的名字 |
dbsize | 查看數(shù)據(jù)庫(kù)中key的數(shù)量(并不是所謂的大斜滓恰) |
expire key seconds | 為key指定過(guò)期時(shí)間,到期自動(dòng)刪除 |
ttl key | 查看key的剩余時(shí)間 |
select index | 選擇數(shù)據(jù)庫(kù)(默認(rèn)16個(gè)數(shù)據(jù)庫(kù)杖刷,index為0-15) |
move key index | 將key移動(dòng)到指定數(shù)據(jù)庫(kù) |
flushdb | 清空當(dāng)前數(shù)據(jù)庫(kù)key |
flushall | 清空所有數(shù)據(jù)庫(kù)key |
2.2 string的有關(guān)命令
命令 | 操作 |
---|---|
set key value | 設(shè)置key對(duì)應(yīng)的值為string類型的value |
mset key1 value1 [key2 value2...] | 一次設(shè)置多個(gè)key |
get key | 獲取指定key的value值 |
mget key1 [key2 ...] | 一次獲取多個(gè)key的value值 |
incr key | 對(duì)key的值做自增操作励饵,返回新的值 |
decr key | 對(duì)key的值做自減操作,返回新的值 |
incrby key integer | 對(duì)key的value加指定integer |
decrby key integer | 對(duì)key的value減指定integer |
append key value | 給指定key的字符串追加value |
substr key start end | 截取key滑燃,從start(包含)到end(包含)役听。注意只是返回截取的value,源value并沒(méi)改變 |
2.3 list的有關(guān)命令
命令 | 操作 |
---|---|
lpush key value1 [value2...] | 在key對(duì)應(yīng)的list的頭部(左端)添加元素 |
rpush key value1 [value2...] | 在key對(duì)應(yīng)的list的尾部(右端)添加元素 |
lpop key | 移除并返回key對(duì)應(yīng)的list的頭部(左端)元素 |
rpop key | 移除并返回key對(duì)應(yīng)的list的尾部(右端)元素 |
lindex key offset | 返回列表中偏移量為offset的元素 |
lrange key start end | 返回列表中從start偏移量到end偏移量中的元素,包含兩個(gè)端點(diǎn)元素(只返回典予,原list不變) |
ltrim key start end | 對(duì)列表進(jìn)行修剪甜滨,只保留從start偏移量到end偏移量的元素,包含兩個(gè)端點(diǎn) |
llen key | 返回對(duì)應(yīng)列表的長(zhǎng)度 |
此外瘤袖,list還包含一些阻塞式的命令以及在列表之間移動(dòng)元素的命令:
命令 | 操作 |
---|---|
blpop key1 [key2...] timeout | 從第一個(gè)非空列表中彈出位于頭部(左端)的元素衣摩,或者在timeout秒內(nèi)阻塞并等待可彈出元素的出現(xiàn) |
brpop key1 [key2...] timeout | 從第一個(gè)非空列表中彈出位于尾部(右端)的元素,或者在timeout秒內(nèi)阻塞并等待可彈出元素的出現(xiàn) |
rpoplpush source-key dest-key | 從source-key列表中彈出位于最右端的元素捂敌,然后把這個(gè)元素插入dest-key列表的最左端艾扮,并向用戶返回該元素 |
brpoplpush source-key dest-key timeout | 從source-key列表中彈出位于最右端的元素,然后把這個(gè)元素插入dest-key列表的最左端占婉,并向用戶返回該元素泡嘴。如果source-key為空,則在timeout秒內(nèi)阻塞并等待可彈出元素的出現(xiàn) |
2.4 set的有關(guān)命令
命令 | 操作 |
---|---|
sadd key value1 [value2...] | 將一個(gè)或多個(gè)元素添加到集合中逆济,并返回添加成功的元素的個(gè)數(shù) |
srem key value1 [value2...] | 從集合中移除一個(gè)或多個(gè)元素酌予,返回移除成功的元素的個(gè)數(shù) |
sismember key value | 檢查元素value是否在集合key中,存在返回1奖慌,不存在返回0 |
scard key | 返回集合包含的元素個(gè)數(shù) |
smembers key | 返回集合包含的全部元素 |
srandmember key [count] | 隨機(jī)返回集合中的一個(gè)或多個(gè)元素抛虫。當(dāng)count為正數(shù)時(shí),返回的元素不會(huì)重復(fù)简僧;當(dāng)count為負(fù)數(shù)時(shí)莱褒,返回的元素有可能會(huì)重復(fù) |
spop key | 隨機(jī)移除集合中的某個(gè)元素,被返回給用戶 |
smove source-key des-key value | 如果集合source-key中包含元素value涎劈,則移除它广凸,并添加到dest-key中;成功移除并添加則返回1蛛枚,否則返回0 |
處理多個(gè)集合的常用命令:
命令 | 操作 |
---|---|
sdiff key1 [key2...] | 返回所有集合的差集 |
sdiffstore dest-key key1 [key2...] | 將計(jì)算所得的差集中的元素添加到dest-key中 |
sinter key1 [key2...] | 返回所有集合的交集 |
sinterstore dest-key key1 [key2...] | 將計(jì)算所得的交集中的元素添加到dest-key中 |
sunion key1 [key2...] | 返回所有集合的并集 |
sunionstore dest-key key1 [key2...] | 將計(jì)算所得的并集中的元素添加到dest-key中 |
2.5 zset的有關(guān)命令
命令 | 操作 |
---|---|
zadd key score1 member1 [score2 member2 ... ] | 將帶有給定分值的成員你添加到有序集合中谅海。注意分值在前,成員在后 |
zrem key member1 [member2 ... ] | 從有序集合中刪除指定成員蹦浦,并返回成功刪除的元素個(gè)數(shù) |
zcard key | 返回有序集合包含的成員個(gè)數(shù) |
zincrby key increment member | 給指定成員的分值加上increment |
zcount key min max | 返回分值介于min和max之間的成員數(shù)量 |
zrank key memeber | 返回指定成員在有序集合中的排名扭吁,成員按照score從小到大排序 |
zrevrank key memeber | 返回指定成員在有序集合中的排名 ,成員按照score從大到小排序 |
zscore key member | 返回指定成員的分值 |
zrange key start stop [WITHSCORES] | 返回有序集合中排名介于start和stop之間的成員盲镶,如果給定了可選的 WITHSCORES選項(xiàng)侥袜,則連帶成員分值一并返回 |
zrevrange key start stop [WITHSCORES] | 同上,結(jié)果按score逆序 |
zrangebyscore key min max [WITHSCORES] | 返回分值介于min和max之間的成員 |
zremrangebyrank key start stop | 刪除集合中排名在start和stop之間的成員 |
zremrangebyscore key min max | 刪除集合中分值在min和max之間的成員 |
2.6 hash的有關(guān)命令
命令 | 操作 |
---|---|
hset key field value | 向散列key中添加一個(gè)鍵值對(duì) |
hget key field | 獲取散列key中的一個(gè)鍵的值 |
hmset key field1 value1 [field2 value2 ...] | 向散列key中添加一個(gè)或多個(gè)鍵值對(duì) |
hmget key field1 [field2 ... ] | 獲取散列key中的一個(gè)或多個(gè)鍵的值 |
hdel key field1 [field2 ... ] | 刪除散列中的一個(gè)或多個(gè)鍵值對(duì)溉贿,返回成功刪除的鍵值對(duì)數(shù)量 |
hlen key | 返回散列包含的鍵值對(duì)數(shù)量 |
hincrby key field integer | 給散列中指定field的值加上integer |
hexists key field | 測(cè)試指定field是否在散列中存在 |
hkeys key | 返回散列中所有field |
hvals key | 返回散列中所有value |
hgetall key | 返回散列中所有鍵值對(duì) |
2.7 其他命令
Redis還有許多其他的命令枫吧,如發(fā)布訂閱相關(guān)的命令,排序命令宇色,更完整的命令介紹可以查看Redis官網(wǎng)文檔或中文版地址九杂。
此外颁湖,Redis客戶端還提供了 command
命令,可以用來(lái)查看命令數(shù)組例隆。如:
特別推薦:Redis客戶端還提供了 help
命令甥捺,可以查看數(shù)據(jù)結(jié)構(gòu)的描述( help set
),查看某個(gè)命令的具體用法( help zadd
)镀层,以及通過(guò) help @group
語(yǔ)法來(lái)查看某個(gè)命令組( help @set
查看set所有命令)镰禾。如:
此外,Redis客戶端還提供了命令智能提示唱逢,可以提示用戶該命令的具體格式羡微,如,當(dāng)鍵入 zadd
時(shí)惶我,客戶端的智能提示如下:
單純的記憶命令是沒(méi)有意義的,應(yīng)該著重去學(xué)習(xí)Redis數(shù)據(jù)結(jié)構(gòu)的概念和含義博投,具體應(yīng)用的時(shí)候配合使用 help
命令以及官方文檔即可绸贡。而且Redis的命令基本都是自解釋的,基本從字面上就能夠了解到該命令的作用毅哗。習(xí)慣了之后甚至可以自己去猜測(cè)需要的命令听怕。
======返回目錄======