Redis开发与运维 笔记一
全局命令
dbsize命令在計算鍵總數時不會遍歷所有鍵,而是直接獲取Redis內置的鍵總數變量,所以dbsize命令的時 間復雜度是O(1)。而keys命令會遍歷所有鍵,所以它的時間復雜度是O(n),當Redis保存了大量鍵時,線上環境禁止使用。
單線程架構
Redis使用了單線程架構和I/O多路復用模型來實現高性能的內存數據庫服務。
為什么Redis使用單線程模型會達到每秒萬級別的處理能力呢?可以將其歸結為三點:
但是單線程會有一個問題:對于每個命令的執行時間是有要求的。如果某個命令執行過長,會造成其他 命令的阻塞,對于Redis這種高性能的服務來說是致命的,所以Redis是面向快速執行場景的數據庫。
字符串
字符串類型的值實際可以是字符串(簡單的字符串、復雜的字符串(例如JSON、XML))、數字(整數、浮點數),甚至是二進制(圖片、音頻、視頻),但是值最大不能超過512MB。
命令
incr命令用于對值做自增操作,返回結果分為三種情況:
·值不是整數,返回錯誤。
·值是整數,返回 自增后的結果。
·鍵不存在,按照值為0自增,返回結果為1。
典型的業務場景
緩存
業務名:對象名:id:[屬性]”作為鍵名(也可以不是分號)。例如MySQL的數據庫名為vs,用戶表名為 user,那么對應的鍵可以用"vs:user:1","vs:user:1:name"來表示,如果當前Redis只被一個業務使 用,甚至可以去掉“vs:”。如果鍵名比較長,例如“user:{uid}:friends:messages:{mid}”,可以 在能描述鍵含義的前提下適當減少鍵的長度,例如變為“u:{uid}:fr:m:{mid}”,從而減少由于鍵 過長的內存浪費。
鍵管理
單個鍵管理
如果在rename之前,鍵java已經存在,那么它的值也將被覆蓋。
為了防止被強行rename,Redis提供了renamenx命令,確保只有newKey不存在時候才被覆蓋。
在使用重命名命令時需要注意:
·由于重命名鍵期間會執行del命令刪除舊的鍵,如果鍵對應的值比較大,會存在阻塞Redis的可能性,這點不要忽視。
·如果rename和renamenx中的key和newkey如果是相同的,在Redis3.2和之前版本返回結果略有不同。 Redis3.2中會返回OK
鍵過期
ttl命令和pttl都可以查詢鍵的剩余過期時間,但是pttl精度更高可以達到毫秒級別,有3種返回值:
·大于等于0的整數:鍵剩余的過期時間(ttl是秒,pttl是毫秒)。
·-1:鍵沒有設置過期時間。
·-2:鍵不存在。
如果過期時間為負值,鍵會立即被刪除,猶如使用del命令一樣。
persist命令可以將鍵的過期時間清除。
對于字符串類型鍵,執行set命令會去掉過期時間,這個問題很容易在開發中被忽視。
遷移鍵
遷移過程分為兩步
1)在源Redis上,dump命令會將鍵值序列化,格式采用的是RDB格式。
2)在目標Redis上,restore命令 將上面序列化的值進行復原,其中ttl參數代表過期時間,如果ttl=0代表沒有過期時間。
有關dump+restore有兩點需要注意:第一,整個遷移過程并非原子性的,而是通過客戶端分步完成的。 第二,遷移過程是開啟了兩個客戶端連接,所以dump的結果不是在源Redis和目標Redis之間進行傳輸。
migrate命令具有原子性
第一,整個過程是原子執行的,不需要在多個Redis實例上開啟客戶端的,只需要在源Redis上執行 migrate命令即可。第二,migrate命令的數據傳輸直接在源Redis和目標Redis上完成的。第三,目標Redis 完成restore后會發送OK給源Redis,源Redis接收后會根據migrate對應的選項來決定是否在源Redis上刪 除對應的鍵。
遍歷鍵
上面為了遍歷所有的鍵,pattern直接使用星號,這是因為pattern使用的是glob風格的通配符:
- *代表 匹配任意字符。
- 代表匹配一個字符。
- []代表匹配部分字符,例如[1,3]代表匹配1,3,[1-10]代表匹 配1到10的任意數字。
- \x用來做轉義,例如要匹配星號、問號需要進行轉義。
數據庫管理
默認使用的就是0號數據庫,當選擇其他數據庫時,會有[index]的前綴標識,其中index就是數據庫的索引下標。
總結
以上是生活随笔為你收集整理的Redis开发与运维 笔记一的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是cname a记录
- 下一篇: DVP,LVDS和MIPI