Redis-五種基本型別
Redis啟動
首先修改redis.conf配置檔案
配置完成後,儲存退出,再次通過 redis-server redis.conf
命令啟動 Redis,此時,就是在後臺啟
動了。
String
String 是 Redis 裡邊最最簡單的一種資料結構。在 Redis 中,所以的 key 都是字串,但是,不同的
key 對應的 value 則具備不同的資料結構,我們所說的五種不同的資料型別,主要是指 value 的資料類
型不同。
Redis 中的字串是動態字串,內部是可以修改的,像 Java 中的 StringBuffer,它採用分配冗餘空間
的方式來減少記憶體的頻繁分配。在 Redis 內部結構中,一般實際分配的記憶體會大於需要的記憶體,當字元
串小於 1M 的時候,擴容都是在現有的空間基礎上加倍,擴容每次擴 1M 空間,最大 512M。
指令 | 功能 |
---|---|
key | 就是給一個 key 賦值的。 |
append | 使用 append 命令時,如果 key 已經存在,則直接在對應的 value 後追加值,否則就建立新的鍵值對。 |
decr | 可以實現對 value 的減 1 操作(前提是 value 是一個數字),如果 value 不是數字,會報錯,如果value 不存在,則會給一個預設的值為 0,在預設值的基礎上減一。 |
decrby | 和decr類似,但是可以設定步長,該命令的第二個引數就是步長 |
get | 用來獲取一個key的value |
getrange | getrange可以用來返回key對應的value的子串,這有點類似於 Java 裡邊的 substring。這個命令第二個和第三個引數就是擷取的起始和終止位置,其中,-1 表示最後一個字串,-2 表示倒數第二個字串,以此類推... |
getset | 獲取並更新一個key |
incr | 給一個key的value自增 |
incrby | 給一個key自增,同時還可以設定步長 |
incrbyfloat | 和incrby類似,但是步長可以設定為浮點數 |
mget和mset | 批量獲取和批量儲存 |
ttl | 檢視key的有效期 |
setex | 在個key設定value的同時,還設定過期時間 |
psetex | 和setex類似,單位是毫秒 |
setnx | set命令會覆蓋已經存在的key,setnx不會 |
msetnx | 批量設定 |
setrange | 覆蓋一個已經存在的key的長度 |
strlen | 檢視字串長度 |
BIT命令
在redis中,字串都是以二進位制的方式來儲存的,例如set k1 a,a對應的ascii碼是97,97轉換為二進位制是01100001,BIT相關的命令就是對二進位制進行操作的
指令 | 功能 |
---|---|
getbit | key對應的value在offset處的bit值 |
setbit | 修改key對應的value在offset處的bit值 |
bitcount | 統計二進位制資料中1的個數 |
List
列表這種物件支援存現一組有序的,不重複的資料,因為其有序性,它可以獲取指定範圍的元素列表,可以在O(1)的時間複雜度獲取指定索引的下標的元素
在Redis3.2版本以前列表型別的內部編碼有兩種。當滿足下面兩個條件的時候,Redis 列表物件使用ziplist(壓縮列表)來實現。
- 當列表的元素個數小於list-max-ziplist-entries配置(預設512個)
- 當列表中每個元素的值都小於list-max-ziplist-value配置時(預設64位元組)
當列表型別無法滿足ziplist條件時,Redis會使用linkedList作為列表的內部實現。而在Redis3.2版本開始對列表資料結構進行改造,使用quickList代替了zipList和linkedList。由於列表物件的有序且不可重複的特性,它比較適合用來做文章、商品等列表的儲存。
列表型別可以lpush(左側push),同時又可以使用rpop(右側彈出)第一個元素,所以列表型別具有先進先出的特性,可以用來實現訊息佇列,也可以lpush(左側push)和lpop(左側彈出),具有後進先出的特性,因此開發中需要使用棧的時候,我們可以使用列表物件來實現。
先進先出:lpush(左側push) rpop(右側pop) 做訊息佇列
後進先出:lpush(左側push) lpop(左側彈出)做棧
關於List更詳細的介紹,參考這篇部落格
指令 | 功能 |
---|---|
lpush | 將所有指定的值插入到存於 key 的列表的頭部。如果 key 不存在,那麼在進行 push 操作前會建立一個空列表。 如果 key 對應的值不是一個 list 的話,那麼會返回一個錯誤。 |
lrange | 返回列表指定區間內的元素。 |
rpush | 向存於 key 的列表的尾部插入所有指定的值。 |
rpop | 移除並返回列表的尾元素。 |
lpop | 移除並返回列表的頭元素。 |
lindex | 返回列表中,下標為 index 的元素。 |
ltrim | 可以對一個列表進行修剪。 |
blpop | 阻塞式的彈出,相當於 lpop 的阻塞版。 |
Set
集合物件是一個無序且唯一的鍵值集合。它的儲存順序不會按照插入的先後順序進行儲存,與列表不同的是,它儲存的資料是無序且不重複的
集合物件的內部編碼也有兩種,intest(整數集合)與hashtable(雜湊表),當滿足下面兩個條件的時候,集合物件使用intset來實現
- 集合中的元素都是整數
- 集合中元素的個數小於 set-maxintset-entries配置(預設512個)
不滿足上面兩個條件時,集合物件使用hashtable來實現
集合物件的主要兩個特性就是:無序,不可重複,支援並交差,因此可以用來做標籤系統
而集合中的 SPOP(隨機移除並返回集合中一個或多個元素) 和 SRANDMEMBER(隨機返回集合中一個或多個元素)命令可以幫助我們實現一個抽獎系統
spop
srandmember
有關Set更詳細的介紹,參考這篇部落格
指令 | 功能 |
---|---|
sadd | 新增一個元素到一個key中 |
smembers | 獲取一個 key 下的所有元素 |
srem | 移除指定的元素 |
sismemeber | 返回某一個成員是否在集合中 |
scard | 返回集合的數量 |
srandmember | 隨機返回一個元素 |
spop | 隨機返回並且出棧一個元素。 |
smove | 把一個元素從一個集合移到另一個集合中去。 |
sdiff | 返回兩個集合的差集。 |
sinter | 返回兩個集合的交集。 |
sdiffstore | 這個類似於 sdiff ,不同的是,計算出來的結果會儲存在一個新的集合中。 |
sinterstore | 類似於 sinter,只是將計算出來的交集儲存到一個新的集合中。 |
sunion | 求並集。 |
sunionstore | 求並集並且將結果儲存到新的集合中。 |
Hash
hash結構中,key是一個字串 ,value則是一個key/value鍵值對
雜湊物件用來儲存一組資料對。每個資料對又包含鍵值兩部分
Hash物件也有兩種實現方式:ziplist(壓縮列表)和 hashtable(雜湊表)
同樣,只有當儲存的資料量比較小的情況下,Redis才使用壓縮列表來實現雜湊物件,具體需要滿足兩個條件
- 字典中儲存的鍵和值的大小都要小於64位元組
- 字典中鍵值對的個數要小於512個
當不能同時滿足上面的兩個條件時,Redis就使用雜湊表來實現Hash物件
當儲存的內容是物件的時候,Redis字串物件很多功能使用Redis 雜湊物件也可以實現,如快取使用者資訊的時候,使用Redis雜湊物件儲存,簡單直觀,如果使用合理可以減少記憶體空間的使用。
但是也有其缺點,就是要控制雜湊在ziplist和hashtable兩種內部編碼的轉換,hashtable將會消耗更多的記憶體。
此外,Hash物件還可以實現購物車和計數器等功能,更詳細的介紹,參考這篇部落格
指令 | 功能 |
---|---|
hset | 新增值 |
hget | 獲取值 |
hmset | 批量設定 |
hmget | 批量獲取 |
hdel | 刪除一個指定的 field |
hsetnx | 預設情況下,如果 key 和 field 相同,會覆蓋掉已有的 value,hsetnx 則不會。 |
hvals | 獲取所有的 value |
hkeys | 獲取所有的 key |
hgetall | 同時獲取所有的 key 和 value |
hexists | 返回 field 是否存在 |
hincrby | 給指定的 value 自增 |
hincrbyfloat | 可以自增一個浮點數 |
hlen | 返回 某一個 key 中 value 的數量 |
hstrlen | 返回某一個 key 中的某一個 field 的字串長度 |
ZSet
有序集合型別 (Sorted Set或ZSet) 相比於集合型別多了一個排序屬性 score(分值),對於有序集合 ZSet 來說,每個儲存元素相當於有兩個值組成的,一個是有序結合的元素值,一個是排序值。有序集合保留了集合不能有重複成員的特性(分值可以重複),但不同的是,有序集合中的元素可以排序
有序集合是由 ziplist (壓縮列表) 或 skiplist (跳躍表) 組成的。
當資料比較少時,有序集合使用的是 ziplist 儲存的,有序集合使用 ziplist 格式儲存必須滿足以下兩個條件:
- 有序集合儲存的元素個數要小於 128 個;
- 有序集合儲存的所有元素成員的長度都必須小於 64 位元組。
如果不能滿足以上兩個條件中的任意一個,有序集合將會使用 skiplist 結構進行儲存。
有序集合比較典型的使用場景就是排行榜系統例如學生成績的排名。某視訊(部落格等)網站的使用者點贊、播放排名、電商系統中商品的銷量排名等。
有關Redis有序集合物件的更詳細的介紹,參考這篇部落格
指令 | 功能 |
---|---|
zadd | 將指定的元素新增到有序集合中 |
zscore | 返回 member 的 score 值 |
zrange | 返回集合中的一組元素 |
zrevrange | 返回一組元素,但是是倒序 |
zcard | 返回元素個數 |
zcount | 返回 score 在某一個區間內的元素 |
zrangebyscore | 按照 score 的範圍返回元素 |
zrank | 返回元素的排名(從小到大 |
zrevrank | 返回元素排名(從大到小 |
zincrby | score 自增 |
zinterstore | 給兩個集合求交集 |
zrem | 彈出一個元素 |
zlexcount | 計算有序集合中成員數量 |
zrangebylex | 返回指定區間內的成員 |
key
指令 | 功能 |
---|---|
del | 刪除一個 key/value |
dump | 序列化給定的 key |
exists | 判斷一個 key 是否存在 |
ttl | 檢視一個 key 的有效期 |
expire | 給一個 key 設定有效期,如果 key 在過期之前被重新 set 了,則過期時間會失效。 |
persist | 移除一個 key 的過期時間 |
keys * | 檢視所有的 key |
pttl | 和 ttl 一樣,只不過這裡返回的是毫秒 |