Redis的數據類型
1、Redis的數據類型
Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
2、String 數據類型
string 是 redis 最基本的類型,你可以理解成與 Memcached 一模一樣的類型,一個 key 對應一個 value。
string 類型是二進制安全的。意思是 redis 的 string 可以包含任何數據。比如jpg圖片或者序列化的對象。
string 類型是 Redis 最基本的數據類型,string 類型的值最大能存儲 512MB。
2.1、常用命令
Redis 中設置 string 類型的 key 命令如下:
- set key value:設置指定 key 的值。如果對同一key重復設值,后面的賦值會覆蓋掉前面的

帶后綴參數的命令說明:
- setex:同時設置 key 的超時秒數
- setpx:key的超時毫秒數,與EX互斥
- setnx:當數據庫中key不存在時,可以將key-value添加數據庫
- setxx:當數據庫中key存在時,可以將key-value添加數據庫,與NX參數互斥
2.1.1、常規操作
Redis 中 string 類型的 key 的其他常用命令如下:
- get key:獲取指定 key 的值。
- append key value:如果 key 已經存在并且是一個字符串, APPEND 命令將指定的 value 拼接到該 key 原來值(value)的末尾。
- strlen key:獲得 value 的字符串長度
- setnx key value:只有在 key 不存在時,才設置 key 的值,如果該 key 已存在,則該命令返回0,即設置失敗。
- getrange key 起始位置 結束位置:獲得指定范圍的字符串段,類似 java 中的substring 方法。
- setrange key 起始位置 value:用指定的字符串 value 插入到已有的字符串的指定索引的位置。
- setex key 過期時間 value:設置鍵值的同時,設置過期時間,單位秒。
- getset <key><value>:以新換舊,返回之前的 value 值,并設置新的 value 值。
2.1.2、數字操作
數字操作相關命令:
- incr key:將 key 中儲存的數字值增1,只能對數字值操作。如果該 key 不存在,則新增 key 并設置值為1
- decr key:將 key 中儲存的數字值減1,只能對數字值操作。如果該 key 不存在,則新增 key 并設置值為-1
- incrby | decrby key num:將 key 中儲存的數字值增減指定的數值
2.1.3、批量操作
批量操作相關命令:
- mset key1 value1 key2 value2...(空格隔開):同時設置一個或多個key-value對
- mget:key1 key2 key3...(空格隔開):同時獲取一個或多個 key 的 value 值
- msetnx key1 value1 key2 value2 ...:同時設置一個或多個 key-value 對。當且僅當所有給定 key 都不存在時操作才成功,因為 Redis 的單操作都是原子性的,所以只要有一個失敗所有的 key 都不會設置成功。
2.2、Redis字符串類型的數據結構
Redis 中 String 的類型的底層數據結構實際為簡單動態字符串(Simple Dynamic String,縮寫SDS),是可以修改的字符串,內部結構實現上類似于 Java 的ArrayList,采用預分配冗余空間的方式來減少內存的頻繁分配.

如上圖所示,當前字符串實際分配的空間 capacity 一般要高于實際字符串長度 len。當字符串長度小于1M時,擴容都是加倍現有的空間,如果超過1M,擴容時一次只會多擴1M的空間。需要注意的是字符串最大長度為512M。
3、List 數據類型
Redis 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。一個列表最多可以包含 232 - 1 個元素 (4294967295, 每個列表超過40億個元素)。
它的底層實際是個雙向鏈表,對兩端的操作性能很高,通過索引下標的操作中間的節點性能會較差。

3.1、常用命令
生成一個 list 類型的 key 命令如下:
-
lpush/rpush key value1 value2 value3> .... :從左邊/右邊插入一個或多個值。

- lpop/rpop key:從左邊/右邊取出一個值,并且會將該值刪除。該方法返回取出的值,當某個key的值全部都取出時,該key也不將存在。
-
rpoplpush key1 key2:從 key1 列表右邊取出一個值,并且插到 key2 列表左邊
-
lrange key start stop:按照索引下標獲得元素(從左到右)。如:lrange list 0 2,0表示從左邊數的第一個,2表示從左邊數的第三個。當 stop 索引為 -1 時,表示獲取所有元素
-
index key index:獲取該 list 中指定索引的元素。
-
llen key:獲得 list 的元素數量
-
linsert key before|after value newvalue:在指定的 value 的前面或者后面插入一個新值 newvalue。
-
lrem key n value:從左邊開始將 n 個相同 value 值刪除。注意,是將 n 個值為指定的 value 的元素刪除掉
-
lset key index value:將指定 index 索引的值替換成指定的 value
3.2、Redis中list類型的數據結構
List的數據結構為快速鏈表quickList。
首先在列表元素較少的情況下會使用一塊連續的內存存儲,這個結構是ziplist,也即是壓縮列表。它將所有的元素緊挨著一起存儲,分配的是一塊連續的內存。
當數據量比較多的時候才會改成quicklist。因為普通的鏈表需要的附加指針空間太大,會比較浪費空間。比如這個列表里存的只是int類型的數據,結構上還需要兩個額外的指針prev和next。Redis將鏈表和ziplist結合起來組成了quicklist。也就是將多個ziplist使用雙向指針串起來使用。這樣既滿足了快速的插入刪除性能,又不會出現太大的空間冗余。

4、set數據類型
Redis set 對外提供的功能與 list 類似是一個列表的功能,特殊之處在于 set 是可以自動去重的,即集合成員是唯一的,集合中不會有重復的數據。
Redis 的 Set 是 string 類型的無序集合。它底層其實是一個 value 為 null 的 hash 表,所以添加,刪除,查找的復雜度都是O(1)。O(1)復雜度的算法,查找數據的時間不會隨著數據的增加而變長。
set 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
4.1、常用命令
- sadd key value1 value2> .....:將一個或多個 member 元素加入到集合 key 中,已經存在的 member 元素將被忽略。
- smembers key:取出該集合的所有值。
- sismember key value:判斷集合 key 是否為含有該 value 值,有1,沒有0。
- scard key:返回該集合的元素個數。
- srem key value1 value2 ....: 刪除集合中的某些元素。
- spop key:隨機從該集合中吐出一個值,并刪除該值。
- srandmember key n:隨機從該集合中取出n個值。每次取出的值都可能不一樣,并且不會將這些值從集合中刪除 。
- smove key1 key2 value:將 key1 集合中指定的移出到 key2 集合中。
- sinter key1 key2:返回兩個集合的交集元素,即共有的元素集合。
- sunion key1 key2:返回兩個集合的并集元素。
- sdiff key1 key2:返回兩個集合的差集元素(即只屬于 key1 中的,key2 不包含的元素集合)
4.2、Redis中set類型的數據結構
Set 數據結構是 dict 字典,字典是用哈希表實現的。
Java 中 HashSet 的內部實現使用的是 HashMap,只不過所有的 value 都指向同一個對象。Redis 的 set 結構也是一樣,它的內部也使用 hash 結構,所有的 value 都指向同一個內部值。
5、Hash 數據類型
Redis hash 是一個鍵值對集合。Redis hash是一個 string 類型的 field 和 value 的映射表,hash 特別適合用于存儲對象。類似Java里面的Map<String,Object>
Redis 中每個 hash 可以存儲 232 - 1 鍵值對(40多億)。
5.1、常用命令
- hset key field value:添加名為 key 的 hash 集合,并指定該 hash 中的某個字段 field 賦值為 value
- hget key field:獲取 key 集合中的 field 的 value 值
- hmset key field1 value1 field2 value2...:批量設置 hash 中 filed 的值
- hexists key1 field:查看哈希表 key 中,給定域 field 是否存在。
- hkeys key:列出該 hash 集合的所有field
- hvals key:列出該hash集合的所有value
- hincrby key field num:為哈希表 key 中的指定的 field 字段的 value 值加上增量值 num
- hsetnx key field value:將哈希表 key 中的域 field 的值設置為 value ,當且僅當域 field 不存在才會生效,否則不會有效果。
操作示例:

5.2、Redis中hash類型的數據結構
Hash類型對應的數據結構有兩種:ziplist(壓縮列表)、hashtable(哈希表)。當field-value長度較短且個數較少時,使用ziplist,否則使用hashtable。
6、Zset數據類型
Redis 有序集合 zset 與普通集合 set 非常相似,是一個沒有重復元素的字符串集合。不同之處是有序集合的每個成員都關聯了一個評分(score),這個評分被用來按照從最低分到最高分的方式排序集合中的成員。集合的成員是唯一的,但是評分可以是重復的 。因為元素是有序的, 所以你也可以很快的根據評分(score)或者次序(position)來獲取一個范圍的元素。
訪問有序集合的中間元素也是非常快的,因此你可以使用 zset 集合作為一個沒有重復成員的有序列表。
6.1、常用命令
- zadd key score1 value1 score2 value2 …:將一個或多個元素及其 score 值加入到有序集 key 當中。
- zrange key start stop [WITHSCORES]:返回有序集 key 中下標在<start><stop>之間的元素,參數 WITHSCORES 表示輸出時是否需要讓分數和值一起返回。
- zrangebyscore key minmax [withscores] [limit offset count]:返回有序集 key 中,所有 score 值介于 min 和 max 之間(包括等于 min 或 max )的成員。有序集成員按 score 值遞增(從小到大)次序排列。
- zrevrangebyscore key maxmin [withscores] [limit offset count]:同上,改為從大到小排列。
- zincrby <key><increment><value>:為元素的score加上增量
- zrem <key><value>:刪除該集合下,指定值的元素
- zcount <key><min><max>:統計該集合,分數區間內的元素個數
- zrank <key><value>:返回該值在集合中的排名,從0開始。
操作示例:

6.2、Redis中zset類型的數據結構
SortedSet(zset)是Redis提供的一個非常特別的數據結構,一方面它等價于Java的數據結構Map<String, Double>,可以給每一個元素value賦予一個權重score,另一方面它又類似于TreeSet,內部的元素會按照權重score進行排序,可以得到每個元素的名次,還可以通過score的范圍來獲取元素的列表。
zset底層使用了兩個數據結構
(1)hash,hash的作用就是關聯元素value和權重score,保障元素value的唯一性,可以通過元素value找到相應的score值。
(2)跳躍表,跳躍表的目的在于給元素value排序,根據score的范圍獲取元素列表。

浙公網安備 33010602011771號