您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)Redis基本數(shù)據(jù)結(jié)構(gòu)是什么的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。
Redis有5種基本數(shù)據(jù)結(jié)構(gòu):String(字符串)、list(列表)、set(集合)、hash(哈希)、zset(有序集合)
字符串類型是Redis的value最簡單的數(shù)據(jù)結(jié)構(gòu),類似與Java語言中的ArrayList(數(shù)字列表),不過在Redis里String是一種動態(tài)字符串
Redis里的String采用預分配冗余空間的方法
[圖片上傳失敗...(image-724c60-1537973556456)]
set & get
>set keyname test OK >get keyname test //key如果存在就返回0 >setnx keyname test 0 >exists keyname >del keyname 1 //批量設(shè)置 >mset key1 test1 key2 test2 OK //批量獲取 >mget key1 key2 1) test1 2) test2
key過期
//設(shè)置5s后過期 >expire keyname 5 //setex是expire和set的復合寫法 >setex keyname 5 test OK //5s后查詢 >get keyname NULL
計數(shù)
ps:value為數(shù)字的情況,可以使用incr和incrby計數(shù)
>set num 10 OK //incr默認加1 >incr num 11 //incrby后面要加上數(shù)字 >incrby num ERR wrong number of arguments for 'incrby' command //正確計數(shù) >incrby num 5 16
下面介紹一下redis的另外一種數(shù)據(jù)結(jié)構(gòu)list
前面我們說redis里的string類似與java語言里面的ArrayList,則redis里的列表就類似與LinkList(鏈表),鏈表一個特別就是更新和新增特別快,查詢索引慢。
為什么說類似與linklist?因為redis的list并非和linklist一樣,它其實是一種快速列表(quicklist)的形式,列表結(jié)構(gòu)如圖:
[圖片上傳失敗...(image-625c1b-1537973556457)]
這里要介紹一下壓縮列表(ziplist)了,壓縮列表是什么?其實就是連續(xù)的內(nèi)存空間
從圖可以看出快速列表其實就是由壓縮列表和雙向的指針組成,不過我們知道鏈表是兩個指針的,也就是prev和next執(zhí)行,這就是快速列表和linklist的一個不同點了。
PS:然后redis設(shè)計時,為什么改成雙向指針?假如和鏈表一樣,用兩個指針prev、next,同樣可以實現(xiàn)遍歷,不過雙向指針有一個很明顯的優(yōu)點,就是占用的內(nèi)存空間就相對少了。
隊列和棧
/* 隊列:First in first out */ //加兩個value >rpush keynames key1 key2 2 //計算 >llen keynames 2 >lpop keynames key1 >lpop keynames key2 //rpush會自動過期的 >rpop keynames NULL /* 棧:First in last out */ //同樣,加兩個元素 >rpush keynames key1 key2 2 >rpop keynames key2 >rpop keynames key1
Redis的字典類似與java語言的hashmap,也是無序的二維結(jié)構(gòu),也即數(shù)組加列表的結(jié)構(gòu)。這是redis字典和hashmap類似的地。
然后也有不同,比如rehash,刷新字典操作,hashmap是全部熱hash,當字典足夠多時,性能不是很好的,所以redis進行改造,采用漸進式的方式,為什么說是漸進式?因為redis不會全部reload,而是保存新舊兩個字典,然后采用定時任務(wù),將舊hash的數(shù)據(jù)搬到新的hash,搬后在回收hash內(nèi)存空間
字典(hash)的數(shù)組加鏈接結(jié)構(gòu):
[圖片上傳失敗...(image-f5660f-1537973556457)]
>hset keynames key1 "test1" 1 >hset keynames key2 "test2" 1 //批量set >hmset keynames key1 "test1" key2 "test2" OK //獲取key1的值 >hget keynames key1 test1 //獲取hash為keynames的長度 >hlen keynames 2 //獲取全部 >hgetall keynames 1) key1 2) test1 3) key2 4) test2
redis的set和java語言中的hashset類型,是一種無序唯一的。
>sadd keynames key1 1 //key1已經(jīng)加過了,所以返回1 >sadd keynames key1 key2 1 >smembers keynames 1) key2 2) key1 //查詢某個key是否存在,相當與contains >sismember keynames key1 1 //相當于count >scard keynames 2 //隨意彈出key1 >spop keynames key1
有序集合是redis里比較有特色的,它類似于SortedSet和HashMap的組合。其內(nèi)部實現(xiàn)是一種被稱作跳躍列表的數(shù)據(jù)結(jié)構(gòu)。有序集合一方面它就是一個set,所以每個元素都是唯一的,然后它可以給每個value賦值一個score,再根據(jù)這個score進行排序,score就相當于一個權(quán)限排序的標識。
ps:因為這個原因,有序集合可以被用來存儲粉絲信息,value值是粉絲id,score是關(guān)注時間
//9.0是score也就是權(quán)重 >zadd keyname 9.0 math 1 >zadd keyname 9.2 history 1 //順序 >zrange keyname 0 -1 1) history 2) math //逆序 >zrevrange keyname 0 -1 1) math 2) history //相當于count() >zcard keyname 2 獲取指定key的score >zscore keyname math 9
跳躍列表 TODO
感謝各位的閱讀!關(guān)于Redis基本數(shù)據(jù)結(jié)構(gòu)是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。