redis數(shù)據(jù)結(jié)構(gòu) – strings
有人說伏穆,如果只使用redis中的字符串類型耻卡,且不使用redis的持久化功能屿脐,那么挺益,redis就和memcache非常非常的像了歉糜。這說明strings類型是一個很基礎(chǔ)的數(shù)據(jù)類型,也是任何存儲系統(tǒng)都必備的數(shù)據(jù)類型望众。
我們來看一個最簡單的例子:
setmystr"hello world!"http://設(shè)置字符串類型getmystr//讀取字符串類型
字符串類型的用法就是這么簡單匪补,因為是二進(jìn)制安全的伞辛,所以你完全可以把一個圖片文件的內(nèi)容作為字符串來存儲。
另外夯缺,我們還可以通過字符串類型進(jìn)行數(shù)值操作:
127.0.0.1:6379>setmynum"2"OK127.0.0.1:6379>getmynum"2"127.0.0.1:6379>incrmynum(integer) 3127.0.0.1:6379>getmynum"3"
看蚤氏,在遇到數(shù)值操作時,redis會將字符串類型轉(zhuǎn)換成數(shù)值踊兜。
redis數(shù)據(jù)結(jié)構(gòu) – lists
redis的另一個重要的數(shù)據(jù)結(jié)構(gòu)叫做lists竿滨,翻譯成中文叫做“列表”。
首先要明確一點捏境,redis中的lists在底層實現(xiàn)上并不是數(shù)組于游,而是鏈表,也就是說對于一個具有上百萬個元素的lists來說垫言,在頭部和尾部插入一個新元素贰剥,其時間復(fù)雜度是常數(shù)級別的,比如用LPUSH在10個元素的lists頭部插入新元素筷频,和在上千萬元素的lists頭部插入新元素的速度應(yīng)該是相同的蚌成。
雖然lists有這樣的優(yōu)勢,但同樣有其弊端凛捏,那就是笑陈,鏈表型lists的元素定位會比較慢,而數(shù)組型lists的元素定位就會快得多葵袭。
lists的常用操作包括LPUSH涵妥、RPUSH、LRANGE等坡锡。我們可以用LPUSH在lists的左側(cè)插入一個新元素蓬网,用RPUSH在lists的右側(cè)插入一個新元素,用LRANGE命令從lists中指定一個范圍來提取元素鹉勒。我們來看幾個例子:
//新建一個list叫做mylist帆锋,并在列表頭部插入元素"1"127.0.0.1:6379> lpush mylist"1"http://返回當(dāng)前mylist中的元素個數(shù)(integer)1//在mylist右側(cè)插入元素"2"127.0.0.1:6379> rpush mylist"2"(integer)2//在mylist左側(cè)插入元素"0"127.0.0.1:6379> lpush mylist"0"(integer)3//列出mylist中從編號0到編號1的元素127.0.0.1:6379>lrangemylist011)"0"2)"1"http://列出mylist中從編號0到倒數(shù)第一個元素127.0.0.1:6379>lrangemylist0-11)"0"2)"1"3)"2"
redis數(shù)據(jù)結(jié)構(gòu) – 集合
redis的集合,是一種無序的集合禽额,集合中的元素沒有先后順序锯厢。
集合相關(guān)的操作也很豐富,如添加新元素脯倒、刪除已有元素实辑、取交集、取并集藻丢、取差集等剪撬。我們來看例子:
//向集合myset中加入一個新元素"one"127.0.0.1:6379> sadd myset"one"(integer)1127.0.0.1:6379> sadd myset"two"(integer)1//列出集合myset中的所有元素127.0.0.1:6379> smembers myset1)"one"2)"two"http://判斷元素1是否在集合myset中,返回1表示存在127.0.0.1:6379> sismember myset"one"(integer)1//判斷元素3是否在集合myset中悠反,返回0表示不存在127.0.0.1:6379> sismember myset"three"(integer)0//新建一個新的集合yourset127.0.0.1:6379> sadd yourset"1"(integer)1127.0.0.1:6379> sadd yourset"2"(integer)1127.0.0.1:6379> smembers yourset1)"1"2)"2"http://對兩個集合求并集127.0.0.1:6379> sunion myset yourset1)"1"2)"one"3)"2"4)"two"
redis數(shù)據(jù)結(jié)構(gòu) – 有序集合
redis不但提供了無需集合(sets)残黑,還很體貼的提供了有序集合(sorted sets)馍佑。有序集合中的每個元素都關(guān)聯(lián)一個序號(score),這便是排序的依據(jù)梨水。
很多時候拭荤,我們都將redis中的有序集合叫做zsets,這是因為在redis中疫诽,有序集合相關(guān)的操作指令都是以z開頭的穷劈,比如zrange、zadd踊沸、zrevrange、zrangebyscore等等
//新增一個有序集合myzset社证,并加入一個元素baidu.com逼龟,給它賦予的序號是1:127.0.0.1:6379> zadd myzset1baidu.com(integer)1//向myzset中新增一個元素360.com,賦予它的序號是3127.0.0.1:6379> zadd myzset3360.com(integer)1//向myzset中新增一個元素google.com追葡,賦予它的序號是2127.0.0.1:6379> zadd myzset2google.com(integer)1//列出myzset的所有元素腺律,同時列出其序號,可以看出myzset已經(jīng)是有序的了宜肉。127.0.0.1:6379> zrange myzset0-1with scores1)"baidu.com"2)"1"3)"google.com"4)"2"5)"360.com"6)"3"http://只列出myzset的元素127.0.0.1:6379> zrange myzset0-11)"baidu.com"2)"google.com"3)"360.com"
redis數(shù)據(jù)結(jié)構(gòu) – 哈希
最后要給大家介紹的是hashes匀钧,即哈希。哈希是從redis-2.0.0版本之后才有的數(shù)據(jù)結(jié)構(gòu)谬返。
hashes存的是字符串和字符串值之間的映射之斯,比如一個用戶要存儲其全名、姓氏遣铝、年齡等等佑刷,就很適合使用哈希。
我們來看一個例子:
//建立哈希酿炸,并賦值127.0.0.1:6379> HMSETuser:001username antirez password P1pp0 age34OK//列出哈希的內(nèi)容127.0.0.1:6379> HGETALLuser:0011)"username"2)"antirez"3)"password"4)"P1pp0"5)"age"6)"34"http://更改哈希中的某一個值127.0.0.1:6379> HSETuser:001password12345(integer)0//再次列出哈希的內(nèi)容127.0.0.1:6379> HGETALLuser:0011)"username"2)"antirez"3)"password"4)"12345"5)"age"6)"34"