1、Redis 關鍵字(Key)
- keys * 查看當前庫所有key
- exists [key] 判斷某個key是否存在
- type [key] 查看當前key的數據類型
- del [key] 刪除指定的key數據
- unlink [key] 根據value選擇非阻塞刪除,僅將keys從keyspace元數據中刪除,真正的刪除會在后續異步操作
- expire [key] [time] 給指定key設置過期時間,單位秒
- ttl [key] 查看當前key還有多久過期, -1表示永不過期,-2表示已過期
- select [dbid] 切換數據庫
- dbsize 查看當前數據庫的key的數量
- flushdb 清空當前數據庫
- flushall 清空全部數據庫
2、Redis 字符串string
2.1 簡介
- String是Redis最基本的類型,一個key對應一個value。
- String類型是二進制安全的。意味著Redis的string可以包含任何數據。比如jpg圖片或者序列化的對象。
- String類型是Redis最基本的數據類型,一個Redis中字符串value最多可以是512M。
2.2 常用命令
2.2.1 set <key> <value> 添加鍵值對
- NX:當數據庫中key不存在時,可以將key-value添加數據庫
- XX:當數據庫中key存在時,可以將key-value添加數據庫,與NX參數互斥
- EX:key的超時秒數
- PX:key的超時毫秒數,與EX互斥
2.2.2 get <key> 查詢對應鍵值
2.2.3 append <key> <value> 將給定的 <value> 追加到原值的末尾
2.2.4 strlen <key>獲得值的長度
2.2.5 setnx <key> <value>只有在 key 不存在時 設置 key 的值
2.2.6 incr <key> 將 key 中儲存的數字值增1,只能對數字值操作,如果為空,新增值為1
2.2.7 decr <key> 將 key 中儲存的數字值減1,只能對數字值操作,如果為空,新增值為-1
2.2.8 incrby / decrby <key> <步長>將 key 中儲存的數字值增減。自定義步長。
2.2.9 mset <key1> <value1> <key2> <value2> …
同時設置一個或多個 key-value對
2.2.10 mget <key1> <key2> <key3> …
同時獲取一個或多個 value
2.2.11 msetnx <key1> <value1> <key2> <value2> …
同時設置一個或多個 key-value 對,當且僅當所有給定 key 都不存在。
原子性,有一個失敗則都失敗
2.2.12 getrange <key> <起始位置> <結束位置>
獲得值的范圍,類似獲取字串
2.2.13 setrange <key> <起始位置> <value>
用 <value> 覆寫<key>所儲存的字符串值,從<起始位置>開始(索引從0開始)。
2.2.14 setex <key> <過期時間> <value>
設置鍵值的同時,設置過期時間,單位秒。
2.2.15 getset <key> <value>
以新換舊,設置了新值同時獲得舊值。
2.3 數據結構
String的數據結構為簡單動態字符串(Simple Dynamic String,縮寫SDS)。是可以修改的字符串,采用預分配冗余空間的方式來減少內存的頻繁分配。
如圖中所示,內部為當前字符串實際分配的空間capacity一般要高于實際字符串長度len。當字符串長度小于1M時,擴容都是加倍現有的空間,如果超過1M,擴容時一次只會多擴1M的空間。需要注意的是字符串最大長度為512M。
3、Redis 列表 List
3.1 簡介
- 單鍵多值
- Redis 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。
- 它的底層實際是個雙向鏈表,對兩端的操作性能很高,通過索引下標操作中間的節點性能會較差。
3.2 常用命令
3.2.1 lpush/rpush <key> <value1> <value2> <value3> …
從左邊/右邊插入一個或多個值。
3.2.2 lpop/rpop <key>
從左邊/右邊吐出一個值。值在鍵在,值光鍵亡。
3.2.3 rpoplpush <key1> <key2>
從<key1>列表右邊吐出一個值,插到<key2>列表左邊。
3.2.4 lrange <key> <start> <stop>
按照索引下標獲得元素(從左到右)
lrange mylist 0 -1 ; 0左邊第一個,-1右邊第一個,(0-1表示獲取所有)
3.2.5 lindex <key> <index>
按照索引下標獲得元素(從左到右)
3.2.6 llen <key>
獲得列表長度
3.2.7 linsert <key> before <value> <newvalue>
在<value>的后面插入<newvalue>插入值
3.2.8 lrem <key> <n> <value>
從左邊刪除n個value(從左到右)
3.2.9 lset <key> <index> <value>
將列表key下標為index的值替換成value
3.3 數據結構
- List的數據結構為快速鏈表quickList。
- 首先在列表元素較少的情況下會使用一塊連續的內存存儲,這個結構是ziplist,也即是壓縮列表。
- 它將所有的元素緊挨著一起存儲,分配的是一塊連續的內存。
- 當數據量比較多的時候才會改成quicklist。
- 因為普通的鏈表需要的附加指針空間太大,會比較浪費空間。比如這個列表里存的只是int類型的數據,結構上還需要兩個額外的指針prev和next。
Redis將鏈表和ziplist結合起來組成了quicklist。也就是將多個ziplist使用雙向指針串起來使用。這樣既滿足了快速的插入刪除性能,又不會出現太大的空間冗余。
4、Redis 集合Set
4.1 簡介
Redis set對外提供的功能與list類似是一個列表的功能,特殊之處在于set是可以自動去重的,當你需要存儲一個列表數據,又不希望出現重復數據時,set是一個很好的選擇,并且set提供了判斷某個成員是否在一個set集合內的重要接口,這個也是list所不能提供的。
Redis的Set是string類型的無序集合。它底層其實是一個value為null的hash表,所以添加,刪除,查找的復雜度都是O(1)。
4.2 常用命令
4.2.1 sadd <key> <value1> <value2> …
將一個或多個 member 元素加入到集合 key 中,已經存在的 member 元素將被忽略
4.2.2 smembers <key>
取出該集合的所有值。
4.2.3 sismember <key> <value>
判斷集合<key>是否為含有該<value>值,有1,沒有0
4.2.4 scard <key>
返回該集合的元素個數。
4.2.5 srem <key> <value1> <value2> …
刪除集合中的某個元素。
4.2.6 spop <key>
隨機從該集合中吐出一個值。
4.2.7 srandmember <key> <n>
隨機從該集合中取出n個值。不會從集合中刪除 。
4.2.8 smove <source> <destination> <value>
把集合中一個值從一個集合移動到另一個集合
4.2.9 sinter <key1> <key2>
返回兩個集合的交集元素。
4.2.10 sunion <key1> <key2>
返回兩個集合的并集元素。
4.2.11 sdiff <key1> <key2>
返回兩個集合的差集元素(key1中的,不包含key2中的)
4.3 數據結構
Set數據結構是dict字典,字典是用哈希表實現的。
5、Redis 哈希Hash
5.1 簡介
- Redis hash 是一個鍵值對集合。
- Redis hash是一個string類型的field和value的映射表,hash特別適合用于存儲對象。
用戶ID為查找的key,存儲的value用戶對象包含姓名,年齡,生日等信息,如果用普通的key/value結構來存儲
主要有以下2種存儲方式:
每次修改用戶的某個屬性需要,先反序列化改好后再序列化回去。開銷較大。
用戶ID數據冗余
Redis Hash通過 key(用戶ID) + field(屬性標簽) 就可以操作對應屬性數據了,既不需要重復存儲數據,也不會帶來序列化和并發修改控制的問題。
5.2 常用命令
5.2.1 hset <key> <field> <value>
給<key>集合中的 <field> 鍵賦值<value>
5.2.2 hget <key1> <field>
從<key1>集合<field>取出 value
5.2.3 hmset <key1> <field1> <value1> <field2> <value2>…
批量設置hash的值
5.2.4 hexists <key1> <field>
查看哈希表 key 中,給定域 field 是否存在。
5.2.5 hkeys <key>
列出該hash集合的所有field
5.2.6 hvals <key>
列出該hash集合的所有value
5.2.7 hincrby <key> <field> <increment>
為哈希表 key 中的域 field 的值加上增量 1 -1
5.2.8 hsetnx <key> <field> <value>
將哈希表 key 中的域 field 的值設置為 value ,當且僅當域 field 不存在 .
5.3 數據結構
Hash類型對應的數據結構是兩種:ziplist(壓縮列表),hashtable(哈希表)。當field-value長度較短且個數較少時,使用ziplist,否則使用hashtable。
6、Redis 有序集合Zset(sorted set)
6.1 簡介
- Redis有序集合zset與普通集合set非常相似,是一個沒有重復元素的字符串集合。
- 不同之處是有序集合的每個成員都關聯了一個評分(score),這個評分(score)被用來按照從最低分到最高分的方式排序集合中的成員。集合的成員是唯一的,但是評分可以是重復了 。
- 因為元素是有序的, 所以你也可以很快的根據評分(score)或者次序(position)來獲取一個范圍的元素。
- 訪問有序集合的中間元素也是非常快的,因此你能夠使用有序集合作為一個沒有重復成員的智能列表。
6.2 常用命令
6.2.1 zadd <key> <score1> <member1> <score2> <member2>…
將一個或多個 member 元素及其 score 值加入到有序集 key 當中。
6.2.2 zrange <key> <start> <stop> [WITHSCORES]
返回有序集 key 中,下標在<start> <stop>之間的元素
帶WITHSCORES,可以讓分數一起和值返回到結果集。
6.2.3 zrangebyscore key min max [withscores] [limit offset count]
返回有序集 key 中,所有 score 值介于 min 和 max 之間(包括等于 min 或 max )的成員。有序集成員按 score 值遞增(從小到大)次序排列。
6.2.4 zrevrangebyscore key max min [withscores] [limit offset count]
同上,改為從大到小排列。
6.2.5 zincrby <key> <increment> <value>
為元素的score加上增量 increment
6.2.6 zrem <key> <value>
刪除該集合下,指定值的元素
6.2.7 zcount <key> <min> <max>
統計該集合,分數區間內的元素個數
6.2.8 zrank <key> <value>
返回該值在集合中的排名,從0開始。
6.3 數據結構
zset底層使用了兩個數據結構
(1)hash,hash的作用就是關聯元素value和權重score,保障元素value的唯一性,可以通過元素value找到相應的score值。
(2)跳躍表,跳躍表的目的在于給元素value排序,根據score的范圍獲取元素列表。
6.3.1 跳躍表
6.3.1.1 簡介
有序集合在生活中比較常見,例如根據成績對學生排名,根據得分對玩家排名等。對于有序集合的底層實現,可以用數組、平衡樹、鏈表等。數組不便元素的插入、刪除;平衡樹或紅黑樹雖然效率高但結構復雜;鏈表查詢需要遍歷所有效率低。Redis采用的是跳躍表。跳躍表效率堪比紅黑樹,實現遠比紅黑樹簡單。
6.3.1.2 示例
對比有序鏈表和跳躍表,從鏈表中查詢出51
(1) 有序鏈表
要查找值為51的元素,需要從第一個元素開始依次查找、比較才能找到。共需要6次比較。
(2) 跳躍表
從第2層開始,1節點比51節點小,向后比較。
21節點比51節點小,繼續向后比較,后面就是NULL了,所以從21節點向下到第1層
在第1層,41節點比51節點小,繼續向后,61節點比51節點大,所以從41向下
在第0層,51節點為要查找的節點,節點被找到,共查找4次。
從此可以看出跳躍表比有序鏈表效率要高