首頁  >  文章  >  資料庫  >  Redis 學習之 基本資料結構

Redis 學習之 基本資料結構

coldplay.xixi
coldplay.xixi轉載
2020-12-04 15:44:027944瀏覽

Redis使用教學欄位介紹其基礎資料結構

Redis 學習之 基本資料結構

#推薦(免費):redis使用教學

Redis基礎資料結構

Redis有5種基本資料結構:String(字串)、list(列表)、set(集合)、hash(哈希)、zset(有序集合)

字串string

字串型別是Redis的value最簡單的資料結構,類似與Java語言中的ArrayList(數字列表),不過在Redis裡String是一種動態字串

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

//批量设置
>mset key1 test1 key2 test2
OK

//批量获取
>mget key1 key2
1) test1
2) test2

key過期

//设置5s后过期
>expire keyname 5

//setex是expire和set的复合写法
>setex keyname 5 test
OK

//5s后查询
>get keyname
NULL

計數
ps:value為數字的情況,可以使用incr和incrby計數

>set num 10
OK

//incr默认加1
>incr num
11

//incrby后面要加上数字
>incrby num
ERR wrong number of arguments for 'incrby' command

//正确计数
>incrby num 5
16

列表list

下面介紹一下redis的另一個資料結構list
前面我們說redis裡的string類似與java語言裡面的ArrayList,則redis裡的列表就類似與LinkList(鍊錶),鍊錶一個特別就是更新和新增特別快,查詢索引慢。

為什麼說類似與linklist?因為redis的list並非和linklist一樣,它其實是一種快速列表(quicklist)的形式,列表結構如圖:

#[圖片上傳失敗. ..(image-625c1b-1537973556457)]

這裡要介紹一下壓縮列表(ziplist)了,壓縮列表是什麼?其實就是連續的記憶體空間

從圖可以看出快速列表其實就是由壓縮列表和雙向的指標組成,不過我們知道鍊錶是兩個指標的,也就是prev和next執行,這就是快速清單和linklist的一個不同點了。

PS:然後redis設計時,為什麼改成雙向指標?假如和鍊錶一樣,用兩個指標prev、next,同樣可以實現遍歷,不過雙向指標有一個很明顯的優點,就是佔用的記憶體空間就相對少了。

佇列與堆疊

/* 队列: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

字典hash

Redis的字典類似與java語言的hashmap,也是無序的二維結構,也即陣列加列表的結構。這是redis字典和hashmap類似的地。

然後也有不同,例如rehash,刷新字典操作,hashmap是全部熱hash,當字典足夠多時,性能不是很好的,所以redis進行改造,採用漸進式的方式,為什麼說是漸進式?因為redis不會全部reload,而是保存新舊兩個字典,然後採用定時任務,將舊hash的資料搬到新的hash,搬後在回收hash記憶體空間

字典(hash)的數組加上連結結構:
[圖片上傳失敗...(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

集合set

redis的set和java語言中的hashset類型,是一種無序唯一的

>sadd keynames key1
1

//key1已经加过了,所以返回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

有序集合zSet

有序集合是redis裡比較有特色的,它類似SortedSet和HashMap的組合。其內部實作是一種被稱為作跳躍列表的資料結構。有序集合一方面它就是一個set,所以每個元素都是唯一的,然後它可以給每個value賦值一個score,再根據這個score進行排序,score就等於一個權限排序的識別。

ps:因為這個原因,有序集合可以用來儲存粉絲訊息,value值是粉絲id,score是關注時間

//9.0是score也就是权重
>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

以上是Redis 學習之 基本資料結構的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:jianshu.com。如有侵權,請聯絡admin@php.cn刪除