1. 程式人生 > 實用技巧 >Redis-五種基本型別

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 一樣,只不過這裡返回的是毫秒