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