1拾因、Redis的五種數(shù)據(jù)結(jié)構(gòu)

Redis的五種數(shù)據(jù)結(jié)構(gòu)如下:

  1. String:字符串
  2. Hash:字典
  3. List:列表
  4. Set:集合
  5. Sorted Set:有序集合

下面分別從 原理、redis命令、JedisAPI三個(gè)方面簡(jiǎn)述這五種數(shù)據(jù)結(jié)構(gòu)

一绢记、字符串

Redis使用C語(yǔ)言編寫(xiě)扁达,但是Redis的字符串并沒(méi)有直接使用C語(yǔ)言傳統(tǒng)的字符串,而是自己構(gòu)建了一種名為簡(jiǎn)單動(dòng)態(tài)字符串的抽象類(lèi)型SDS蠢熄,其本質(zhì)是個(gè) byte 數(shù)組,可以包含任何數(shù)據(jù)跪解,是二進(jìn)制安全的。

SDS與C字符串的區(qū)別如下:

  1. 常數(shù)復(fù)雜度獲取字符串長(zhǎng)度签孔,因?yàn)镾DS在len屬性中記錄了字符串本身的長(zhǎng)度叉讥。
  1. 杜絕緩沖區(qū)溢出,SDS在執(zhí)行拼接操作的時(shí)候饥追,會(huì)預(yù)先分配好空間图仓。
  2. 減少修改字符串時(shí)帶來(lái)的內(nèi)存重分配次數(shù)
  3. SDS是二進(jìn)制安全的,因?yàn)槠鋬?nèi)部就是存儲(chǔ)一系列二進(jìn)制數(shù)據(jù)
  4. 兼容部分C字符串函數(shù)

Redis字符串的操作命令和對(duì)應(yīng)的api如下:

  1. set [key] [value]
    JedisAPI:public String set(final String key, final String value)
    功能:設(shè)置值
  2. setnx [key] [value]
    JedisAPI:public Long setnx(final String key, final String value)
    功能:如果key存在但绕,返回0并不生效修改
  3. setex [key] [time] [value]
    JedisAPI:public String setex(final String key, final int seconds, final String value)
    功能:指定有效期為time秒
  4. setrange [key] n [string]
    JedisAPI:public Long setrange(final String key, final long offset, final String value)
    功能:將key對(duì)應(yīng)value第n位后面的字符替換成string
  5. mset [key1] [value1] [key2] [value2] ……
    JedisAPI:public Long setnx(final String key, final String value)
    功能:無(wú)
  6. msetnx
    JedisAPI:無(wú)
    功能:類(lèi)似setnx救崔,設(shè)置多個(gè)值,捏顺,如果key存在六孵,則返回0且修改不生效
  7. get [key]
    JedisAPI:public String get(final String key)
    功能:獲取key對(duì)應(yīng)的值
  8. getset [key] [value]
    JedisAPI:public String getSet(final String key, final String value)
    功能:設(shè)置key的值,并返回key的舊值
  9. getrange [key] n1 n2
    JedisAPI:public String getrange(final String key, final long startOffset, final long endOffset)
    功能:獲取key對(duì)應(yīng)值的索引位置從n1到n2的字符串
  10. mget [key1] [key2] [key3]……
    JedisAPI:無(wú)
    功能:一次獲取多個(gè)key對(duì)應(yīng)的值幅骄,如果不存在劫窒,則返回nil
  11. incr [key]
    JedisAPI:public Long incr(final String key)
    功能:對(duì)key的值作加1操作,如果incr一個(gè)不存在的值,則對(duì)q賦值為1拆座,如果key對(duì)應(yīng)值不是int型則返回錯(cuò)誤: -ERR value is not an integer or out of range
  12. incrby [key] [num]
    JedisAPI:public Long incrBy(final String key, final long integer)
    功能:加指定值 ,key 不存在時(shí)候會(huì)設(shè)置 key,并認(rèn)為原來(lái)的 value 是 0
  13. decr [key]
    JedisAPI:public Long decr(final String key)
    功能:對(duì)key的值做的是減1操作,decr 一個(gè)不存在 key,則設(shè)置 key 為-1
  14. decrby [key] [num]
    JedisAPI:public Long decrBy(final String key, final long integer)
    功能: 對(duì)key對(duì)應(yīng)的value減去num
  15. append [key] [string]
    JedisAPI:public Long append(final String key, final String value)
    功能:將string追加到key對(duì)應(yīng)的值尾烛亦,返回新字符串的長(zhǎng)度
  16. strlen [key]
    JedisAPI:public Long strlen(final String key)
    功能:讀取key對(duì)應(yīng)value的長(zhǎng)度

二、字典

Redis使用哈希表作為字典的底層實(shí)現(xiàn)懂拾,每個(gè)字典都有兩個(gè)哈希表,一個(gè)平時(shí)使用铐达,另一個(gè)僅在進(jìn)行rehash時(shí)使用

哈希表使用鏈表來(lái)解決鍵沖突問(wèn)題岖赋,被分配到同一個(gè)索引上的多個(gè)鍵值對(duì)會(huì)連接成一個(gè)單向鏈表

Redis字典的操作命令和對(duì)應(yīng)的api如下:

  1. hset [object] [field] [value]
    JedisAPI:public Long hset(final String key, final String field, final String value)
    功能:給object添加屬性
  2. hsetnx
    JedisAPI:public Long hsetnx(final String key, final String field, final String value)
    功能:類(lèi)似hset,如果field已存在,則返回0且修改不生效
  3. hmset [object] [field1] [value1] [field2] [value2]……
    JedisAPI:public String hmset(final String key, final Map<String, String> hash)
    功能:同時(shí)設(shè)置多個(gè)值
  4. hget [object] [field]
    JedisAPI:public String hget(final String key, final String field)
    功能:獲取對(duì)象對(duì)應(yīng)屬性的值
  5. hmget [object] [field1] [field2]
    JedisAPI:public List<String> hmget(final String key, final String... fields)
    功能:獲取多個(gè)值
  6. hincrby [object] [field]
    JedisAPI:public Long hincrBy(final String key, final String field, final long value)
    功能:num 給field對(duì)應(yīng)值 + num
  7. hexists [object] [field]
    JedisAPI:public Boolean hexists(final String key, final String field)
    功能:判斷特定對(duì)象指定fiels是否存在
  8. hlen [object]
    JedisAPI: public Long hlen(final String key)
    功能:返回對(duì)象屬性數(shù)量
  9. hdel [object] [field]
    JedisAPI:public Long hdel(final String key, final String... field)
    功能:刪除object對(duì)應(yīng)field
  10. hkeys [object]
    JedisAPI:public Set<String> hkeys(final String key)
    功能:返回對(duì)象所有field
  11. hvals [object]
    JedisAPI:public List<String> hvals(final String key)
    功能:返回對(duì)象所有field對(duì)應(yīng)的value
  12. hgetall [object]
    JedisAPI:public Map<String, String> hgetAll(final String key)
    功能:返回對(duì)象所有field和value

三瓮孙、列表

Redis構(gòu)建了自己的鏈表的實(shí)現(xiàn)唐断,其特性如下:

  1. 雙端:鏈表節(jié)點(diǎn)提供有prev和next對(duì)象,獲取某個(gè)節(jié)點(diǎn)的前置節(jié)點(diǎn)和下一個(gè)節(jié)點(diǎn)的速度為O(1).
  1. 無(wú)環(huán):表頭節(jié)點(diǎn)prev對(duì)象和表尾節(jié)點(diǎn)next對(duì)象都指向NULL,鏈表的訪問(wèn)都是以NULL訪問(wèn)為終點(diǎn).
  2. 帶有表頭和表尾對(duì)象:通過(guò)list結(jié)構(gòu)的head和tail,獲取表頭和表尾對(duì)象的速度為O(1).
  3. 帶有長(zhǎng)度計(jì)數(shù)器:獲取鏈表長(zhǎng)度的直接讀取len字段值.速度為O(1).
  4. 多態(tài):通過(guò)dup杭抠、free脸甘、match三個(gè)方法,實(shí)現(xiàn)鏈表的多態(tài),保存不同類(lèi)型的值

Redis列表的操作命令和對(duì)應(yīng)的api如下:

  1. lpush/rpush [list] [value]
    JedisAPI:public Long lpush/rpush(final String key, final String... string)
    功能:從頭/尾部向list添加值,返回list長(zhǎng)度
  2. lrange [list] start end
    JedisAPI:public List<String> lrange(final String key, final long start, final long end)
    功能:返回list對(duì)應(yīng)索引區(qū)間的值
  3. linsert [list] [before/after] 'value1' 'value2'
    JedisAPI:public Long linsert(final String key, final LIST_POSITION where, final String pivot, final String value)
    功能:在list的value1的前面/后面插入value2
  4. lset [list] index ‘value’
    JedisAPI:public String lset(final String key, final long index, final String value)
    功能:在特定索引插入value偏灿,注意:如果index為負(fù)值丹诀,則從list尾部開(kāi)始算起
  5. lrem [list] num 'value'
    JedisAPI:public Long lrem(final String key, final long count, final String value)
    功能:從list中刪除num個(gè)和value相同的值,若num>0,則從鏈頭算起铆遭,若<0則從鏈尾算起硝桩,若=0則刪除全部
  6. ltrim [list] start end
    JedisAPI:public String ltrim(final String key, final long start, final long end)
    功能:僅保留list中索引從start到end的值
  7. lpop [list]
    JedisAPI:public String lpop(final String key)
    功能:從頭部刪除元素,同時(shí)返回該元素
  8. rpop [list]
    JedisAPI:public String rpop(final String key)
    功能:從尾部刪除元素并返回
  9. rpoplpush [list1] [list2]
    JedisAPI:無(wú)
    功能:從list1的尾部移除元素并添加到list2的頭部,最后返回被移除的元素值,整個(gè)操作是原子的.如果list1是空或者不存在返回 nil
  10. lindex [list]
    JedisAPI:public String lindex(final String key, final long index)
    功能:index 返回list中index索引位置的元素
  11. llen [list]
    JedisAPI:public Long llen(final String key)
    功能:返回list的長(zhǎng)度

四枚荣、集合

Redis 集合是 string 類(lèi)型的無(wú)序集合碗脊。set 元素最大可以包含(2 的 32 次方)個(gè)元素。set 是通過(guò) hash table 實(shí)現(xiàn)的橄妆,hash table 會(huì)隨著添加或者刪除自動(dòng)的調(diào)整大小衙伶。調(diào)整 hash table 大小時(shí)候需要同步(獲取寫(xiě)鎖)會(huì)阻塞其他讀寫(xiě)操作。

Redis集合的操作命令和對(duì)應(yīng)的api如下:

  1. smembers [set]
    JedisAPI:public Set<String> smembers(final String key)
    功能:查看set中的元素
  2. sadd [set] [value]
    JedisAPI:public Long sadd(final String key, final String... member)
    功能:向set中插入value害碾,成功插入返回1矢劲,插入set中已有的value則失敗且返回0
  3. srem [set] [value]
    JedisAPI:刪除set中對(duì)應(yīng)的value,刪除成功返回1,若不存在則返回0
    功能:public Long srem(final String key, final String... member)
  4. spop [set]
    JedisAPI:public String spop(final String key)
    功能:隨機(jī)刪除并返回set中的元素
  5. sdiff [set1] [set2]
    JedisAPI:無(wú)
    功能:刪除set1中在set2里也存在的元素蛮原,返回刪除操作后的set1
  6. sdiffstore [set1] [set2] [set3]
    JedisAPI:無(wú)
    功能:將sdiff [set2] [set3] 的結(jié)果保存在set1中
  7. sinter [set1] [set2]
    JedisAPI:無(wú)
    功能:返回set1 set2共有元素
  8. sinterstore [set1] [set2] [set3]
    JedisAPI:無(wú)
    功能:將sinter [set2] [set3] 結(jié)果保存在set1中
  9. sunion [set1] [set2]
    JedisAPI:無(wú)
    功能:返回[set1] [set2]的并集
  10. sunionstore [set1] [set2] [set3]
    JedisAPI:無(wú)
    功能:將[set2] [set3]的并集保存在[set1]中
  11. smove [set1] [set2] [value]
    JedisAPI:無(wú)
    功能:將[set1] 的value移動(dòng)到set2中卧须,若value存在于set1,無(wú)論set2是否已存在儒陨,都(成功)返回1,不存在于set1則(失敾ㄋ弧)返回0
  12. scard [set]
    JedisAPI:public Long scard(final String key)
    功能:返回set中的元素個(gè)數(shù)
  13. sismember [set] [value]
    JedisAPI:public Boolean sismember(final String key, final String member)
    功能:判斷value是否為set中的元素,是則返回1蹦漠,否則返回0
  14. srandmember [set]
    JedisAPI:public String srandmember(final String key)
    功能: 隨機(jī)返回set中的一個(gè)元素

五椭员、有序集合

有序集合(sorted set) 在set的基礎(chǔ)上增加了一個(gè)標(biāo)識(shí)屬性,它可以在set添加或修改元素時(shí)指定笛园,每次指定隘击,set會(huì)自動(dòng)按標(biāo)識(shí)調(diào)整順序,set的每一個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)double類(lèi)型的score研铆。使用時(shí)往往我們把要排序的字段作為score存儲(chǔ)埋同,對(duì)象id則作為元素存儲(chǔ)

Redis有序集合的操作命令和對(duì)應(yīng)的api如下:

  1. zadd [zset] sco 'value'
    JedisAPI:public Long zadd(final String key, final double score, final String member)
    功能:向zset中添加score為sco的value,如果value已存在,則僅修改score,同時(shí)返回0棵红,否則返回1
  2. zrange/zrangebyscore [zset] start end (wisthscores)
    JedisAPI:public Set<String> zrange(final String key, final long start, final long end)
    功能:返回zset中從索引start到end的元素凶赁,withscores可選是否同時(shí)顯示元素對(duì)應(yīng)的score
  3. zrem [zset] 'value'
    JedisAPI:public Long zrem(final String key, final String... member)
    功能: 刪除zset中值為value的元素
  4. zincrby [zset] n 'value'
    JedisAPI:public Double zincrby(final String key, final double score, final String member)
    功能:如果zset中存在value,則令其score加n,否則添加value,令其score為n
  5. zrank [zset] 'value'
    JedisAPI:public Long zrank(final String key, final String member)
    功能:返回zset中值為value的元素排名(按score從小到大)
  6. zrevrank [zset] 'value'
    JedisAPI:public Long zrevrank(final String key, final String member)
    功能:按score從大到小返回元素排名
  7. zrevrange [zset] start end
    JedisAPI:public Set<String> zrevrange(final String key, final long start, final long end)
    功能:返回zset[end…start]
  8. zcount [zset] start end
    JedisAPI:public Long zcount(final String key, final double min, final double max)
    功能:返回zset在指定區(qū)間的數(shù)量
  9. zcard [zset]
    JedisAPI:public Long zcard(final String key)
    功能:返回zset中元素的個(gè)數(shù)
  10. zscore [zset] 'value'
    JedisAPI:public Double zscore(final String key, final String member)
    功能:返回值為value的元素的score
  11. zremrangebyrank [zset] start end
    JedisAPI:public Long zremrangeByRank(final String key, final long start, final long end)
    功能:刪除zset按score從小到大排序索引從start到end的元素逆甜。
  12. zremrangebyscore [zset] score1 score2
    JedisAPI:public Long zremrangeByScore(final String key, final double start, final double end)
    功能:刪除zset中score在score1到score2之間的元素
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虱肄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子交煞,更是在濱河造成了極大的恐慌咏窿,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件素征,死亡現(xiàn)場(chǎng)離奇詭異集嵌,居然都是意外死亡萝挤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)纸淮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)平斩,“玉大人,你說(shuō)我怎么就攤上這事咽块』婷妫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵侈沪,是天一觀的道長(zhǎng)揭璃。 經(jīng)常有香客問(wèn)我,道長(zhǎng)亭罪,這世上最難降的妖魔是什么瘦馍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮应役,結(jié)果婚禮上情组,老公的妹妹穿的比我還像新娘。我一直安慰自己箩祥,他們只是感情好院崇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著袍祖,像睡著了一般底瓣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蕉陋,一...
    開(kāi)封第一講書(shū)人閱讀 51,274評(píng)論 1 300
  • 那天捐凭,我揣著相機(jī)與錄音,去河邊找鬼凳鬓。 笑死茁肠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缩举。 我是一名探鬼主播官套,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蚁孔!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起惋嚎,我...
    開(kāi)封第一講書(shū)人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤杠氢,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后另伍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鼻百,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绞旅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了温艇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片因悲。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖勺爱,靈堂內(nèi)的尸體忽然破棺而出晃琳,到底是詐尸還是另有隱情,我是刑警寧澤琐鲁,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布卫旱,位于F島的核電站,受9級(jí)特大地震影響围段,放射性物質(zhì)發(fā)生泄漏顾翼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一奈泪、第九天 我趴在偏房一處隱蔽的房頂上張望适贸。 院中可真熱鬧,春花似錦涝桅、人聲如沸拜姿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)砾隅。三九已至,卻和暖如春债蜜,著一層夾襖步出監(jiān)牢的瞬間晴埂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工寻定, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留儒洛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓狼速,卻偏偏與公主長(zhǎng)得像琅锻,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子向胡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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

  • Redis 數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)介 Redis 可以存儲(chǔ)鍵與5種不同數(shù)據(jù)結(jié)構(gòu)類(lèi)型之間的映射恼蓬,這5種數(shù)據(jù)結(jié)構(gòu)類(lèi)型分別為Stri...
    DreamerRzc閱讀 236,845評(píng)論 26 273
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)僵芹,斷路器处硬,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 一、基本數(shù)據(jù)類(lèi)型 注釋 單行注釋?zhuān)?/ 區(qū)域注釋?zhuān)?* */ 文檔注釋?zhuān)?** */ 數(shù)值 對(duì)于byte類(lèi)型而言...
    龍貓小爺閱讀 4,261評(píng)論 0 16
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法亮蒋,內(nèi)部類(lèi)的語(yǔ)法宵膨,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,625評(píng)論 18 399
  • 網(wǎng)購(gòu)的一套練字工具到了。這次的是一套可以無(wú)限次使用,專(zhuān)用的筆寫(xiě)過(guò)后幾分鐘以后就會(huì)了無(wú)痕跡疆栏,重復(fù)使用就算是做到環(huán)保了...
    曉曉的窩閱讀 495評(píng)論 1 3