---
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)
```