??個人主頁:不斷前進的皮卡丘
??博客描述:夢想也許遙不可及,但重要的是追夢的過程,用博客記錄自己的成長,記錄自己一步一步向上攀登的印記
??個人專欄:微服務(wù)專欄
??redis常見的操作命令:http://www.redis.cn/commands.html
Redis鍵(key)
命令 | 功能 |
---|---|
keys * | 查看當(dāng)前庫的所有key |
exists key | 判斷某個key是否存在 |
type key | 查看某個key的數(shù)據(jù)類型 |
del key | 刪除指定key |
unlink key | 根據(jù)value選擇非阻塞刪除,僅僅把key從keyspace元數(shù)據(jù)中刪除,真正的刪除會在后續(xù)異步操作,也就是把刪除操作放到其他線程中進行 |
expire key 10 | 為key設(shè)置過期時間為10秒鐘 |
ttl key | 查看key還有多少秒過期,-1表示永遠不過期,-2表示已經(jīng)過期 |
select | 切換數(shù)據(jù)庫 |
dbsize | 查看當(dāng)前數(shù)據(jù)庫的key的數(shù)量 |
flushdb | 清空當(dāng)前數(shù)據(jù)庫數(shù)據(jù) |
flushall | 清除所有數(shù)據(jù)庫數(shù)據(jù) |
string類型
基本介紹
-
String是Redis最基本的類型,一個key對應(yīng)一個value。
-
String類型是二進制安全的。意味著Redis的string可以包含任何數(shù)據(jù)。比如jpg圖片或者序列化的對象。
-
String類型是Redis最基本的數(shù)據(jù)類型,一個Redis中字符串value最多可以是512M
-
-
-
常用操作命令
命令 | 說明 |
---|---|
set | 設(shè)置一個key/value |
get | 根據(jù)key獲得對應(yīng)的value |
mset | 一次設(shè)置多個key value |
mget | 一次獲得多個key的value |
getset | 獲得原始key的值,同時設(shè)置新值 |
strlen | 獲得對應(yīng)key存儲value的長度 |
append | 為對應(yīng)key的value追加內(nèi)容 |
getrange 索引0開始 | 截取value的內(nèi)容 |
setex | 設(shè)置一個key存活的有效期(秒) |
psetex | 設(shè)置一個key存活的有效期(毫秒) |
setnx | 存在不做任何操作,不存在添加 |
msetnx原子操作(只要有一個存在不做任何操作) | 可以同時設(shè)置多個key,只有有一個存在都不保存 |
decr | 進行數(shù)值類型的-1操作 |
decrby | 根據(jù)提供的數(shù)據(jù)進行減法操作 |
Incr | 進行數(shù)值類型的+1操作 |
incrby | 根據(jù)提供的數(shù)據(jù)進行加法操作 |
Incrbyfloat | 根據(jù)提供的數(shù)據(jù)加入浮點數(shù) |
數(shù)據(jù)結(jié)構(gòu)
- String的數(shù)據(jù)結(jié)構(gòu)為簡單動態(tài)字符串(Simple Dynamic String,縮寫SDS)。是可以修改的字符串,內(nèi)部結(jié)構(gòu)實現(xiàn)上類似于Java的ArrayList,采用預(yù)分配冗余空間的方式來減少內(nèi)存的頻繁分配.
- 如圖中所示,內(nèi)部為當(dāng)前字符串實際分配的空間capacity一般要高于實際字符串長度len。當(dāng)字符串長度小于1M時,擴容都是加倍現(xiàn)有的空間,如果超過1M,擴容時一次只會多擴1M的空間。需要注意的是字符串最大長度為512M。
list類型
基本介紹
- 數(shù)據(jù)存儲要求:存儲多個數(shù)據(jù),并且對數(shù)據(jù)進入存儲空間的順序進行區(qū)分
- 數(shù)據(jù)的存儲結(jié)構(gòu):一個存儲空間保持多個數(shù)據(jù),而且通過數(shù)據(jù)可以體系進入的順序
- list數(shù)據(jù)類型:保存多個數(shù)據(jù),底層使用的是雙向鏈表存儲結(jié)構(gòu)實現(xiàn)
常用操作命令
命令 | 說明 |
---|---|
lpush | 將某個值加入到一個key列表頭部 |
lpushx | 同lpush,但是必須要保證這個key存在 |
rpush | 將某個值加入到一個key列表末尾 |
rpushx | 同rpush,但是必須要保證這個key存在 |
lpop | 返回和移除列表左邊的第一個元素 |
rpop | 返回和移除列表右邊的第一個元素 |
lrange | 獲取某一個下標(biāo)區(qū)間內(nèi)的元素 |
llen | 獲取列表元素個數(shù) |
lset | 設(shè)置某一個指定索引的值(索引必須存在) |
lindex | 獲取某一個指定索引位置的元素 |
lrem | 刪除重復(fù)元素 |
ltrim | 保留列表中特定區(qū)間內(nèi)的元素 |
linsert | 在某一個元素之前,之后插入新元素 |
數(shù)據(jù)結(jié)構(gòu)
-
Redis快速表、壓縮表和雙向鏈表(重點介紹quicklist)
-
List的數(shù)據(jù)結(jié)構(gòu)為快速鏈表quickList。
-
首先在列表元素較少的情況下會使用一塊連續(xù)的內(nèi)存存儲,這個結(jié)構(gòu)是ziplist,也即是壓縮列表。
-
它將所有的元素緊挨著一起存儲,分配的是一塊連續(xù)的內(nèi)存。
當(dāng)數(shù)據(jù)量比較多的時候才會改成quicklist。
因為普通的鏈表需要的附加指針空間太大,會比較浪費空間。比如這個列表里存的只是int類型的數(shù)據(jù),結(jié)構(gòu)上還需要兩個額外的指針prev和next。 -
Redis將鏈表和ziplist結(jié)合起來組成了quicklist。也就是將多個ziplist使用雙向指針串起來使用。這樣既滿足了快速的插入刪除性能,又不會出現(xiàn)太大的空間冗余。
set類型
基本介紹
- 新需求:存儲大量數(shù)據(jù),并且查詢效率要更高
- 需要的存儲結(jié)構(gòu):能存儲大量數(shù)據(jù),并且要有高效的內(nèi)部存儲機制,方便查詢
- set類型:和hash存儲結(jié)構(gòu)完全一樣,但是僅僅存儲鍵,不存儲值,并且值不允許重復(fù)
- Redis的Set是string類型的無序集合。它底層其實是一個value為null的hash表,所以添加,刪除,查找的復(fù)雜度都是O(1)。
- set:無序,不可重復(fù)
常用命令
命令 | 說明 |
---|---|
sadd | 為集合添加元素 |
smembers | 顯示集合中所有元素 無序 |
scard | 返回集合中元素的個數(shù) |
spop | 隨機返回一個元素 并將元素在集合中刪除 |
smove | 從一個集合中向另一個集合移動元素 必須是同一種類型 |
srem | 從集合中刪除一個元素 |
sismember | 判斷一個集合中是否含有這個元素 |
srandmember | 隨機返回元素 |
sdiff | 去掉第一個集合中其它集合含有的相同元素 |
sinter | 求交集 |
sunion | 求和集 |
數(shù)據(jù)結(jié)構(gòu)
Set數(shù)據(jù)結(jié)構(gòu)是dict字典,字典是用哈希表實現(xiàn)的。
Java中HashSet的內(nèi)部實現(xiàn)使用的是HashMap,只不過所有的value都指向同一個對象。Redis的set結(jié)構(gòu)也是一樣,它的內(nèi)部也使用hash結(jié)構(gòu),所有的value都指向同一個內(nèi)部值。
hash
基本介紹
-
Redis hash 是一個鍵值對集合。
-
Redis hash是一個string類型的field和value的映射表,hash特別適合用于存儲對象。
類似Java里面的Map<String,Object> -
常用命令
命令 | 說明 |
---|---|
hset key field1 value1 field2 value2 | 添加/修改數(shù)據(jù) |
hget key field1 field2 | 獲得多個數(shù)據(jù) |
hgetall key | 獲得所有的數(shù)據(jù) |
hdel key field1 field2 | 刪除數(shù)據(jù) |
hexists key field | 獲取哈希表中是否存在的字段 |
hlen key | 獲取哈希表中字段的數(shù)量 |
hkeys key | 獲得所有的key |
hvals key | 獲得所有的value |
hmset key field1 value1 field2 value2 | 添加/修改多個數(shù)據(jù) |
hmget key field1 field2 | 獲得多個數(shù)據(jù) |
hsetnx key field value | 設(shè)置一個不存在的key的值 |
hincrby key field increment | 為value進行加法運算 |
hincrbyfloat key field increment | 為value加入浮點值 |
注意事項
-
hash類型下的value只能存儲字符串,不允許存儲其他數(shù)據(jù)類型,不存在嵌套現(xiàn)象。如果數(shù)據(jù)未獲取到,對應(yīng)的值為(nil)
-
每個 hash 可以存儲 2^32 - 1 個鍵值對
-
hash類型十分貼近對象的數(shù)據(jù)存儲形式,并且可以靈活添加刪除對象屬性。但hash設(shè)計初衷不是為了存儲大量對象而設(shè)計的,切記不可濫用,更不可以將hash作為對象列表使用
-
hgetall 操作可以獲取全部屬性,如果內(nèi)部field過多,遍歷整體數(shù)據(jù)效率就很會低,有可能成為數(shù)據(jù)訪問瓶頸
數(shù)據(jù)結(jié)構(gòu)
Hash類型對應(yīng)的數(shù)據(jù)結(jié)構(gòu)是兩種:ziplist(壓縮列表),hashtable(哈希表)。當(dāng)field-value長度較短且個數(shù)較少時,使用ziplist,否則使用hashtable。
Redis有序集合Zset(sorted set)
基本介紹
- 元素不重復(fù)
- 有序集合的每個成員都關(guān)聯(lián)了一個評分(score),這個評分(score)被用來按照從最低分到最高分的方式排序集合中的成員。集合的成員是唯一的,但是評分可以是重復(fù)了 。
- 元素是有序的, 所以可以很快的根據(jù)評分(score)或者次序(position)來獲取一個范圍的元素。
基本操作
功能 | 命令 |
---|---|
添加數(shù)據(jù) | zadd key score1 member1 [score2 member2] |
獲取全部數(shù)據(jù) | zrange key start stop[withscores] |
獲取全部數(shù)據(jù) | zrevrange key start sto[withscores] |
刪除數(shù)據(jù) | zrem key member [member…] |
按照條件獲取數(shù)據(jù) | zrangebyscore key min max[withscores][limit] limt用來分頁 |
按照條件獲取數(shù)據(jù) | zrevrangebyscore key max min[withscores] |
按照條件刪除數(shù)據(jù) | zremrangebyrank key start stop |
按照條件刪除數(shù)據(jù) | zremrangebyscore key min max |
獲取集合數(shù)據(jù)總量 | zcard key |
獲取集合數(shù)據(jù)總量 | zcount key min max |
集合交操作 | zinterstore destination numkeys key[key…] |
集合并操作 | zunionstore destination numkeys key[key…] |
zset類型數(shù)據(jù)的擴展操作
在生活中,其實排序是很常見的,比如好友親密度,投票之類的都需要進行排序,我們需要為所有參加排名的資源來建立排序依據(jù)
功能 | 命令 |
---|---|
獲取數(shù)據(jù)對應(yīng)的索引(排名) | zrank key member |
獲取數(shù)據(jù)對應(yīng)的索引(排名) | zrevrank key member |
score值獲取 | zscore key member |
score值修改 | zincrby key increment member |
注意事項
- score保存的數(shù)據(jù)存儲空間是64位,如果是整數(shù)范圍是-9007199254740992~9007199254740992
- score保存的數(shù)據(jù)也可以是一個雙精度的double值,基于雙精度浮點數(shù)的特征,可能會丟失精度,使用時候要慎重
- sorted_set 底層存儲還是基于set結(jié)構(gòu)的,因此數(shù)據(jù)不能重復(fù),如果重復(fù)添加相同的數(shù)據(jù),score值將被反復(fù)覆蓋,保留最后一次修改的結(jié)果
跳表數(shù)據(jù)結(jié)構(gòu)
SortedSet(zset)是Redis提供的一個非常特別的數(shù)據(jù)結(jié)構(gòu),一方面它等價于Java的數(shù)據(jù)結(jié)構(gòu)Map<String, Double>,可以給每一個元素value賦予一個權(quán)重score,另一方面它又類似于TreeSet,內(nèi)部的元素會按照權(quán)重score進行排序,可以得到每個元素的名次,還可以通過score的范圍來獲取元素的列表。
zset底層使用了兩個數(shù)據(jù)結(jié)構(gòu)
(1)hash,hash的作用就是關(guān)聯(lián)元素value和權(quán)重score,保障元素value的唯一性,可以通過元素value找到相應(yīng)的score值。
(2)跳躍表,跳躍表的目的在于給元素value排序,根據(jù)score的范圍獲取元素列表。文章來源:http://www.zghlxwxcb.cn/news/detail-402548.html
Redis源碼之跳表數(shù)據(jù)結(jié)構(gòu)文章來源地址http://www.zghlxwxcb.cn/news/detail-402548.html
到了這里,關(guān)于猿創(chuàng)征文| redis基本數(shù)據(jù)類型的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!