Redis的五種數(shù)據(jù)結(jié)構(gòu)如下:
- String:字符串
- Hash:字典
- List:列表
- Set:集合
- 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ū)別如下:
- 常數(shù)復(fù)雜度獲取字符串長(zhǎng)度签孔,因?yàn)镾DS在len屬性中記錄了字符串本身的長(zhǎng)度叉讥。
- 杜絕緩沖區(qū)溢出,SDS在執(zhí)行拼接操作的時(shí)候饥追,會(huì)預(yù)先分配好空間图仓。
- 減少修改字符串時(shí)帶來(lái)的內(nèi)存重分配次數(shù)
- SDS是二進(jìn)制安全的,因?yàn)槠鋬?nèi)部就是存儲(chǔ)一系列二進(jìn)制數(shù)據(jù)
- 兼容部分C字符串函數(shù)
Redis字符串的操作命令和對(duì)應(yīng)的api如下:
-
set [key] [value]
JedisAPI:public String set(final String key, final String value)
功能:設(shè)置值 -
setnx [key] [value]
JedisAPI:public Long setnx(final String key, final String value)
功能:如果key存在但绕,返回0并不生效修改 -
setex [key] [time] [value]
JedisAPI:public String setex(final String key, final int seconds, final String value)
功能:指定有效期為time秒 -
setrange [key] n [string]
JedisAPI:public Long setrange(final String key, final long offset, final String value)
功能:將key對(duì)應(yīng)value第n位后面的字符替換成string -
mset [key1] [value1] [key2] [value2] ……
JedisAPI:public Long setnx(final String key, final String value)
功能:無(wú) -
msetnx
JedisAPI:無(wú)
功能:類(lèi)似setnx救崔,設(shè)置多個(gè)值,捏顺,如果key存在六孵,則返回0且修改不生效 -
get [key]
JedisAPI:public String get(final String key)
功能:獲取key對(duì)應(yīng)的值 -
getset [key] [value]
JedisAPI:public String getSet(final String key, final String value)
功能:設(shè)置key的值,并返回key的舊值 -
getrange [key] n1 n2
JedisAPI:public String getrange(final String key, final long startOffset, final long endOffset)
功能:獲取key對(duì)應(yīng)值的索引位置從n1到n2的字符串 -
mget [key1] [key2] [key3]……
JedisAPI:無(wú)
功能:一次獲取多個(gè)key對(duì)應(yīng)的值幅骄,如果不存在劫窒,則返回nil -
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 -
incrby [key] [num]
JedisAPI:public Long incrBy(final String key, final long integer)
功能:加指定值 ,key 不存在時(shí)候會(huì)設(shè)置 key,并認(rèn)為原來(lái)的 value 是 0 -
decr [key]
JedisAPI:public Long decr(final String key)
功能:對(duì)key的值做的是減1操作,decr 一個(gè)不存在 key,則設(shè)置 key 為-1 -
decrby [key] [num]
JedisAPI:public Long decrBy(final String key, final long integer)
功能: 對(duì)key對(duì)應(yīng)的value減去num -
append [key] [string]
JedisAPI:public Long append(final String key, final String value)
功能:將string追加到key對(duì)應(yīng)的值尾烛亦,返回新字符串的長(zhǎng)度 -
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如下:
-
hset [object] [field] [value]
JedisAPI:public Long hset(final String key, final String field, final String value)
功能:給object添加屬性 -
hsetnx
JedisAPI:public Long hsetnx(final String key, final String field, final String value)
功能:類(lèi)似hset,如果field已存在,則返回0且修改不生效 -
hmset [object] [field1] [value1] [field2] [value2]……
JedisAPI:public String hmset(final String key, final Map<String, String> hash)
功能:同時(shí)設(shè)置多個(gè)值 -
hget [object] [field]
JedisAPI:public String hget(final String key, final String field)
功能:獲取對(duì)象對(duì)應(yīng)屬性的值 -
hmget [object] [field1] [field2]
JedisAPI:public List<String> hmget(final String key, final String... fields)
功能:獲取多個(gè)值 -
hincrby [object] [field]
JedisAPI:public Long hincrBy(final String key, final String field, final long value)
功能:num 給field對(duì)應(yīng)值 + num -
hexists [object] [field]
JedisAPI:public Boolean hexists(final String key, final String field)
功能:判斷特定對(duì)象指定fiels是否存在 -
hlen [object]
JedisAPI: public Long hlen(final String key)
功能:返回對(duì)象屬性數(shù)量 -
hdel [object] [field]
JedisAPI:public Long hdel(final String key, final String... field)
功能:刪除object對(duì)應(yīng)field -
hkeys [object]
JedisAPI:public Set<String> hkeys(final String key)
功能:返回對(duì)象所有field -
hvals [object]
JedisAPI:public List<String> hvals(final String key)
功能:返回對(duì)象所有field對(duì)應(yīng)的value -
hgetall [object]
JedisAPI:public Map<String, String> hgetAll(final String key)
功能:返回對(duì)象所有field和value
三瓮孙、列表
Redis構(gòu)建了自己的鏈表的實(shí)現(xiàn)唐断,其特性如下:
- 雙端:鏈表節(jié)點(diǎn)提供有prev和next對(duì)象,獲取某個(gè)節(jié)點(diǎn)的前置節(jié)點(diǎn)和下一個(gè)節(jié)點(diǎn)的速度為O(1).
- 無(wú)環(huán):表頭節(jié)點(diǎn)prev對(duì)象和表尾節(jié)點(diǎn)next對(duì)象都指向NULL,鏈表的訪問(wèn)都是以NULL訪問(wèn)為終點(diǎn).
- 帶有表頭和表尾對(duì)象:通過(guò)list結(jié)構(gòu)的head和tail,獲取表頭和表尾對(duì)象的速度為O(1).
- 帶有長(zhǎng)度計(jì)數(shù)器:獲取鏈表長(zhǎng)度的直接讀取len字段值.速度為O(1).
- 多態(tài):通過(guò)dup杭抠、free脸甘、match三個(gè)方法,實(shí)現(xiàn)鏈表的多態(tài),保存不同類(lèi)型的值
Redis列表的操作命令和對(duì)應(yīng)的api如下:
-
lpush/rpush [list] [value]
JedisAPI:public Long lpush/rpush(final String key, final String... string)
功能:從頭/尾部向list添加值,返回list長(zhǎng)度 -
lrange [list] start end
JedisAPI:public List<String> lrange(final String key, final long start, final long end)
功能:返回list對(duì)應(yīng)索引區(qū)間的值 -
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 -
lset [list] index ‘value’
JedisAPI:public String lset(final String key, final long index, final String value)
功能:在特定索引插入value偏灿,注意:如果index為負(fù)值丹诀,則從list尾部開(kāi)始算起 -
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則刪除全部 -
ltrim [list] start end
JedisAPI:public String ltrim(final String key, final long start, final long end)
功能:僅保留list中索引從start到end的值 -
lpop [list]
JedisAPI:public String lpop(final String key)
功能:從頭部刪除元素,同時(shí)返回該元素 -
rpop [list]
JedisAPI:public String rpop(final String key)
功能:從尾部刪除元素并返回 -
rpoplpush [list1] [list2]
JedisAPI:無(wú)
功能:從list1的尾部移除元素并添加到list2的頭部,最后返回被移除的元素值,整個(gè)操作是原子的.如果list1是空或者不存在返回 nil -
lindex [list]
JedisAPI:public String lindex(final String key, final long index)
功能:index 返回list中index索引位置的元素 -
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如下:
-
smembers [set]
JedisAPI:public Set<String> smembers(final String key)
功能:查看set中的元素 -
sadd [set] [value]
JedisAPI:public Long sadd(final String key, final String... member)
功能:向set中插入value害碾,成功插入返回1矢劲,插入set中已有的value則失敗且返回0 -
srem [set] [value]
JedisAPI:刪除set中對(duì)應(yīng)的value,刪除成功返回1,若不存在則返回0
功能:public Long srem(final String key, final String... member) -
spop [set]
JedisAPI:public String spop(final String key)
功能:隨機(jī)刪除并返回set中的元素 -
sdiff [set1] [set2]
JedisAPI:無(wú)
功能:刪除set1中在set2里也存在的元素蛮原,返回刪除操作后的set1 -
sdiffstore [set1] [set2] [set3]
JedisAPI:無(wú)
功能:將sdiff [set2] [set3] 的結(jié)果保存在set1中 -
sinter [set1] [set2]
JedisAPI:無(wú)
功能:返回set1 set2共有元素 -
sinterstore [set1] [set2] [set3]
JedisAPI:無(wú)
功能:將sinter [set2] [set3] 結(jié)果保存在set1中 -
sunion [set1] [set2]
JedisAPI:無(wú)
功能:返回[set1] [set2]的并集 -
sunionstore [set1] [set2] [set3]
JedisAPI:無(wú)
功能:將[set2] [set3]的并集保存在[set1]中 -
smove [set1] [set2] [value]
JedisAPI:無(wú)
功能:將[set1] 的value移動(dòng)到set2中卧须,若value存在于set1,無(wú)論set2是否已存在儒陨,都(成功)返回1,不存在于set1則(失敾ㄋ弧)返回0 -
scard [set]
JedisAPI:public Long scard(final String key)
功能:返回set中的元素個(gè)數(shù) -
sismember [set] [value]
JedisAPI:public Boolean sismember(final String key, final String member)
功能:判斷value是否為set中的元素,是則返回1蹦漠,否則返回0 -
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如下:
-
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 -
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 -
zrem [zset] 'value'
JedisAPI:public Long zrem(final String key, final String... member)
功能: 刪除zset中值為value的元素 -
zincrby [zset] n 'value'
JedisAPI:public Double zincrby(final String key, final double score, final String member)
功能:如果zset中存在value,則令其score加n,否則添加value,令其score為n -
zrank [zset] 'value'
JedisAPI:public Long zrank(final String key, final String member)
功能:返回zset中值為value的元素排名(按score從小到大) -
zrevrank [zset] 'value'
JedisAPI:public Long zrevrank(final String key, final String member)
功能:按score從大到小返回元素排名 -
zrevrange [zset] start end
JedisAPI:public Set<String> zrevrange(final String key, final long start, final long end)
功能:返回zset[end…start] -
zcount [zset] start end
JedisAPI:public Long zcount(final String key, final double min, final double max)
功能:返回zset在指定區(qū)間的數(shù)量 -
zcard [zset]
JedisAPI:public Long zcard(final String key)
功能:返回zset中元素的個(gè)數(shù) -
zscore [zset] 'value'
JedisAPI:public Double zscore(final String key, final String member)
功能:返回值為value的元素的score -
zremrangebyrank [zset] start end
JedisAPI:public Long zremrangeByRank(final String key, final long start, final long end)
功能:刪除zset按score從小到大排序索引從start到end的元素逆甜。 -
zremrangebyscore [zset] score1 score2
JedisAPI:public Long zremrangeByScore(final String key, final double start, final double end)
功能:刪除zset中score在score1到score2之間的元素