溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Redis支持5種數(shù)據(jù)類型

發(fā)布時間:2020-05-28 10:19:50 來源:網(wǎng)絡(luò) 閱讀:1070 作者:DBAspace 欄目:數(shù)據(jù)庫

Redis目前支持5種數(shù)據(jù)類型,分別是

String(字符串)

List(列表)

Hash(字典)

Set(集合)

Sorted Set(有序集合)



Redis數(shù)據(jù)類型

1.字符串類型

SET key value                   設(shè)置key=value

GET key                         或者鍵key對應(yīng)的值

GETRANGE key start end          得到字符串的子字符串存放在一個鍵

GETSET key value                設(shè)置鍵的字符串值,并返回舊值

GETBIT key offset               返回存儲在鍵位值的字符串值的偏移

MGET key1 [key2..]              得到所有的給定鍵的值

SETBIT key offset value         設(shè)置或清除該位在存儲在鍵的字符串值偏移

SETEX key seconds value         鍵到期時設(shè)置值

SETNX key value                 設(shè)置鍵的值,只有當(dāng)該鍵不存在

SETRANGE key offset value       覆蓋字符串的一部分從指定鍵的偏移

STRLEN key                      得到存儲在鍵的值的長度

MSET key value [key value...]   設(shè)置多個鍵和多個值

MSETNX key value [key value...] 設(shè)置多個鍵多個值,只有在當(dāng)沒有按鍵的存在時

PSETEX key milliseconds value   設(shè)置鍵的毫秒值和到期時間

INCR key                        增加鍵的整數(shù)值一次

INCRBY key increment            由給定的數(shù)量遞增鍵的整數(shù)值

INCRBYFLOAT key increment       由給定的數(shù)量遞增鍵的浮點(diǎn)值

DECR key                        遞減鍵一次的整數(shù)值

DECRBY key decrement            由給定數(shù)目遞減鍵的整數(shù)值

APPEND key value                追加值到一個鍵



操作管理命令

DEL key                         如果存在刪除鍵

DUMP key                        返回存儲在指定鍵的值的序列化版本

EXISTS key                      此命令檢查該鍵是否存在

EXPIRE key seconds              指定鍵的過期時間

EXPIREAT key timestamp          指定的鍵過期時間。在這里,時間是在Unix時間戳格式

PEXPIRE key milliseconds        設(shè)置鍵以毫秒為單位到期

PEXPIREAT key milliseconds-timestamp        設(shè)置鍵在Unix時間戳指定為毫秒到期

KEYS pattern                    查找與指定模式匹配的所有鍵

MOVE key db                     移動鍵到另一個數(shù)據(jù)庫

PERSIST key                     移除過期的鍵

PTTL key                        以毫秒為單位獲取剩余時間的到期鍵。

TTL key                         獲取鍵到期的剩余時間。

RANDOMKEY                       從Redis返回隨機(jī)鍵

RENAME key newkey               更改鍵的名稱

RENAMENX key newkey             重命名鍵,如果新的鍵不存在

TYPE key                        返回存儲在鍵的數(shù)據(jù)類型的值。



操作使用示例

redis 127.0.0.1:6379> set baidu http://www.baidu

OK

redis 127.0.0.1:6379> append baidu .com

(integer) 20

redis 127.0.0.1:6379> get baidu

"http://www.baidu.com"

redis 127.0.0.1:6379> set visitors 0

OK

redis 127.0.0.1:6379> incr visitors

(integer) 1

redis 127.0.0.1:6379> incr visitors

(integer) 2

redis 127.0.0.1:6379> get visitors

"2"

redis 127.0.0.1:6379> incrby visitors 100

(integer) 102

redis 127.0.0.1:6379> get visitors

"102"

redis 127.0.0.1:6379> type baidu

string

redis 127.0.0.1:6379> type visitors

string

redis 127.0.0.1:6379> ttl baidu

(integer) -1

redis 127.0.0.1:6379> rename baidu baidu-site

OK

redis 127.0.0.1:6379> get baidu

(nil)

redis 127.0.0.1:6379> get baidu-site

"http://www.baidu.com"






2. List(列表)

Redis列表是簡單的字符串列表,可以類比到C++中的std::list,簡單的說就是一個鏈表或者說是一個隊列??梢詮念^部或尾部向Redis列表添加元素。列表的最大長度為2^32 - 1,也即每個列表支持超過40億個元素。


Redis list的實現(xiàn)為一個雙向鏈表,即可以支持反向查找和遍歷,更方便操作,不過帶來了部分額外的內(nèi)存開銷,Redis內(nèi)部的很多實現(xiàn),包括發(fā)送緩沖隊列等也都是用的這個數(shù)據(jù)結(jié)構(gòu)。


應(yīng)用場景

Redis list的應(yīng)用場景非常多,也是Redis最重要的數(shù)據(jù)結(jié)構(gòu)之一,比如twitter的關(guān)注列表、粉絲列表等都可以用Redis的list結(jié)構(gòu)來實現(xiàn),再比如有的應(yīng)用使用Redis的list類型實現(xiàn)一個簡單的輕量級消息隊列,生產(chǎn)者push,消費(fèi)者pop/bpop。


相關(guān)命令

BLPOP

BLPOP key1 [key2 ] timeout 取出并獲取列表中的第一個元素,或阻塞,直到有可用

BRPOP

BRPOP key1 [key2 ] timeout 取出并獲取列表中的最后一個元素,或阻塞,直到有可用

BRPOPLPUSH

BRPOPLPUSH source destination timeout 從列表中彈出一個值,它推到另一個列表并返回它;或阻塞,直到有可用

LINDEX

LINDEX key index 從一個列表其索引獲取對應(yīng)的元素

LINSERT

LINSERT key BEFORE|AFTER pivot value 在列表中的其他元素之后或之前插入一個元素

LLEN

LLEN key 獲取列表的長度

LPOP

LPOP key 獲取并取出列表中的第一個元素

LPUSH

LPUSH key value1 [value2] 在前面加上一個或多個值的列表

LPUSHX

LPUSHX key value 在前面加上一個值列表,僅當(dāng)列表中存在

LRANGE

LRANGE key start stop 從一個列表獲取各種元素

LREM

LREM key count value 從列表中刪除元素

LSET

LSET key index value 在列表中的索引設(shè)置一個元素的值

LTRIM

LTRIM key start stop 修剪列表到指定的范圍內(nèi)

RPOP

RPOP key 取出并獲取列表中的最后一個元素

RPOPLPUSH

RPOPLPUSH source destination 刪除最后一個元素的列表,將其附加到另一個列表并返回它

RPUSH

RPUSH key value1 [value2] 添加一個或多個值到列表

RPUSHX

RPUSHX key value 添加一個值列表,僅當(dāng)列表中存在



使用示例


redis 127.0.0.1:6379> lpush list1 redis

(integer) 1

redis 127.0.0.1:6379> lpush list1 hello

(integer) 2

redis 127.0.0.1:6379> rpush list1 world

(integer) 3

redis 127.0.0.1:6379> llen list1

(integer) 3

redis 127.0.0.1:6379> lrange list1 0 3

1) "hello"

2) "redis"

3) "world"

redis 127.0.0.1:6379> lpop list1

"hello"

redis 127.0.0.1:6379> rpop list1

"world"

redis 127.0.0.1:6379> lrange list1 0 3

1) "redis"




3. Hash(字典,哈希表)

類似C#中的dict類型或者C++中的hash_map類型。


Redis Hash對應(yīng)Value內(nèi)部實際就是一個HashMap,實際這里會有2種不同實現(xiàn),這個Hash的成員比較少時Redis為了節(jié)省內(nèi)存會采用類似一維數(shù)組的方式來緊湊存儲,而不會采用真正的HashMap結(jié)構(gòu),對應(yīng)的value redisObject的encoding為zipmap,當(dāng)成員數(shù)量增大時會自動轉(zhuǎn)成真正的HashMap,此時encoding為ht。


應(yīng)用場景

假設(shè)有多個用戶及對應(yīng)的用戶信息,可以用來存儲以用戶ID為key,將用戶信息序列化為比如json格式做為value進(jìn)行保存。






相關(guān)命令

HDEL

HDEL key field[field...] 刪除對象的一個或幾個屬性域,不存在的屬性將被忽略

HEXISTS

HEXISTS key field 查看對象是否存在該屬性域

HGET

HGET key field 獲取對象中該field屬性域的值

HGETALL

HGETALL key 獲取對象的所有屬性域和值

HINCRBY

HINCRBY key field value 將該對象中指定域的值增加給定的value,原子自增操作,只能是integer的屬性值可以使用

HINCRBYFLOAT

HINCRBYFLOAT key field increment 將該對象中指定域的值增加給定的浮點(diǎn)數(shù)

HKEYS

HKEYS key 獲取對象的所有屬性字段

HVALS

HVALS key 獲取對象的所有屬性值

HLEN

HLEN key 獲取對象的所有屬性字段的總數(shù)

HMGET

HMGET key field[field...] 獲取對象的一個或多個指定字段的值

HSET

HSET key field value 設(shè)置對象指定字段的值

HMSET

HMSET key field value [field value ...] 同時設(shè)置對象中一個或多個字段的值


HSETNX:HSETNX命令用于在存儲的關(guān)鍵值的散列設(shè)置字段,只有在字段不存在。

如果鍵不存在,新的key會被哈希創(chuàng)建。如果字段已經(jīng)存在,該操作沒有任何影響。

HSETNX key field value 只在對象不存在指定的字段時才設(shè)置字段的值

HSCAN

HSCAN key cursor [MATCH pattern] [COUNT count] 類似SCAN命令



使用示例

127.0.0.1:6379> hset person name jack

(integer) 1

127.0.0.1:6379> hset person age 20

(integer) 1

127.0.0.1:6379> hset person sex famale

(integer) 1

127.0.0.1:6379> hget person name 

"jack"

127.0.0.1:6379> hgetall person

1) "name"

2) "jack"

3) "age"

4) "20"

5) "sex"

6) "famale"

127.0.0.1:6379> hkeys person

1) "name"

2) "age"

3) "sex"

127.0.0.1:6379> hvals person

1) "jack"

2) "20"

3) "famale"




4、Set(集合)

可以理解為一堆值不重復(fù)的列表,類似數(shù)學(xué)領(lǐng)域中的集合概念,且Redis也提供了針對集合的求交集、并集、差集等操作。

set 的內(nèi)部實現(xiàn)是一個 value永遠(yuǎn)為null的HashMap,實際就是通過計算hash的方式來快速排重的,這也是set能提供判斷一個成員是否在集合內(nèi)的原因。


應(yīng)用場景

Redis set對外提供的功能與list類似是一個列表的功能,特殊之處在于set是可以自動排重的,當(dāng)你需要存儲一個列表數(shù)據(jù),又不希望出現(xiàn)重復(fù)數(shù)據(jù)時,set是一個很好的選擇,并且set提供了判斷某個成員是否在一個set集合內(nèi)的重要接口,這個也是list所不能提供的。


又或者在微博應(yīng)用中,每個用戶關(guān)注的人存在一個集合中,就很容易實現(xiàn)求兩個人的共同好友功能。


相關(guān)命令

SADD

SADD key member [member ...] 添加一個或者多個元素到集合(set)里

SACRD

SCARD key 獲取集合里面的元素數(shù)量

SDIFF

SDIFF key [key ...] 獲得隊列不存在的元素

SDIFFSTORE

SDIFFSTORE destination key [key ...] 獲得隊列不存在的元素,并存儲在一個關(guān)鍵的結(jié)果集

SINTER

SINTER key [key ...] 獲得兩個集合的交集

SINTERSTORE

SINTERSTORE destination key [key ...] 獲得兩個集合的交集,并存儲在一個集合中

SISMEMBER

SISMEMBER key member 確定一個給定的值是一個集合的成員

SMEMBERS

SMEMBERS key 獲取集合里面的所有key

SMOVE

SMOVE source destination member 移動集合里面的一個key到另一個集合

SPOP

SPOP key [count] 獲取并刪除一個集合里面的元素

SRANDMEMBER

SRANDMEMBER key [count] 從集合里面隨機(jī)獲取一個元素

SREM

SREM key member [member ...] 從集合里刪除一個或多個元素,不存在的元素會被忽略

SUNION

SUNION key [key ...] 添加多個set元素

SUNIONSTORE

SUNIONSTORE destination key [key ...] 合并set元素,并將結(jié)果存入新的set里面

SSCAN

SSCAN key cursor [MATCH pattern] [COUNT count] 迭代set里面的元素



使用示例

redis> SADD myset "Hello"

(integer) 1

redis> SADD myset "World"

(integer) 1

redis> SMEMBERS myset

1) "World"

2) "Hello"

redis> SADD myset "one"

(integer) 1

redis> SISMEMBER myset "one"

(integer) 1

redis> SISMEMBER myset "two"

(integer) 0




使用集合數(shù)據(jù)結(jié)構(gòu)的典型用例是朋友名單的實現(xiàn):

redis 127.0.0.1:6379> sadd friends:leto ghanima paul chani jessica

(integer) 4

redis 127.0.0.1:6379> sadd friends:duncan paul jessica alia

(integer) 3

redis 127.0.0.1:6379> sismember friends:leto jessica

(integer) 1   #不管一個用戶有多少個朋友,我們都能高效地(O(1)時間復(fù)雜度)識別出用戶X是不是用戶Y的朋友

redis 127.0.0.1:6379> sismember friends:leto vladimir

(integer) 0

redis 127.0.0.1:6379> sinter friends:leto friends:duncan    #我們可以查看兩個或更多的人是不是有共同的朋友

1) "paul"

2) "jessica"

redis 127.0.0.1:6379> sinterstore friends:leto_duncan friends:leto friends:duncan # 可以在一個新的關(guān)鍵字里存儲結(jié)果

(integer) 2


5. Sorted Set(有序集合)

Redis有序集合類似Redis集合,不同的是增加了一個功能,即集合是有序的。一個有序集合的每個成員帶有分?jǐn)?shù),用于進(jìn)行排序。


Redis有序集合添加、刪除和測試的時間復(fù)雜度均為O(1)(固定時間,無論里面包含的元素集合的數(shù)量)。列表的最大長度為2^32- 1元素(4294967295,超過40億每個元素的集合)。


Redis sorted set的內(nèi)部使用HashMap和跳躍表(SkipList)來保證數(shù)據(jù)的存儲和有序,HashMap里放的是成員到score的映射,而跳躍表里存放的是所有的成員,排序依據(jù)是HashMap里存的score,使用跳躍表的結(jié)構(gòu)可以獲得比較高的查找效率,并且在實現(xiàn)上比較簡單。


使用場景

Redis sorted set的使用場景與set類似,區(qū)別是set不是自動有序的,而sorted set可以通過用戶額外提供一個優(yōu)先級(score)的參數(shù)來為成員排序,并且是插入有序的,即自動排序。當(dāng)你需要一個有序的并且不重復(fù)的集合列表,那么可以選擇sorted set數(shù)據(jù)結(jié)構(gòu),比如twitter 的public timeline可以以發(fā)表時間作為score來存儲,這樣獲取時就是自動按時間排好序的。


又比如用戶的積分排行榜需求就可以通過有序集合實現(xiàn)。還有上面介紹的使用List實現(xiàn)輕量級的消息隊列,其實也可以通過Sorted Set實現(xiàn)有優(yōu)先級或按權(quán)重的隊列。


相關(guān)命令

ZADD

ZADD key score1 member1 [score2 member2] 添加一個或多個成員到有序集合,或者如果它已經(jīng)存在更新其分?jǐn)?shù)

ZCARD

ZCARD key 得到的有序集合成員的數(shù)量

ZCOUNT

ZCOUNT key min max 計算一個有序集合成員與給定值范圍內(nèi)的分?jǐn)?shù)

ZINCRBY

ZINCRBY key increment member 在有序集合增加成員的分?jǐn)?shù)

ZINTERSTORE

ZINTERSTORE destination numkeys key [key ...] 多重交叉排序集合,并存儲生成一個新的鍵有序集合。

ZLEXCOUNT

ZLEXCOUNT key min max 計算一個給定的字典范圍之間的有序集合成員的數(shù)量

ZRANGE

ZRANGE key start stop [WITHSCORES] 由索引返回一個成員范圍的有序集合(從低到高)

ZRANGEBYLEX

ZRANGEBYLEX key min max [LIMIT offset count]返回一個成員范圍的有序集合(由字典范圍)

ZRANGEBYSCORE

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 返回有序集key中,所有 score 值介于 min 和 max 之間(包括等于 min 或 max )的成員,有序集成員按 score 值遞增(從小到大)次序排列

ZRANK

ZRANK key member 確定成員的索引中有序集合

ZREM

ZREM key member [member ...] 從有序集合中刪除一個或多個成員,不存在的成員將被忽略

ZREMRANGEBYLEX

ZREMRANGEBYLEX key min max 刪除所有成員在給定的字典范圍之間的有序集合

ZREMRANGEBYRANK

ZREMRANGEBYRANK key start stop 在給定的索引之內(nèi)刪除所有成員的有序集合

ZREMRANGEBYSCORE

ZREMRANGEBYSCORE key min max 在給定的分?jǐn)?shù)之內(nèi)刪除所有成員的有序集合

ZREVRANGE

ZREVRANGE key start stop [WITHSCORES] 返回一個成員范圍的有序集合,通過索引,以分?jǐn)?shù)排序,從高分到低分

ZREVRANGEBYSCORE

ZREVRANGEBYSCORE key max min [WITHSCORES] 返回一個成員范圍的有序集合,以socre排序從高到低

ZREVRANK

ZREVRANK key member 確定一個有序集合成員的索引,以分?jǐn)?shù)排序,從高分到低分

ZSCORE

ZSCORE key member 獲取給定成員相關(guān)聯(lián)的分?jǐn)?shù)在一個有序集合

ZUNIONSTORE

ZUNIONSTORE destination numkeys key [key ...] 添加多個集排序,所得排序集合存儲在一個新的鍵

ZSCAN

ZSCAN key cursor [MATCH pattern] [COUNT count] 增量迭代排序元素集和相關(guān)的分?jǐn)?shù)



使用示例

redis 127.0.0.1:6379> zadd dbs 100 redis

(integer) 1

redis 127.0.0.1:6379> zadd dbs 98 memcached

(integer) 1

redis 127.0.0.1:6379> zadd dbs 99 mongodb

(integer) 1

redis 127.0.0.1:6379> zadd dbs 99 leveldb

(integer) 1

redis 127.0.0.1:6379> zcard dbs

(integer) 4

redis 127.0.0.1:6379> zcount dbs 10 99

(integer) 3

redis 127.0.0.1:6379> zrank dbs leveldb

(integer) 1

redis 127.0.0.1:6379> zrank dbs other

(nil)

redis 127.0.0.1:6379> zrangebyscore dbs 98 100

1) "memcached"

2) "leveldb"

3) "mongodb"

4) "redis"





向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI