玩轉Redis-Redis基礎數據結構及核心命令

  《玩轉Redis》系列文章主要講述Redis的基礎及中高級應用,文章基於Redis5.0.4+。本文主要講述Redis的常見基礎數據結構,《玩轉Redis-Redis基礎數據結構及核心命令》相關操做命令爲方便對比分析,使用腦圖展現(若手機端查看圖片不方便,可搜索zxiaofan前往PC網頁端<CSDN、 開源中國 等平臺>查看)。git

  最新思惟導圖原圖可聯繫公衆號【zxiaofan】後臺獲取。
github

Redis-最新思惟導圖原圖

  本文更適合用於複習總結,閱讀》實戰》閱讀 更有效果喲,主要包含如下內容:redis

  • String(字符串);
  • List(列表);
  • Set(集合);
  • Hash(散列);

  後續會介紹其餘高級數據結構:數組

  • Sorted Set(有序集合);
  • Bitmap(位圖);
  • HyperLogLog;
  • Streams(流);

文章思路:安全

  • 數據結構應用場景及注意事項;
  • 數據結構各命令對比分析;

異常統一說明:
error(out of range)導圖簡寫@EOOR;
負數偏移量表示倒數第幾,導圖簡寫@LBN(last but number);bash


一、String

1.一、String應用場景及注意事項

1.1.一、String應用場景

  String能夠說是Redis中最多見的數據結構,沒有之一。
  String結構可存儲字符串或者各類類型的二進制數據服務器

  • 分佈式鎖;
  • 計數器;
  • 分佈式全局惟一ID;

1.1.二、String注意事項

  String底層結構是動態字符串,可修改指定位置數據,經過預分配冗餘空間減小內存的頻繁分配,實際分配的空間capacity通常要高於實際字符串長度len。當字符串長度小於1M時,擴容都是加倍現有的空間,若是超過1M,擴容時一次只會多擴1M的空間。字符串最大長度爲512M(51210241024個字符)。
  數字及浮點數在Redis中以字符串形式存儲。微信

// 如何證實 String最大長度是512M;
// 512M=512*1024*1024;
127.0.0.1:6379> setrange ran 536870911 a
(integer) 536870912
127.0.0.1:6379> strlen ran
(integer) 536870912
127.0.0.1:6379> append ran a
(error) ERR string exceeds maximum allowed size (512MB)
複製代碼

1.二、String各命令對比分析

  String命令支持如下操做類型:單一操做、批量操做、字符操做、位操做、計數操做。數據結構

1.2.一、String單元素操做

【核心命令】:SET、SETNX、SETEX、PSETEX、GET、GETSET、APPEND、STRLEN;app

注意:

  • 【SET】:Redis2.6.12+版本支持設置value值時,同時設置過時時間,此操做爲原子操做;
  • 【PSETEX】:Redis2.6.0+版本支持,可將過時時間精確到毫秒;

【Redis-String單元素操做】命令簡述:

命令 功能 參數
SET 設置value值,支持選項 key value [expiration EX seconds/PX milliseconds] [NX/XX]
SETNX key不存在才容許設置 key value
SETEX 設置value及過時時間(秒) key seconds value
PSETEX 設置value及過時時間(毫秒) key milliseconds value
GET 查詢指定key key
GETSET 查詢返回舊值設置新值 key value
APPEND value追加字符串 key value
STRLEN 查詢value長度 key

【Redis-String單元素操做】命令詳細對比分析以下:

Redis-String單元素操做

1.2.二、String批量操做

【核心命令】:MSET、MGET;

注意:

  • MGET、MSET是Redis命令中的Boss,由於執行這兩個命令是毫不會失敗的。
  • 【MSET】操做具備原子性,不存在部分key更新成功而部分key更新失敗的狀況;
  • 【MGET】若是value不是String類型,將返回nil;

【Redis-String批量操做】命令簡述:

命令 功能 參數
MSET 批量設置 key value [key value ...]
MGET 批量查詢 key [key ...]

【Redis-String批量操做】命令詳細對比分析以下:

Redis-String批量操做

1.2.三、String指定範圍處理

【核心命令】:SETRANGE、GETRANGE;

注意:

  • 【SETRANGE、GETRANGE】 在操做對象較小時,時間複雜度近似當作O(1);
  • 【SETRANGE】在特定狀況下會形成服務器阻塞(value不存在或很小+偏移量offset很大),具體阻塞時長與服務器有關;

【Redis-String指定範圍處理】命令簡述:

命令 功能 參數
SETRANGE 設置指定偏移量位置的字符 key offset value
GETRANGE 查詢指定區間字符串 key start end【@LBN;offset大於len將自動以len爲準】

【Redis-String指定範圍處理】命令詳細對比分析以下:

Redis-String指定範圍處理

1.2.四、String遞增操做

【核心命令】:INCR/DECR、INCRBY/DECRBY、INCRBYFLOAT;

注意:

  • String結構能存儲數字?由於數字在Redis中是以字符串形式保存的;
  • 【INCR/DECR】 支持加減1;
  • 【INCRBY/DECRBY】 支持 加減指定整數,參數支持負數;
  • 【INCRBYFLOAT】 支持 加減指定浮點數,參數支持負數;
  • 遞增命令時間負責度都是O(1);

【Redis-String遞增操做】命令簡述:

命令 功能 參數
INCR/DECR 遞增/1遞減1 key
INCRBY/DECRBY 遞增n/遞減n key increment(支持負數)
INCRBYFLOAT 遞增浮點值 key increment(支持負數)

【Redis-String遞增操做】命令詳細對比分析以下:

Redis-String遞增操做

1.2.五、String位操做

【核心命令】:SETBIT、BITOP、GETBIT、BITCOUNT、BITFIELD、BITPOS;

注意:

  • 【BITOP】支持邏輯操做,且AND、或OR、異或XOR、非NOT;
  • 因爲按位存儲很是節省空間,位操做特別適合於對連續的海量數據作標記。好比貼吧簽到,標記天天是否簽到,1天1標識位,則10年=10*365bit=456byte。

【Redis-String位操做】命令簡述:

命令 功能 參數
SETBIT 指定偏移量bit位置設置值 key offset value【0=< offset< 2^32】
BITOP 對一個或多個key執行邏輯操做,並將結果保存到destkey operation destkey key [key ...]【AND, OR, XOR, NOT】
GETBIT 查詢指定偏移位置的bit值 key offset
BITCOUNT 統計指定區間bit爲1的數量 key [start end]【@LBN】
BITFIELD 操做多字節位域 key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP/SAT/FAIL]
BITPOS 查詢指定區間第一個被設置成1的bit位的位置 key bit [start] [end]【@LBN】

【Redis-String位操做】命令詳細對比分析以下:

Redis-String位操做


二、List

2.一、List應用場景及注意事項

2.1.一、List應用場景

  • List可用於構建隊列(右進左出/先進先出)、棧(右進右出/先進後出);
  • 存儲相關數據,好比文章的相關文章ID,可用於文章推薦;
  • 高級使用:quicklist快速鏈表;

2.1.二、List注意事項

  • 元素是String,按插入順序排序;
  • 插入、彈出快,O(1);
  • 索引慢(查詢),O(n);
  • List查詢操做相似Java鏈表的get(int index),須要對鏈表遍歷,性能隨index的增大而下降;
  • lindex的index可爲負數,-1表示倒數第一個元素,-2倒數第二個;
  • List的index參數存在越界問題; -List的start、stop參數不存在越界問題;
  • 列表彈出最後一個元素後,結構自動被刪除,內存被回收;
  • List左頭右尾(記憶:我國自古就有左爲尊的說法,左纔是頭);

2.二、List各命令對比分析

概述:

  • List命令支持如下操做類型:新增元素、彈出元素、處理指定位置元素。
  • List主命令L開頭(左側處理)、右側處理目錄R開頭、阻塞命令B開頭;
  • List的超時timeout爲0表示無限阻塞;

2.2.一、List新增元素

【核心命令】:LPUSH、RPUSH、LPUSHX、RPUSHX、RPOPLPUSH、BRPOPLPUSH;

注意:

  • 【LPUSH / RPUSH】 支持批量添加元素;
  • 【RPOPLPUSH】 拆分紅2個命令理解:RPOP(src)+ LPUSH(dest);
  • 【RPOPLPUSH】可做爲安全隊列:ListA取出消息放入「處理中的ListB」,處理完畢移除ListB;外掛監控ListB的超時狀況;

【Redis-List新增元素操做】命令簡述:

命令 功能 參數
LPUSH / RPUSH (批量)添加元素 key value [value ...]
LPUSHX / RPUSHX 向已存在的list中添加單個元素 key value
RPOPLPUSH 彈出source尾壓入dest頭部 source destination
BRPOPLPUSH 阻塞式彈出source壓入dest source destination timeout

【Redis-List新增元素操做】命令詳細對比分析以下:

Redis-List新增元素操做

2.2.二、List彈出元素

【核心命令】:LPOP、RPOP、BLPOP、BRPOP;

注意:

  • 【BLPOP】爲LPOP的阻塞版本,0表示無限阻塞;
  • 彈出元素操做時間複雜度都是O(1);

【Redis-List彈出元素操做】命令簡述:

命令 功能 參數
LPOP / RPOP 彈出元素 key
BLPOP / BRPOP 阻塞式彈出元素 key [key ...] timeout

【Redis-List彈出元素操做】命令詳細對比分析以下:

Redis-List彈出元素操做

2.2.三、List處理指定位置元素

【核心命令】:LSET、LINDEX、LRANGE、LTRIM、LREM;

注意:

  • 【ltrim】支持保留區間內的值,可實現定長鏈表;
  • 【LRANGE、LTRIM】不會越界;
  • List處理指定位置相關命令時間複雜度可記爲O(N);

【Redis-List處理指定位置元素】命令簡述:

命令 功能 參數
LSET 指定位置設置元素 key index value
LINDEX 查詢指定位置元素 key index
LRANGE 查詢指定區間元素 key start stop
LTRIM 保留指定區間元素 key start stop
LREM 移除前/後count次的value元素 key count value

【Redis-List處理指定位置元素】命令詳細對比分析以下:

Redis-List處理指定位置元素


三、Set

3.一、Set應用場景及注意事項

3.1.一、Set應用場景

  • 相似Java的HashSet,鍵值無序惟一,可用於去重;
  • Set支持交集運算,可用於查找QQ共同好友;

3.1.二、Set注意事項

  • Set支持集合運算(差集、交集、並集);
  • Set底層實現至關於特殊字典,value都是NULL;
  • 集合最後一個元素移除後,結構自動刪除,內存被回收;

3.二、Set各命令對比分析

概述:

  • Set命令支持如下操做類型:集合運算、增刪移動及統計;
  • Set命令都是S開頭;

3.2.一、Set增刪移動及統計

【核心命令】:SADD(增)、SCADD(數量統計)、SISMEMBER(存在)、SMEMBERS(全部元素)、SREM(移除)、SMOVE(移動);

注意:

  • Redis2.4+,SADD、SREM支持批量添加元素;
  • 【SMEMBERS】將返回Set中全部元素,慎用,請使用SSCAN代替;
  • 【SRANDMEMBER】返回count個隨機元素,支持count爲負;SPOP返回並移除count個隨機元素,不支持count爲負(越界異常);

【Redis-Set增刪移動及統計】命令簡述

命令 功能 參數
SADD (批量)添加元素到Set中 key member [member ...]
SCARD 統計Set中元素數量 key
SISMEMBER 判斷指定元素是否存在於Set中 key member
SMEMBERS 返回Set中的全部元素 key
SMOVE 移動Set的指定元素到另外一個集合 source destination member
SRANDMEMBER 返回Set中count個隨機元素 key [count]
SPOP 移除並返回Set中count個隨機元素 key [count]
SREM 移除Set中指定的元素 key member [member ...]
SSCAN 迭代Set key cursor [MATCH pattern] [COUNT count]

【Redis-Set增刪移動及統計】命令詳細對比分析以下:

Redis-Set增刪移動及統計

3.2.二、Set集合運算(差集、交集、並集)

【核心命令】:差集SDIFF/SDIFFSTORE、交集SINTER/SINTERSTORE、並集SUNION/SUNIONSTORE;

注意:

  • 主命令加STORE表示將對應的結果存入指定目標Set中;
  • 對於「STORE」命令,若是destkey已存在,destkey的值將會被覆蓋;
  • 交集的時間複雜度是(N*M),差集/並集的時間複雜度是O(N);

【Redis-Set集合運算】命令簡述

命令 功能 參數
SDIFF 【差集】返回在第一個set中但不在其餘set中的元素集合 key [key ...]
SDIFFSTORE 【差集】將SDIFF結果存入destination destination key [key ...]
SINTER 【交集】返回(多個)set集合的交集 key [key ...]
SINTERSTORE 【交集】將多個set集合的交集存入dest destination key [key ...]
SUNION 【並集】返回多個set的並集 key [key ...]
SUNIONSTORE 【並集】將多個set集合的並集存入dest destination key [key ...]

【Redis-Set集合運算】命令詳細對比分析以下:

Redis-Set集合運算


四、Hash

4.一、Hash應用場景及注意事項

4.1.一、Hash應用場景

  • 記錄一個對象的多個屬性,如員工的姓名/生日/職級,文章的點贊數/閱讀數/收藏數;

4.1.二、Hash注意事項

  • 相似Java的HashMap,數組+鏈表,結構是<rediskey , <hashkey1, hashvalue1>>;
  • 字典key、value都只能是字符串(數字在redis裏面是以 sds 字符串形式存在);
  • 使用漸進式rehash策略:高性能,不堵塞服務;而HashMap的rehash是一次性hash,很耗時;
  • 【優勢】支持按需存取指定字段;
  • 【缺點】hash結構存儲消耗高於單個字符串;

4.二、Hash各命令對比分析

概述:

  • Hash命令支持如下操做類型:新增、查詢、統計、修改、刪除(增刪改查及統計);

4.2.一、Hash新增、查詢元素

【核心命令】:HSET、HSETNX、HMSET;HGET、HMGET、HGETALL;

注意:

  • 【HSET】field存在則覆蓋;HSETNX:field不存在才賦值;
  • 【HMSET、HMGET】支持批量操做;

【Redis-Hash新增、查詢元素】命令簡述

命令 功能 參數
HSET 設置hash中指定字段的值 key field value
HSETNX field不存在才設置hash中指定field的值 key field value
HMSET 批量設置hash值 key field value [field value ...]
HGET 查詢hash中指定字段的值 key field
HMGET 批量查詢指定field的value key field [field ...]
HGETALL 查詢全部field-value列表 key

【Redis-Hash新增、查詢元素】命令詳細對比分析以下:

Redis-Hash新增、查詢元素

4.2.二、Hash統計、修改、刪除

【核心命令】:HKEYS、HVALS、HLEN;HDEL、HEXISTS、HSTRLEN;HINCRBY、HINCRBYFLOAT;HSCAN;

注意:

  • 支持查詢Hash中全部field、全部value;
  • 【HVALS】不是HVALUES;
  • 【HINCRBY】支持增長Hash中指定field的值(點贊數/閱讀數/收藏數);

【Redis-Hash統計、修改、刪除】命令簡述

命令 功能 參數
HKEYS 查詢全部field列表 key
HVALS 查詢全部value列表 key
HLEN 查詢hash的field數量 key
HDEL 移除hash中指定field字段 key field [field ...]
HEXISTS 判斷hash中是否存在指定field key field
HSTRLEN 查詢hash中filed關聯的value字符串的長度 key field
HINCRBY 增長hash中指定field的值 key field increment
HINCRBYFLOAT 增長hash中指定field的值 key field increment
HSCAN 基於遊標迭代hashes key cursor [MATCH pattern] [COUNT count]

【Redis-Hash統計、修改、刪除】命令詳細對比分析以下:

Redis-Hash統計、修改、刪除

五、後記

  《玩轉Redis-Redis基礎數據結構及核心命令》至此結束,後續將繼續分享Redis其餘數據結構及核心命令。


祝君好運!
Life is all about choices!
未來的你必定會感激如今拼命的本身!
CSDN】【GitHub】【OSCHINA】【掘金】【微信公衆號
歡迎訂閱zxiaofan的微信公衆號,掃碼或直接搜索zxiaofan

相關文章
相關標籤/搜索