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

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

Redis支持的數(shù)據(jù)類型要豐富得多已慢,常用的數(shù)據(jù)類型主要有五種:String曲聂、List、Hash佑惠、Set和Sorted Set句葵、bitMap厕鹃,hyperLoglog。Redis數(shù)據(jù)類型內(nèi)存結(jié)構(gòu)分析

List應(yīng)用場景:

String是最常用的一種數(shù)據(jù)類型乍丈,普通的key/value存儲都可以歸為此類剂碴。

常用命令:

(1)set 設(shè)置key對應(yīng)的值為String類型的value

(2)get? 獲取key對應(yīng)的值

(3)expire? 設(shè)置過期時(shí)間

(4)type? 查看值數(shù)據(jù)類型

(5)select 庫號? ?選擇查看指定的庫數(shù)據(jù)

命令說明:

setnx設(shè)置key對應(yīng)的值為String類型的value,如果key已經(jīng)存在則返回0

setex設(shè)置key對應(yīng)的值為String類型的value轻专,并設(shè)定有效期

setrange設(shè)置key對應(yīng)value的子字符串

getrange獲取key對應(yīng)value的子字符串

mset批量設(shè)置多個key的值忆矛,如果成功表示所有值都被設(shè)置,否則返回0表示沒有任何值被設(shè)置

msetnx同mset请垛,不存在就設(shè)置催训,不會覆蓋已有的key

getset設(shè)置key的值,并返回key舊的值

append給指定key的value追加字符串宗收,并返回新字符串的長度

strlen取指定key的value的長度

Hash類型

Hash是一個String類型的field和value之間的映射表漫拭,即redis的Hash數(shù)據(jù)類型的key(hash表名稱)對應(yīng)的value實(shí)際的內(nèi)部存儲結(jié)構(gòu)為一個HashMap,因此Hash特別適合存儲對象混稽。相對于把一個對象的每個屬性存儲為String類型采驻,將整個對象存儲在Hash類型中會占用更少內(nèi)存。


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Hash 數(shù)據(jù)類型內(nèi)部結(jié)構(gòu)示意圖

當(dāng)前HashMap的實(shí)現(xiàn)有兩種方式:當(dāng)HashMap的成員比較少時(shí)Redis為了節(jié)省內(nèi)存會采用類似一維數(shù)組的方式來緊湊存儲匈勋,而不會采用真正的HashMap結(jié)構(gòu)礼旅,這時(shí)對應(yīng)的value的redisObject的encoding為zipmap,當(dāng)成員數(shù)量增大時(shí)會自動轉(zhuǎn)成真正的HashMap,此時(shí)encoding為ht洽洁。

應(yīng)用場景

用一個對象來存儲用戶信息痘系,商品信息,訂單信息等等饿自。

List類型

Redis的List類型其實(shí)就是每一個元素都是String類型的雙向鏈表度帮。我們可以從鏈表的頭部和尾部添加或者刪除元素蒋畜。這樣的List既可以作為棧爵政,也可以作為隊(duì)列使用闭翩。

List數(shù)據(jù)結(jié)構(gòu)內(nèi)部示意圖

應(yīng)用場景

如好友列表居砖,粉絲列表间螟,消息隊(duì)列赞警,最新消息排行等验辞。

常用命令

(1)lpush——key對應(yīng)的list的頭部添加一個元素抄课。

(2)lrange——獲取key對應(yīng)的list的指定下標(biāo)范圍的元素唱星,-1表示獲取所有元素。

(3)lpop——從key對應(yīng)的list的尾部刪除一個元素跟磨,并返回該元素间聊。

Set類型

Redis 集合(Set類型)是一個無序的String類型數(shù)據(jù)的集合,類似List的一個列表抵拘,與List不同的是Set不能有重復(fù)的數(shù)據(jù)哎榴。實(shí)際上,Set的內(nèi)部是用HashMap實(shí)現(xiàn)的,Set只用了HashMap的key列來存儲對象尚蝌。我們來看看java中HashSet的源碼:

可見創(chuàng)建一個HashSet的時(shí)候?qū)嶋H上創(chuàng)建了一個HashMap迎变;Set中的元素,只是存放在了底層HashMap的key上飘言,底層HashMap的value列為空衣形,遍歷HashSet的時(shí)候從HashMap中取出keySet來遍歷。


Set底層結(jié)構(gòu)示意圖

應(yīng)用場景

集合有取交集姿鸿、并集谆吴、差集等操作,因此可以求共同好友苛预、共同興趣句狼、分類標(biāo)簽等。

常用命令

(1)sadd——key對應(yīng)的set中添加一個元素热某。

(2)smembers——獲取key對應(yīng)的set的所有元素腻菇。

(3)spop——隨機(jī)返回并刪除key對應(yīng)的set中的一個元素。

SortSet

SortSet顧名思義苫拍,是一個排好序的Set芜繁,它在Set的基礎(chǔ)上增加了一個順序?qū)傩詓core,這個屬性在添加修改元素時(shí)可以指定绒极,每次指定后骏令,SortSet會自動重新按新的值排序。sorted set的內(nèi)部使用HashMap和跳躍表(SkipList)來保證數(shù)據(jù)的存儲和有序垄提,HashMap里放的是成員到score的映射榔袋,而跳躍表里存放的是所有的成員,排序依據(jù)是HashMap里存的score铡俐。

應(yīng)用場景

如按時(shí)間排序的時(shí)間軸凰兑。

常用命令

(1)zadd?——在key對應(yīng)的zset中添加一個元素

(2)zrange——獲取key對應(yīng)的zset中指定范圍的元素,-1表示獲取所有元素

Redis常用命令

鍵值常用命令

keys/exits/del/expire/ttl/move/persist/randomkey/rename/type

服務(wù)器常用命令

ping/echo/select/quit/dbsize/info/config?get/flushdb/flushall


Redis分布式存儲的2種常見的方案:

1. 主從

2.cluster

Redis集群切片常見的方式:

1. 客戶端切片审丘,即在客戶端就通過key的hash值對應(yīng)到不同的服務(wù)器吏够。

2. 對數(shù)據(jù)根據(jù)key散列到不同的slot上,不同的slot對應(yīng)到不同服務(wù)器上滩报。



Redis自增實(shí)現(xiàn)計(jì)數(shù)

計(jì)數(shù)器是 Redis 的原子性自增操作可實(shí)現(xiàn)的最直觀的模式了锅知,它的想法相當(dāng)簡單:每當(dāng)某個操作發(fā)生時(shí),向 Redis 發(fā)送一個INCR命令脓钾。

比如在一個 web 應(yīng)用程序中售睹,如果想知道用戶在一年中每天的點(diǎn)擊量,那么只要將用戶 ID 以及相關(guān)的日期信息作為鍵可训,并在每次用戶點(diǎn)擊頁面時(shí)昌妹,執(zhí)行一次自增操作即可捶枢。

比如用戶名是peter,點(diǎn)擊時(shí)間是 2012 年 3 月 22 日飞崖,那么執(zhí)行命令I(lǐng)NCRpeter::2012.3.22烂叔。

可以用以下幾種方式擴(kuò)展這個簡單的模式:

可以通過組合使用INCREXPIRE,來達(dá)到只在規(guī)定的生存時(shí)間內(nèi)進(jìn)行計(jì)數(shù)(counting)的目的蚜厉。

客戶端可以通過使用GETSET命令原子性地獲取計(jì)數(shù)器的當(dāng)前值并將計(jì)數(shù)器清零长已,更多信息請參考GETSET命令。

使用其他自增/自減操作昼牛,比如DECRINCRBY术瓮,用戶可以通過執(zhí)行不同的操作增加或減少計(jì)數(shù)器的值,比如在游戲中的記分器就可能用到這些命令贰健。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胞四,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子伶椿,更是在濱河造成了極大的恐慌辜伟,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脊另,死亡現(xiàn)場離奇詭異导狡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)偎痛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門旱捧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人踩麦,你說我怎么就攤上這事枚赡。” “怎么了谓谦?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵贫橙,是天一觀的道長。 經(jīng)常有香客問我反粥,道長卢肃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任才顿,我火速辦了婚禮莫湘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘娜膘。我一直安慰自己,他們只是感情好优质,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布竣贪。 她就那樣靜靜地躺著军洼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪演怎。 梳的紋絲不亂的頭發(fā)上匕争,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機(jī)與錄音爷耀,去河邊找鬼甘桑。 笑死,一個胖子當(dāng)著我的面吹牛歹叮,可吹牛的內(nèi)容都是我干的跑杭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼咆耿,長吁一口氣:“原來是場噩夢啊……” “哼德谅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起萨螺,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤窄做,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后慰技,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椭盏,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年吻商,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掏颊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡手报,死狀恐怖蚯舱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掩蛤,我是刑警寧澤枉昏,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站揍鸟,受9級特大地震影響兄裂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阳藻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一晰奖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腥泥,春花似錦匾南、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽溯乒。三九已至,卻和暖如春豹爹,著一層夾襖步出監(jiān)牢的瞬間裆悄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工臂聋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留光稼,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓孩等,卻偏偏與公主長得像艾君,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瞎访,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容