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,鏈表的訪(fǎng)問(wèn)都是以NULL訪(fǎng)問(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(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閱讀 237,458評(píng)論 26 273
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評(píng)論 19 139
  • 一、基本數(shù)據(jù)類(lèi)型 注釋 單行注釋?zhuān)?/ 區(qū)域注釋?zhuān)?* */ 文檔注釋?zhuān)?** */ 數(shù)值 對(duì)于byte類(lèi)型而言...
    龍貓小爺閱讀 4,434評(píng)論 0 16
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,623評(píng)論 18 399
  • 網(wǎng)購(gòu)的一套練字工具到了。這次的是一套可以無(wú)限次使用,專(zhuān)用的筆寫(xiě)過(guò)后幾分鐘以后就會(huì)了無(wú)痕跡,重復(fù)使用就算是做到環(huán)保了...
    曉曉的窩閱讀 551評(píng)論 1 3

友情鏈接更多精彩內(nèi)容