本文主要講解redis的6種數(shù)據(jù)類型。
string
redis的string可以存儲(chǔ)3種數(shù)據(jù)類型:string,整數(shù)和浮點(diǎn)數(shù)。
常見的操作如下
描述 | ||
set | set key value | 設(shè)置鍵值對(duì) |
get | get key | 獲取值 |
incr | incr key | 遞增值 |
decr | decr key | 遞減值 |
strlen | strlen key | 獲取字符串長(zhǎng)度 |
incrby | incrby key increment | 增加指定數(shù)字 |
decrby | decrby key decrement | 減少指定數(shù)字 |
append | append key value | 向尾部添加值 |
getset | getset key value | 取值并賦值 |
setnx | setnx key value | 當(dāng)value不存在時(shí)賦值 |
String的數(shù)據(jù)結(jié)構(gòu)為簡(jiǎn)單動(dòng)態(tài)字符串(Simple Dynamic String,縮寫SDS),采用預(yù)分配冗余空間減少內(nèi)存的頻繁分配,當(dāng)value長(zhǎng)度小于1m時(shí),每次擴(kuò)大1倍,當(dāng)大于1m時(shí)每次多分配1m的空間,最大為512m。
使用場(chǎng)景:
①計(jì)數(shù)器
②共享session
③setnx實(shí)現(xiàn)分布式鎖
list
list是列表結(jié)構(gòu),可以存儲(chǔ)有序、可重復(fù)的元素,獲取頭部或尾部附近的記錄是極快的
list的元素個(gè)數(shù)最多為2^32-1個(gè)(40億)
命令名稱 | 示例 | 描述 |
lpush | lpush key v1,v2… | 列表左邊插入 |
lpop | lpop key | 列表左邊彈出 |
rpush | rpush key v1,v2… | 列表右邊插入 |
rpop | rpop key | 列表右邊彈出 |
lpushx | lpushx key value | 將數(shù)值插入列表頭部 |
rpushx | rpushx key value | 將值插入列表尾部 |
llen | llen key | 獲取列表中元素個(gè)數(shù) |
lindex | lindex key index | 獲取列表中的下標(biāo) |
lrange | lrange key start end | 返回列表中指定區(qū)間的元素,區(qū)間通過start和end指定 |
lrem | lrem key count value | 刪除列表中與value相等的元素 當(dāng)count>0時(shí), lrem會(huì)從列表左邊開始刪除;當(dāng)count<0時(shí), lrem會(huì)從列表后邊開始刪除;當(dāng)count=0時(shí), lrem刪除所有值 為value的元素 |
lset | lset key index value | 將列表index位置的元素設(shè)置成value的值 |
ltrim | ltrim key start end | 對(duì)列表進(jìn)行修剪,只保留start到end區(qū)間 |
rpoplpush | rpoplpush key1 key2 | 從key1列表右側(cè)彈出并插入到key2列表左側(cè) |
brpoplpush | brpoplpush key1 key2 | 從key1列表右側(cè)彈出并插入到key2列表左側(cè),會(huì)阻塞 |
list底層有多種數(shù)據(jù)類型,數(shù)據(jù)量少的時(shí)候是ziplist壓縮列表,內(nèi)存是連續(xù)分配的,當(dāng)元素個(gè)數(shù)超過某個(gè)值時(shí)轉(zhuǎn)為linkedlist雙向鏈表,redis3.2之后數(shù)據(jù)量較多時(shí)改為quicklist。因?yàn)槠胀ǖ逆湵硇枰郊又羔樋臻g,會(huì)浪費(fèi)空間,加重內(nèi)存碎片化。redis將鏈表和ziplist結(jié)合組成quicklist。
使用場(chǎng)景:
①用戶列表,商品列表,評(píng)論列表等
②消息隊(duì)列
③棧
set
無序不重復(fù),集合中最大的成員數(shù)為 2^32 – 1
命令名稱 | 示例 | 描述 |
sadd | sadd key v1 v2… | 為集合添加新成員 |
srem | srem key v1 v2 … | 刪除集合指定成員 |
smembers | smembers key | 獲取集合中所有元素 |
spop | spop key | 返回集合中一個(gè)隨機(jī)元素,并將該元素刪除 |
srandmember | srandmember key | 返回集合中一個(gè)隨機(jī)元素,不會(huì)刪除該元素 |
scard | scard key | 獲取集合中的數(shù)量 |
sinter | sinter key1 key2 … | 求多集合的交集 |
sdiff | sdiff key1 key2… | 求多集合的差集 |
sunion | sunion key1 key2… | 求多集合的并集 |
set底層有兩種數(shù)據(jù)結(jié)構(gòu),一種是inset數(shù)組,另一種是hashtable,如果保存的所有值都是整數(shù)且個(gè)數(shù)不超過512個(gè)則使用inset數(shù)組,否則使用hashtable
使用場(chǎng)景:
①統(tǒng)計(jì)網(wǎng)站uv
②統(tǒng)計(jì)共同好友
sortedset
有序集合,可以通過設(shè)置分?jǐn)?shù)來對(duì)元素進(jìn)行排序,元素不能重復(fù),分?jǐn)?shù)可以
命令名稱 | 示例 | 描述 |
zadd | zadd key score1 v1 score2 v2… | 為集合添加新成員 |
zrem | srem key v1 v2 … | 刪除集合指定成員 |
zcount | zcount key min max | 返回分?jǐn)?shù)在[min,max]區(qū)間內(nèi)的元素?cái)?shù)量 |
zincrby | zincrby key increment member | 在集合的member分值上加increment |
zrank | zrank key member | 獲取集合中member的排名(按分值從小到大) |
zrevrank | zrevrank key member | 和zrank相反 |
zrange | zrange key start end | 獲取集合中指定區(qū)間成員,按分?jǐn)?shù)遞增排序 |
zrevrange | zrevrange key start end | 和zrange相反 |
zset底層是采用ziplist和skiplist結(jié)構(gòu),ziplist就是地址連續(xù)的壓縮鏈表,按照分值從小到大排序,在滿足一定條件下會(huì)轉(zhuǎn)換成skiplist,即跳表。
使用場(chǎng)景:
①排行榜
hash
String 類型的 field(域)和 value(值)的映射表,每個(gè)hash可以存儲(chǔ)2^32-1個(gè)鍵值對(duì)
命令名稱 | 示例 | 描述 |
hset | hset key field value | 賦值 |
hmset | hmset key field1 value1 field2 value2… | 批量賦值 |
hsetnx | hsetnx key field value | 賦值,如果值存在則不操作 |
hget | hget key field | 獲取一個(gè)字段值 |
hmget | hmset key field1 field2 | 獲取多個(gè)字段值 |
hgetall | hgetall key | 獲取所有值 |
hdel | hdel key field | 刪除指定字段 |
hincrby | hincrby key field increment | 指定字段自增increment |
hlen | hlen key | 獲取字段數(shù)量 |
底層使用hashtable存儲(chǔ)數(shù)據(jù)
使用場(chǎng)景
①存儲(chǔ)對(duì)象,應(yīng)用在頻繁寫操作的場(chǎng)景,string主要用在頻繁讀操作場(chǎng)景
BitMap
BitMap 就是通過一個(gè) bit 位來表示某個(gè)元素對(duì)應(yīng)的值或者狀態(tài), 其中的 key 就是對(duì)應(yīng)元素本身,實(shí)際上底層也是通過對(duì)字符串的操作來實(shí)現(xiàn)。
命令名稱 | 示例 | 描述 |
setbit | setbit key offset value | 設(shè)置key在offset處的bit值,只能是0或者1 |
getbit | getbit key.offset | 獲取key在offset處的bit值 |
bitcount | bitcount key | 獲取key的bit位為1的個(gè)數(shù) |
bitpos | bitpos key value | 獲取第一個(gè)值為value的bit的位置 |
bitop | bitop and[or/xor/not] destkey key [key …] | 對(duì)多個(gè)key 進(jìn)行邏輯運(yùn)算后存入destkey 中 |
使用場(chǎng)景:
①布隆過濾器
②統(tǒng)計(jì)用戶每月簽到,用戶id為key,日期作為偏移量