---
# System prepended metadata

title: Ch3. Commands in Redis
tags: [Redis]

---

---
tags: Redis
---

# Ch3. Commands in Redis

## 3.1 Strings
* String 是 Redis 中最基礎的資料型別，透過 sequence的形式儲存byte資料；
* 資料格式
    * 字串（byte string）
    * 整數
        * 取值範圍和系统的長整数（long integer）相同，32位元\64位元
    * 浮點數



| Command | Description |
| ------- | ----------- |
| INCR        |  key-name——將值加上1           |
| DECR        |   key-name——將值減去1         |
| INCRBY         |    key-name——將值加上對應整數值        
| DECRBY        |      key-name——將值減去對應整數值      |
| INCRBYFLOAT    | 將值加上對應浮點數值        |

* Property
    * 當值可被判為數值類的Value時，redis會會讓其可使用對應的Command
    * "", not exist 會塞0
    * 如果是無法轉換為數值得value，則報錯



| Command  | Description                                                 |
| -------- | ----------------------------------------------------------- |
| APPEND   | key-name value——將value追加到存取值末尾                     |
| GETRANGE(2.6以前為SUBSTR) | key-name, start, end，將key-name對應的值包跨start ~end 取出 |
| SETRANGE | keyname, offset, value，從offset位置開始，更換為value值        |
| GETBIT     | key-name, offset——把字串看作是二進制（bit string），返回位串中offset的二進位值     |
| SETBIT     | key-name, offset, value——把字串看作是二進制（bit string），將offset的二進位值修改成value     |
| BITCOUNT     | key-name, start, end -- 統計二進位串中值為1的數量，如果可給定start, end，就只在range鐘計算     |
| BITOP     | operation, dest-key,[key-name] -- 對一個或多個字串執行包括AND\或OR\XOR\NOT在内的任一（bitwise operation），並將計算結果保存在dest-key裡面    |
* SETRANG\SETBIT，若超過原本字串長度會自動擴增
* GETRANGE若超過，則不回傳東西
* GETBIT若超過，則視為空字串


## 3.2 Lists





| Command| Description |
| -------- | -------- |
|     RPUSH     | key-namem,value [value ...]——將一個或多個值塞到List的右端         |
|     LPUSH     |  key-namem,value [value ...]——將一個或多個值塞到List的左端        |
|     RPOP     |     key-name——移除並返回List最右端的元素     |
|     LPOP     |         key-name——移除並返回List最左端的元素      |
|     LINDEX     |   key-name, offset——返回Listoffset的元素       |
|    LRANGE      |   key-name,  start, end——返回List在start~end内的所有元素    |
|    LTRIM      |  key-name, start, end——將List進行修剪，只保留start到end的元素 |



* Blocking behavior
    * If none of the specified keys exist, Blocking behavior will blocks the connection until another client performs an LPUSH or RPUSH operation against one of the keys.
    * 當新資料出現時，則會解鎖+Pop
    * timeout ==0 i.e unblocking


| Command | Description |
| -------- | -------- |
|     BLPOP     | key-name,  [key-name ...], timeout-- 第一个非空列表刪除及回傳最左端的元素，或者在timeout秒解除block        |
|    BRPOP      |    BLPOP右邊版      |
|      RPOPLPUSH    |     source-key, dest-key——從source-key RPOP後，將元素LPUSH到dest-key并向用户返回这个元素     |
|      BRPOPLPUSH    |  source-key, dest-key, timeout-- 從source-key BRPOP後，將元素LPUSH到dest-key并向用户返回这个元素     |

## 3.3 Sets



| Column 2 | Column 3 |
| -------- | -------- |
|     SADD     |   key-name, item, [item ...]——將一個或多個值塞到Set，並回傳不存在set當中的元素數量
|      SREM    |     key-name, item, [item ...]——set里面移除一個或多个元素，並回傳被移除的數量    |
|    SISMEMBER      |  key-name, item——檢察元素item是否存在於set key-name里        |
|      SCARD    |     key-name——回傳set包含的元素的＿     |
|    SMEMBERS      |    key-name——回傳set所有元素      |
|    SRANDMEMBER      |  key-name, [count]——從set 隨機抽樣，count >0 不重複，count<0 可允許重複        |
|   SPOP       |   key-name，回傳並移除Set的一個元素   |
|   SMOVE       |   source-key, mdest-key, item——如果集合source-key包含元素item， 那么从集合source-key里面移除元素item，並將元素item加到集合dest-key中； 如果item被成功移除，return 1，else 0       |

* example
    * 使用SET的場景如果以前兩節為參考，在投票的計數上，就適合用SET功能
        * 投票、已投票、移除等 


| Commend | Description |
| -------- | -------- |
|   SDIFF       |  key-name [key-name ...]——回傳在第一個集合、但不存在於所有其他集合中的元素 |
|      SDIFFSTORE    |   dest-key, key-name [key-name ...]——在第一個集合、但不存在於所有其他集合中的元素儲存於Set dest-key中       |
|     SINTER     |    key-name [key-name ...]——回傳同时存在於所有集合中的元素      |
|   SINTERSTORE       | 回傳同时存在於所有集合中的元素儲存於Set dest-key中         |
|     SUNION     |     key-name [key-name ...]——回傳聯集    |
|   SUNIONSTORE       |    聯集儲存於Set dest-key中      |



## 3.4 Hashes



| Command | Description |
| -------- | -------- |
|    HMGET      |    key-name key [key ...]——從Hashes取一個key或多個key對應的值      |
|     HMSET     |   key-name key [key ...]——從Hashes設定一個key或多個key對應的值       ||   HDEL       |   key-name key [key ...]——從Hashes
刪除一個key或多個key對應的值，並回傳成功刪除的數量         |
|   HLEN       |   key-name——從Hashes包含的key value的成對數量      |






| Command | Description |
| -------- | -------- |
|     HEXISTS     |     key-name key——檢察HASHES中是否有對應KEY值     |
|  HKEYS        |     key-name-- 列出所有HASHES中的KEY值  |
|     HVALS     |  key-name-- 列出所有HASHES中的VALUE值        |
|   HGETALL       |  key-name-- 列出所有HASHES中的KEY-VALUE PAIR   |
|  HINCRBY|     key-name, key, increment——將hashes中對應key保存的值加上整數increment     |
|    HINCRBYFLOAT      |key-name, key, increment-- 將hashes中對應key保存的值加上浮點數increment |

* 小細節
    * 因為直接取回整個hash可能很佔空間，因此只挑選key\先用HISMEMBER查詢可以降低memory\整體數據的使用量；

## Sorted Sets




| Column 2 | Column 3 |
| -------- | -------- |
|     ZADD     |  key-name, score, member, [score member ...]--將带有给分數的MEMBER塞進ZSET當中      |
|   ZREM       |   key-name, member [member ...]——從 ZSET
刪除一個MEMBER或多個MEMBER，並回傳成功刪除的數量      |
|    ZCARD      |     key-name，計算成員數量     |
|   ZINCRBY       |    key-name, increment, member——將member成员的分值加上increment      |
|    ZCOUNT      |    key-name, min, max，計算min~max間的數量      |
|   ZRANK       |  key-name member——取得member在key-name中的排名        |
| ZSCORE     | key-name, member——取得member在key-name中的分數     |
| ZRANGE     |key-name, start stop, [WITHSCORES]——回傳start和stop之間的成员，如果有給withscores，連分數也一起回傳     |




| Command | Description|
| -------- | -------- |
|      ZREVRANK    |   key-name, member——回傳ZSET中member的反向順序(大>小)       |
|    ZREVRANGE      |  key-name, start, stop [WITHSCORES]——回傳ZSET排名的member，由大到小的排序        |
|  ZRANGEBYSCORE        |   key, min, max, [WITHSCORES], [LIMIT offset count]——回傳分數于min和max間的所有成员       |
|    ZREVRANGEBYSCORE      |   key, min, max, [WITHSCORES], [LIMIT offset count]——回傳分數於min和max間的所有成员，由大到小的反向排序          |
|    ZREMRANGEBYRANK      | key-name, start,  stop——移除排序在start~stop的members         |
| ZREMRANGEBYSCORE     |  key-name, min, min~max的members          |
|  ZINTERSTORE        |  dest-key,key-count,key, [key ...], [WEIGHTS weight [weight ...]],[AGGREGATE SUM|MIN|MAX]——ZSET的交集運算        |
| ZUNIONSTORE     | ZSET的聯集運算            |








## 3.6 Publish/subscribe




| Command | Description |
| -------- | -------- |
|    SUBSCRIBE      |  channel [channel ...]——訂閱给定的一個或多個頻道        |
|     UNSUBSCRIBE     |   [channel [channel ...]]——退定给定的一個或多個頻道，如果没有给定任何頻道，則退定所有       |
|PUBLISH|          |channel, message——向给定頻道發訊息
|   PSUBSCRIBE       |  pattern [pattern ...]——訂閱與给定模式相匹配的所有頻道        |
|      PUNSUBSCRIBE    |  attern [pattern ...]——退定與给定模式相匹配的所有頻道，如果没有给定任何頻道，則退定所有            |


* 訂閱/發布的必要性，有幾個考量點
    * redis 在系統的穩定性
        * 舊版當訂閱所得到的訊息>=讀取速率，會導致緩衝越來越大> redis可能變慢或掛掉
        * 新版不會有這個問題，但不是效率變快，而是自動斷開不符合的pubsub配置
    * 數據傳輸的可靠性疑慮
        * 通常系統連線掛點時，可能都是透過重連等方式去重新連線，但如果剛好很賽發生在重連線前就發布訊息，那重連後也找不回這個資料；
            * 當你越側重資料正確性，訂閱\分布的特性可能就沒這麼適合；


## 3.7 Other commands
### 3.7.1 Sorting


| Command | Description |
| -------- | -------- |
| SORT     | source-key, [BY pattern], [LIMIT offset count], [GET pattern [GET pattern ...]] [ASC|DESC], [ALPHA], [STORE dest-key] ——根據給定的選項，對輸入的LIST、SET、ZSET等進行排序，同時亦可儲存排序結果     |


* 排序功能
    * 降冪
    * 以數值、二進位排序

### 3.7.2 Basic Redis transactions

* basic transaction - MULTI, EXEC
    * 讓一個transaction執行時，不會被其他client端打斷
    * 與RDB相異
        * 不是回滾
    * transaction會一個接一個執行，當完成一個transaction才會處理下一個；
    * 當收到MULTI，Redis會將clinet 端發送的所有命令都塞到queue，值到收到EXEC，就會在不中斷的情況下把Queue的指令執行完成


### 3.7.3 Expiring keys    


| Column 2 | Column 3 |
| -------- | -------- |
|   PERSIST       |      key-name——移除key的過期時間|
|    TTL      |    key-name-—返回给key值距離過期還有多少秒     |
|   EXPIRE       |   設定key的過期秒數       |
|   EXPIREAT       |      key-name, timestamp--設定key的過期時間為給定的UNIX時間戳記   |
|    PTTL(v2.6+)      |    key-name-—返回给key值距離過期還有多少毫秒      |
|    PEXPIRE      |  key-name, milliseconds——設定key的過期毫秒秒數        |
| PEXPIREAT     | key-name, timestamp-milliseconds--設定key的過期時間為給定的UNIX毫秒時間戳記    |

## 補充資料

### 用正規表達式找出 Redis host 裡面的 key

* 參考連結: [link](https://stackoverflow.com/questions/5567055/redis-keys-as-a-regex)
* 使用方式
    * 這個 `redis_key_list` 就會包含現在 redis host 的所有 redis_key
    * 當然在 match 的地方寫下想要的 regular expression，就可以找到想要的 keys
```python=
redis_conn = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)
redis_key_list = [key for key in redis_conn.scan_iter(match='*')]
```
### 使用正規表達式篩選出在 redis 中 hash 裡面的所有 field name
* 參考連結: [link](https://stackoverflow.com/questions/53513923/query-on-keys-using-expressions-on-redis-and-python)

```python=
redis_conn = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)
for order in redis_conn.hscan_iter('orders', match=('*SSDT_2018-12-09T07:15:00*' or  '*FALSE' or '*CID_10*' or '*DAID_10*' ) ):
    print(order)
```