Redis 數據結構詳解
Redis 數據類型分為:字元串類型、散列類型、列表類型、集合類型、有序集合類型。
Redis 這麼火,它運行有多塊?一台普通的筆記本電腦,可以在1秒鐘內完成十萬次的讀寫操作。
原子操作:最小的操作單位,不能繼續拆分。即最小的執行單位,不會被其他命令插入。高並發下不存在競態條件。
KEY 的命名:一個良好的建議是 article:1:title 來存儲 ID 為 1 的文章的標題。
一、前言
- 1、獲取key的列表:KEYS pattern 通配符有 ?*[] 和轉義 。
- 2、key 是否存在: EXISTS key 存在返回 1,不存在返回 0。
- 3、建立 key 和刪除 key:SET key 和 DEL key。
- 4、根據 key 獲取該鍵所存儲的 redis 數據類型:TYPE key。返回是 string、list、hash、set、zset。下面會對這5種返回的 redis 數據類型逐一講解。
- 5、rename oldkey newkey:對 key 重命名,如果 newkey 存在則覆蓋。
- 6、renamenx oldkey newkey:對 key 重命名,如果 newkey 存在則不覆蓋。
- 7、randomkey:隨即返回一個 key
- 8、move key db-index:將 key 移動到指定的資料庫中,如果 key 不存在或者已經在該資料庫中,則返回 0。成功則返回 1。
二、Redis數據類型 Redis數據命令
1、Redis數據類型一字元串類型:這個很好理解,一個key存儲一個字元串。如果你要存數據呢?轉換成Json或者其他的字元串序列化。
2、Redis數據命令一字元串類型:
- 1)賦值:SET key value。如 set hello world
- 2)取值:GET key。如 get hello。返回是 world
- 3)自增:INCR key。就是 Mysql的AUTO_INCREMENT。每次執行 INCR key時,該key的值都會+1.若key不存在,則先建立一個0,然後+1,返回 1。如果值不是整數則報錯。該操作是原子操作。
- 4)自減:DECR key。將指定 key 的值減少 1。 如 DECR num,就是 num-1
- 5)自增 N:INCRBY key increment 用來給指定 key 的值加 increment。如 INCRBY num 5 就是 num+5
- 6)自減 N:DECRBY key increment 用來給指定 key 的值減 increment。如 DECRBY num 5 就是 num-5
- 7)增加浮點數:INCRBYFLOAT key increment。
- 8)向尾部追加:APPEND key value。如set test:key 123、append test:key 456、get test:key 就是 123456
- 9)獲取長度:STRLEN key。
- 10)同時給多個 key 賦值:MSET title 這是標題 description 這是描述 content 這是內容。
- 11)同時獲取多個 key 的值:MGET title description content
- 12)位操作之獲取:GETBIT key offset。如字元 a 在 redis 中的存儲為 01100001(ASCII為98),那麼 GETBIT key 2 就是 1,GET key 0 就是 0。
- 13)位操作之設置:SETBIT key offset value。如字元 a 在 redis 中的存儲為 01100001(ASCII為98),那麼 SETBIT key 6 0,SETBIT key 5 1 那麼 get key 得到的是 b。因為取出的二進位為 01100010。
- 14)位操作之統計:BITCOUNT key [start] [end]:BITCOUNT key 用來獲取 key 的值中二進位是 1 的個數。而 BITCOUNT key start end 則是用來統計key的值中在第 start 和 end 之間的子字元串的二進位是 1 的個數(好繞啊)。
- 15)位操作之位運算:BITOP operation resultKey key1 key2。operation 是位運算的操作,有 AND,OR,XOR,NOT。resultKey 是把運算結構存儲在這個 key 中,key1 和 key2 是參與運算的 key,參與運算的 key 可以指定多個。
3、Redis數據類型二散列類型:
Redis 是以字典(關聯數組)的形式存儲的,一個 key 對應一個 value。在字元串類型中,value 只能是一個字元串。那麼在散列類型,也叫哈希類型中,value 對應的也是一個字典(關聯數組)。那麼就可以理解,Redis 的哈希類型/散列類型中,key 對應的 value 是一個二維數組。但是欄位的值只可以是字元串。也就是說只能是二維數組,不能有更多的維度。
4、Redis 數據命令二散列類型:
- 1)賦值:HSET key field value。如 hset user name lane。hset user age 23
- 2)取值:HGET key field。如 hget user name,得到的是 lane。
- 3)同一個key多個欄位賦值:HMSET key field1 value1 field2 value2...
- 4)同一個KEY多個欄位取值:HMGET key field1 fields2...
- 5)獲取KEY的所有欄位和所有值:HGETALL key。如 HGETALL user 得到的是 name lane age 23。每個返回都是獨立的一行。
- 6)欄位是否存在:HEXISTS key field。存在返回 1,不存在返回 0
- 7)當欄位不存在時賦值:HSETNX key field value。如果 key 下面的欄位 field 不存在,則建立 field 欄位,且值為 value。如果 field 欄位存在,則不執行任何操作。它的效果等於 HEXISTS + HSET。但是這個命令的優點是原子操作。再高的並發也不會怕怕。
- 8)自增 N:HINCREBY key field increment。同字元串的自增類型,不再闡述。
- 9)刪除欄位:DEL key field1 field2... 刪除指定KEY的一個或多個欄位。
- 10)只獲取欄位名:HKEYS key。與 HGETALL 類似,但是只獲取欄位名,不獲取欄位值。
- 11)只獲取欄位值:HVALS key。與 HGETALL 類似,但是只獲取欄位值,不獲取欄位名。
- 12)獲取欄位數量:HLEN key。
5、Redis 數據類型三列表類型
列表類型存儲了一個有序的字元串列表。常用的操作是向兩端插入新的元素。時間複雜度為 O(1)。結構為一個鏈表。記錄頭和尾的地址。看到這裡,Redis 數據類型的列表類型一個重大的作用呼之欲出,那就是隊列。新來的請求插入到尾部,新處理過的從頭部刪除。另外,比如微博的新鮮事。比如日誌。列表類型就是一個下標從 0 開始的數組。由於是鏈表存儲,那麼越靠近頭和尾的元素操作越快,越靠近中間則越慢。
6、Redis 數據命令三列表類型:
- 1)向頭部插入:LPUSH key value1 value2...。返回增加後的列表長度。
- 2)向尾部插入:RPUSH key value1 value2...。返回增加後的列表長度。
- 3)從頭部彈出:LPOP key。返回被彈出的元素值。該操作先刪除key列表的第一個元素,再將它返回。
- 4)從尾部彈出:RPOP key。返回被彈出的元素值。
- 5)列表元素個數:LLEN key。key 不存在返回 0。
- 6)獲取列表的子列表:LRANGE start end。返回第 start 個到第 end 個元素的列表。包含 start 和 end。支持負數索引。-1 表示最後一個元素,-2 表示倒數第二個元素。
- 7)刪除列表中指定值:LREM key count value。刪除 key 這個列表中,所有值為 value 的元素,只刪除 count。如果有 count+1 個,那麼就保留最後一個。count 不存在或者為 0,則刪除所有的。如果 count 大於 0,則刪除從頭到尾的 count 個,如果 count 小於 0,則刪除從尾到頭的 count 個。
- 8)獲取指定索引值:LINDEX key index。如LINDEX key 0就是列表的第一個元素。index可以是負數。
- 9)設置索引和值:LSET key index value。這個操作只是修改指定 key 且指定 index 的值。如果 index 不存在,則報錯。
- 10)保留片段,刪除其它:LTRIM key start end。保留 start 到 end 之間的所有元素,含 start 和 end。其他全部刪除。
- 11)向列表插入元素:LINSERT key BEFORE/AFTER value1 value2。從列表頭開始遍歷,發現值為 value1 時停止,將 value2 插入,根據 BEFORE 或者 AFTER 插入到 value1 的前面還是後面。
- 12)把一個列表的一個元素轉到另一個列表:RPOPLPUSH list1 list2。將列表 list1 的右邊元素刪除,並把該與元素插入到列表 list2 的左邊。原子操作。
7、Redis 數據類型四集合類型:
集合類型是為了方便對多個集合進行操作和運算。集合中每個元素不同且沒有順序的概念,每個元素都是且只能是一個字元串。常用操作是對集合插入、刪除、判斷等操作。時間複雜度尾 O(1)。可以進行交集、並集、差集運算。例如文章 1 的有 3 個標籤,是一個 Redis 數據類型集合類型存儲。文章 2 有 3 個標籤,有一個 Redis 數據類型集合類型存儲。文章是 1 是 mysql,文章 2 是講 redis。那麼交集是不是就交出了一個資料庫?(假設資料庫這個tag在兩篇文字都有)。集合類型在 redis 中的存儲是一個值為空的散列表。
8、Redis 數據命令四集合類型:
- 1)增加:SADD key value。
- 2)刪除:SREM key value。
- 3)獲取指定集合的所有元素:SMEMBERS key。
- 4)判斷某個元素是否存在:SISMEMBER key value。
- 5)差集運算:SDIFF key1 key2...。對多個集合進行差集運算。
- 6)交集運算:SINNER key1 key2...。對多個集合進行交集運算。
- 7)並集運算:SUNION key1 key2...。對多個集合進行並集運算。
- 8)獲取集合中元素個數:SCARD key。返回集合中元素的總個數。
- 9)對差集、交集、並集運算的結果存放在一個指定的 key 中:SDIFFSTORE storekey key1 key2。對 key1 和 key2 求差集,結果存放在 key 為 storekey 的集合中。SINNERSTORE 和 SUNIONSTORE 類似。
- 10)獲取集合中的隨即元素:SRANDMEMBER key [count]。參數 count 可選,如果 count 不存在,則隨即一個。count 大於 0,則是不重複的 count 個元素。count 小於 0,則是一共 |count|個 元素,可以重複。
- 11)隨即彈出一個元素:SPOP key。隨即從集合中彈出一個元素並刪除,將該元素的值返回。
9、Redis 數據類型五有序集合類型:
集合類型是無序的,每個元素是唯一的。那麼有序集合就是有序的,每個元素是唯一的。有序集合類型和集合類型的差別是,有序集合為每個元素配備了一個屬性:分數。有序集合就是根據分數來排序的。有序集合是使用散列表和跳躍表實現的。所以和列表相比,操作中間元素的速度也很快。時間複雜度尾 O(log(N))。Redis 數據類型中的有序集合類型比 Redis 數據類型中的列表類型更加耗費資源。
10、Redis數據命令五有序集合類型
- 1)增加:ZADD key sorce1 value1 sorce2 value2...。
- 2)獲取分數:ZSCORE key value。獲取key的有序集合中值為 value 的元素的分數。
- 3)獲取排名在某個範圍內的元素列表:ZRANFGE key start stop [WITHSCORE]。獲取排名在 start 和 end 之間的元素列表,包含 start 和 end2 個元素。每個元素一行。如果有WITHSCORE參數,則一行元素值,一行分數。時間複雜度為O(LOGn+m)。如果分數相同,則 0<0
- 4)獲取指定分數範圍的元素:ZRANGEBYSCORE key min max [WITHSCORE] [LIMIT offset count]。獲取分數在 min 和 max 之間的元素列表。含兩頭。每個元素一行。如果有 WITHSCORE 參數,則一行元素值,一行分數。如果 min 大於 max 則順序反轉。
- 5)為某個元素增加分數:ZINCRBY key increment value。指定的有序集合的值為 value 的元素的分數 +increment。返回值後更改後的分數。
- 6)獲取集合中元素的數量:ZCARD key。
- 7)獲取指定分數範圍內的元素個數:ZCOUNT key min max。
- 8)刪除一個或多個元素:ZREM key value1 value2...
- 9)根據排名範圍刪除元素:ZREMRANGEBYRANK key start end。刪除排名在 start 和 end 中的元素。
- 10)按照分數範圍刪除元素:ZREMRANGEBYSCORE key min max。
- 11)獲得元素排名(正序):ZRANK key value。獲取 value 在該集合中的從小到大的排名。
- 12)獲得元素排名(倒序):ZREVRANK key value。獲取 value 在該集合中從大到小的排名。
- 13)有序集合的交集:ZINTERSTORE storekey key1 key2...[WEIGHTS weight [weight..]] [AGGREGATE SUM|MIN|MAX]。用來計算多個集合的交集,結果存儲在 storekey中。返回值是 storekey 的元素個數。AGGREGATE 為 SUM 則 storekey 集合的每個元素的分數是參與計算的集合分數和。MIN 是參與計算的分數最小值。MAX 是參與計算分數最大值。WEIGHTS 設置每個集合的權重,如 WEIGHTS 1 0.1。那麼集合A的每個元素分數 * 1,集合B的每個元素分數 * 0.1
- 14)有序集合的並集:ZUNIONSTORE storekey key1 kye2...[WEIGHTS weight [weight..]] [AGGREGATE SUM|MIN|MAX]
※windows下安裝python及第三方庫numpy、scipy、matplotlib終極版
※pixhawk 自定義uart的應用
TAG:程序員小新人學習 |