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