1. 程式人生 > >redis常用指令總結以及功能介紹

redis常用指令總結以及功能介紹

第一部分 redis的常用指令

一、針對key的操作

1.1 del key [key .. ]                 , 刪除指定的一個或者多個key;
1.2 dump key                          , 序列化給定的key
1.3 restore key ttl serialized-value  , 反序列化到key
1.4 exists key                        , 判斷某一key是否存在
1.5 expire key seconds                , 設定key的過期時間 
            ① set命令可以覆蓋過期時間;不改變key的操作不會影響key的生存時間
② rename也不會改變key的過期時間
③ persist命令可以刪除key的過期時間,即永久
④ ttl可以檢視redis中key的過期時間
1.6 expireat key timestamp            , 設定key的生存時間
1.7 keys pattern                      , 查詢所有符合給定模式pattern的key
            ① *, ?, [m,n]
1.8 move key db                       , 將當前資料庫中的key移動資料庫 db中。使用select db可以切換資料庫
1.9 persist key                       , 移除給定 key 的生存時間
1.10 pexpire,pexpireat                , 設定key的過期、生存時間,單位毫秒
1.11 ttl,pttl                         , key的剩餘過期時間,單位秒,單位是毫秒
1.12 randomkey                        , 隨機返回一個key
1.13 rename key newkey                , 將 key 改名為 newkey ,當newkey存在時會覆蓋
1.14 renamenx key newkey              ,  當newkey不存在時,將key改名為newkey
1.15 sort key [by pattern] [get pattern [get pattern]] [limit offset count] [asc | desc] [alpha] [store destination]  ,排序,pattern可以有 *字元出現
1.16 type key                         ,  返回key所儲存的值的型別 (none,string,list,set,zset,hash)
1.17 scan [db] cursor [MATCH pattern] [COUNT count] ,增量式迭代。  類似有 sscan,hscan,zscan
          ① SCAN命令用於迭代當前資料庫中的資料庫鍵。   返回結果為:用於下一次迭代的新遊標;所有被迭代的元素
          ② SSCAN 命令用於迭代集合鍵中的 元素。
          ③ HSCAN 命令用於迭代雜湊鍵中的 鍵值對。
          ④ ZSCAN 命令用於迭代有序集合中的 元素(包括元素成員和元素分值)

二、String操作

2.1 append key value                 , 將value追加到原先值的末尾
2.2 bitcount key [start] [end]       , 計算給定字串中,設定為1的位元位的資料量。
      ① 注意字串"1"對應的十進位制為49,二進位制為00110001
      ② 可以通過setbit key offset value
2.3 bitop operation destkey key [key ...]  , 對key的二進位制字串進行元操作,operation可以是and,or, not,xor。
2.4 decr key                          , 將key中儲存的數字值減一
      ① 與incr命令相反
2.5 decrby key decrement              , 將key所儲存的值減去減量decrement
      ② 與incrby命令相反
2.6 get key
2.7 getbit key offset                 , 獲取key中所儲存字串值對應偏移量上的bit
2.8 getrange key start end            , 返回key中字串值的子字串
2.9 getset key value                  , 設定key的值為value,並返回key的舊值
2.10 mget key [key ...]               , 返回指定的多個key的值
2.11 mset key value [key value ...]   , 同時設定多個key-value值
2.12 msetnx key value [key value ...] , 當且僅當所有的key都不存在時,同時設定多個key-value對
2.13 set key value [EX second] [PX millisceonds] [NX|XX]
       ① setex key second value , 設定key的同時設定過期時間單位為秒
       ② psetex key millisceonds value , 過期時間單位為毫秒
③ setbit key offset value , 設定指定偏移量上的位
④ setnx key value , 當且僅當key不存在時設定key的value
⑤ setrange key offset value , 從offset開始,用value引數覆蓋key中的值
2.14 strlen key                      , 返回key中所存字串的長度

三、 Hash操作

3.1 hdel key field [field ...]       , 刪除雜湊表key中的一個或多個指定域
3.2 hexists key field                , 檢視雜湊表key中給定的field是否存在
3.3 hget key feild                   , 檢視雜湊表key中給定的field的值
      ① hgetall key , 檢視雜湊表key中所有的field的值
  ② hmget key field [field ...] , 返回雜湊表key中一個或多個給定域的值
3.4 hincrby key field increment      , 為雜湊表key中的field的值加上增量increment
3.5 hkeys key                        , 獲取雜湊表key中的所有域
3.6 hlen key                         , 返回雜湊表key中域的數量
3.7 hset key field value             , 設定雜湊表key中field的值
      ① hmset key field value [field value] , 同時設定過個field的值
  ② hsetnx key field value , 當field不存在時,設定field的值
3.8 hvals key                        , 返回雜湊表key中所有域的值
3.9 hstrlen key field                , 返回雜湊表key中給定field關聯值的字元長度

四、List操作(List相當於堆疊)

4.1 lpush key value [value ...]      , 將一個或者多個值插入到列表key的表頭
      ① rpush key value [value ...] , 將一個或者多個值插入到列表key的表尾
  ② lpushx key value ,當且僅當key存在時將值value插入到key的表頭
  ③ rpushx key value ,當且僅當key存在時將值value插入到key的表尾
4.2 lpop key                          , 移除並返回列表key的頭元素
      ① rpop key , 移除並返回列表的尾元素
  ② blpop key [key ...] timeout , lpop的阻塞式指令
  ③ brpop key [key ...] timeout , rpop的阻塞式指令
  ④ rpoplpush source destination , 將列表Source的尾元素彈出以及返回客戶端,並且將該元素插入到destination列表中
  ⑤ brpoplpush source destination timeout , rpoplpush的阻塞版
4.3 lindex key index                  , 返回key中下表為index的元素
4.4 linsert key before|after pivot value , 將值value插入到key中,位為pivot之前或者之後
4.5 llen key                           , 返回列表key的長度
4.6 lrange key start stop              , 返回列表key中指定區間內的元素
4.7 lrem key count value               , 根據count的值,移除列表中與引數value相等的元素
4.8 lset key index value               , 將列表key下表為index的元素值設定為value
4.9 ltrim key start stop               , 對一個列表進行trim

五、Set操作(不可重複)

5.1 sadd key member [member ...]       , 將元素加入到集合key中,已經有的忽略
5.2 scard key                          , 返回集合key的元素個數
5.3 sdiff key [key ...]                , 返回一個集合的全部成員,該集合是所有給定集合之間的差集
5.4 sdiffstore destination key [key ...] , 放回集合之間的差集,並將它儲存在destination集合中
5.5 sinter key [key ...]               ,返回集合中給定集合的交集
5.6 sinterstore destination key [key ...] , 返回給定集合之間的差集,並將它儲存在destination集合中
5.7 sismember key member               , 判斷member元素是否為集合key成員
5.8 smembers key                       , 返回集合中的所有成員
5.9 smove source destination member    , 將member元素從source集合移動到destination集合
5.10 spop key                          , 移除並返回集合中的一個隨機元素
5.11 srandmember key [count]           , 返回指定count個數的集合,count為正數表示不能重複,負數可以重複
5.12 srem key member [member ...]      , 移除集合key中的多個元素
5.13 sunion key [key ...]              , 返回所有指定key的並集
5.14 sunionstore destination key [key ...] 


六、ZADD操作(有序集合)

6.1 zadd key source member [[source member] [...]] , 將一個或者多個member元素及其score值加入到有序集合key中
6.2 zcard key                          , 返回有序集合key的元素個數
6.3 zcount key min max                 , 返回有序集合key中,score值在min和max之間的元素個數
6.4 zincrby key increment member       , 為有序集合key的成員member的score值加上增量increment
6.5 zrange key start stop              , 返回有序集key中,指定下標區間內的成員
  ① zrevrange key start stop [withscores] , 返回指定區間內的成員遞減順序
  ② zrevrangebyrank key max min [withscores] [limit offset count]
6.6 zrangebyscore key min max [withscopes] [limit offset count] , 返回score值介於min和max之間的集合
6.7 zrank key member                   , 返回有序集key中成員member的排名
  ① zrevrank key member          , 返回有序集key中成員member的遞減排名
6.8 zrem key member [member ...]       , 移除有序集key中的多個成員
      ① zremrangebyrank key start stop , 移除有序集key中,指定排名區間內的所有成員
  ② zremrangebyscore key min max , 移除有序集key中,指定score範圍內的成員
6.9 zscore key member                  , 返回成員member的score值

七、pub/sub(釋出、訂閱)

7.1 psubscribe pattern [pattern ...]   , 訂閱一個或者多個符合給定模式的頻道
7.2 publish channel message            , 將資訊message傳送到指定的頻道channel
7.3 pubsub <subcommand> [argument ...] , 檢視訂閱與釋出系統狀態的內省命令
  eg pubsub channels [pattern] , 列出當前的活躍頻道,訂閱模式的客戶端不計算在內
  eg pubsub numsub [channel-1 ...] , 返回給定頻道的訂閱者數量,訂閱模式的客戶端不計算在內
7.4 punsubscribe [pattern ...]          , 指示客戶端退訂所有給定模式
7.5 subscribe channel [channel ...]     , 訂閱給定的一個或者多個頻道資訊
7.6 unsubscribe [channel ...]           , 指示客戶端退訂給定的頻道

八、Transaction(事務)

8.1 discard                             , 取消執行事務塊內的所有命令
8.2 exec                                , 執行事務塊內的命令
8.3 multi                               , 標記一個事務塊的開始
8.4 unwatch                             , 取消watch命令對所有key的監視
8.5 watch key [key ...]                 , 監視一個或者多個key,如果事務執行之前,這個kye被其它命令所動,則事務被打斷

九、Connection(連線)

9.1 auth password                       , 登入redis時輸入密碼
9.2 echo message                        , 列印一個特定的資訊message,測試時使用
9.3 ping                                , 測試與伺服器的連線,如果正常則返回pong
9.4 quit                                , 請求伺服器關閉與當前客戶端的連線
9.5 select index                        , 切換到指定的資料庫

十、Server(伺服器)

10.1 bgsave                             , 後臺非同步儲存資料到硬碟
10.2 client setname/client getname      , 為連線設定、獲取名字
10.3 client kill ip:port                , 關閉地址為 ip:port的客戶端
10.4 client list                        , 以人類可讀的方式,返回所有的連線客戶端資訊和統計資料
10.5 config get parameter               , 取得執行redis伺服器的配置引數
10.6 config set parameter value         , 設定redis伺服器的配置引數
10.7 config resetstat                   , 重置info命令的某些統計資料
10.8 dbsize                             , 返回當前資料庫中key的數量
10.9 flushall                           , 清空整個redis伺服器的資料(刪除所有資料庫的所有 key)
10.10 flushdb                           , 清空當前資料庫中的所有key
10.11 info [section]                    , 返回redis伺服器的各種資訊和統計資料
10.12 lastsave                          , 返回最近一次redis成功將資料儲存到磁碟時的時間
10.13 monitor                           , 實時打印出redis伺服器接收到的指令
10.14 save                              , 將當前 Redis 例項的所有資料快照(snapshot)以 RDB 檔案的形式儲存到硬碟
10.15 slaveof host port                 , 將當前伺服器轉變為指定伺服器的從屬伺服器
10.16 slowlog subcommand [argument]     , Redis 用來記錄查詢執行時間的日誌系統

第二部分 redis的一些功能介紹

一、持久化

1.1 持久化方式:RDB與AOF。
①RDB:在指定的時間間隔內生成資料集的時間點快照(snapshot);
②AOF(append-only file):持久化記錄伺服器執行的所有寫操作命令,並在伺服器啟動時,通過重新執行這些命令來還原資料集。
③Redis支援同時使用AOF和RDB持久化。在這種情況下,當Redis重啟時,它會優先使用AOF檔案來還原資料集,因為AOF檔案儲存的資料集通常比RDB檔案所儲存的資料集更完整。
1.2 RDB持久化
   當 Redis 需要儲存 dump.rdb 檔案時, 伺服器執行以下操作:
①Redis 呼叫 fork()。
②子程序將資料集寫入到一個臨時 RDB 檔案中。
③當子程序完成對新 RDB 檔案的寫入時,Redis 用新 RDB 檔案替換原來的 RDB 檔案,並刪除舊的 RDB 檔案。
缺點:如果 Redis 因為某些原因而造成故障停機, 那麼伺服器將丟失最近寫入、且仍未儲存到快照中的那些資料。因此需要使用開啟AOF。
1.3 AOF重寫
①AOF的運作方式是不斷地將命令追加到檔案的末尾,所以隨著寫入命令的不斷增加,AOF檔案的體積也會變得越來越大。
②你可以配置 Redis 多久才將資料 fsync 到磁碟一次。有三個選項,每次有新命令追加到 AOF 檔案時就執行一次 fsync :非常慢,也非常安全;每秒 fsync 一次:足夠快(和使用 RDB 持久化差不多),並且在故障時只會丟失 1 秒鐘的資料;從不 fsync :將資料交給作業系統來處理。更快,也更不安全的選擇。
③AOF重寫步驟:
   (1)Redis 執行 fork() ,現在同時擁有父程序和子程序。
   (2)子程序開始將新 AOF 檔案的內容寫入到臨時檔案。
   (3)對於所有新執行的寫入命令,父程序一邊將它們累積到一個記憶體快取中,一邊將這些改動追加到現有AOF檔案的末尾:這樣即使在重寫的中途發生停機,現有的 AOF 檔案也還是安全的。
   (4)當子程序完成重寫工作時,它給父程序傳送一個訊號,父程序在接收到訊號之後,將記憶體快取中的所有資料追加到新 AOF 檔案的末尾。
   (5)搞定!現在 Redis 原子地用新檔案替換舊檔案,之後所有命令都會直接追加到新 AOF 檔案的末尾。
④從RDB持久化到AOF持久化切換
    (1)為最新的 dump.rdb 檔案建立一個備份。
             (2)將備份放到一個安全的地方。
             (3)執行以下兩條命令:
                      CONFIG SET appendonly yes
                      CONFIG SET save ""    //關閉RDB功能
1.4 資料備份
①建立一個定期任務(cron job)每小時將一個RDB檔案備份到一個資料夾,並且每天將一個RDB檔案備份到另一個資料夾。 ②確保快照的備份都帶有相應的日期和時間資訊,每次執行定期任務指令碼時,使用find命令來刪除過期的快照:比如說,你可以保留最近48小時內的每小時快照,還可以保留最近一兩個月的每日快照。
        ③至少每天一次,將RDB備份到你的資料中心之外,或者至少是備份到你執行Redis伺服器的物理機器之外。

二、Sentinel

2.1 Redis的Sentinel系統用於管理多個Redis伺服器,該系統執行以下三個任務
①監控(Monitoring):Sentinel 會不斷地檢查你的主伺服器和從伺服器是否運作正常。
②提醒(Notification):當被監控的某個Redis伺服器出現問題時,Sentinel可以通過API向管理員或者其他應用程式傳送通知。
③自動故障遷移(Automatic failover):當一個主伺服器不能正常工作時,Sentinel會開始一次自動故障遷移操作,它會將失效主伺服器的其中一個從伺服器升級為新的主伺服器,並讓失效主伺服器的其他從伺服器改為複製新的主伺服器;當客戶端試圖連線失效的主伺服器時,叢集也會向客戶端返回新主伺服器的地址,使得叢集可以使用新主伺服器代替失效伺服器。
2.2 啟動 Sentinel
①redis-sentinel /path/to/sentinel.conf
②redis-server /path/to/sentinel.conf --sentinel
2.3 配置 Sentinel
sentinel monitor mymaster 127.0.0.1 6379 2   //配置指示 Sentinel 去監視一個名為 mymaster 的主伺服器。這個主伺服器的 IP 地址為 127.0.0.1 , 埠號為 6379 , 而將這個主伺服器判斷為失效至少需要 2 個 Sentinel 同意
sentinel down-after-milliseconds mymaster 60000  //選項指定了 Sentinel 認為伺服器已經斷線所需的毫秒數
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1    //選項指定了在執行故障轉移時, 最多可以有多少個從伺服器同時對新的主伺服器進行同步

sentinel monitor resque 192.168.1.3 6380 4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5
2.4 主客觀下線
①主觀下線(Subjectively Down,簡稱SDOWN)指的是單個 Sentinel 例項對伺服器做出的下線判斷。
②客觀下線(Objectively Down,簡稱ODOWN)指的是多個 Sentinel 例項在對同一個伺服器做出 SDOWN 判斷,並且通過SENTINEL is-master-down-by-addr命令互相交流之後,得出的伺服器下線判斷。(一個 Sentinel 可以通過向另一個 Sentinel傳送SENTINEL is-master-down-by-addr命令來詢問對方是否認為給定的伺服器已下線。)
2.5 Sentinel需要定期執行的任務
①每個Sentinel以每秒鐘一次的頻率向它所知的主伺服器、從伺服器以及其他 Sentinel 例項傳送一個 PING 命令。
②如果一個例項(instance)距離最後一次有效回覆 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 那麼這個例項會被 Sentinel 標記為主觀下線。 一個有效回覆可以是: +PONG 、 -LOADING 或者 -MASTERDOWN 。
③如果一個主伺服器被標記為主觀下線,那麼正在監視這個主伺服器的所有 Sentinel 要以每秒一次的頻率確認主伺服器的確進入了主觀下線狀態。
④如果一個主伺服器被標記為主觀下線,並且有足夠數量的Sentinel(至少要達到配置檔案指定的數量)在指定的時間範圍內同意這一判斷,那麼這個主伺服器被標記為客觀下線。
⑤在一般情況下,每個 Sentinel 會以每10秒一次的頻率向它已知的所有主伺服器和從伺服器傳送INFO命令。 當一個主伺服器被Sentinel標記為客觀下線時,Sentinel 向下線主伺服器的所有從伺服器傳送 INFO 命令的頻率會從 10 秒一次改為每秒一次。
⑥當沒有足夠數量的 Sentinel 同意主伺服器已經下線, 主伺服器的客觀下線狀態就會被移除。 當主伺服器重新向 Sentinel 的 PING 命令返回有效回覆時, 主伺服器的主觀下線狀態就會被移除。
2.6 Sentinel API
①主要有兩種:(1)通過直接傳送命令來查詢被監視 Redis 伺服器的當前狀態;(2)使用釋出與訂閱功能, 通過接收 Sentinel 傳送的通知。
②Sentinel命令
(1)PING :返回 PONG 。
(2)SENTINEL masters :列出所有被監視的主伺服器,以及這些主伺服器的當前狀態。
(3)SENTINEL slaves <master name> :列出給定主伺服器的所有從伺服器,以及這些從伺服器的當前狀態。
(4)SENTINEL get-master-addr-by-name <master name> 返回給定名字的主伺服器的IP地址和埠號。如果這個主伺服器正在執行故障轉移操作,或者針對這個主伺服器的故障轉移操作已經完成, 那麼這個命令返回新的主伺服器的 IP地址和埠號。
(5)SENTINEL reset <pattern> : 重置所有名字和給定模式 pattern 相匹配的主伺服器。 pattern 引數是一個 Glob 風格的模式。 重置操作清除主伺服器目前的所有狀態, 包括正在執行中的故障轉移, 並移除目前已經發現和關聯的, 主伺服器的所有從伺服器和 Sentinel 。
(6)SENTINEL failover <master name> : 當主伺服器失效時, 在不詢問其他 Sentinel 意見的情況下, 強制開始一次自動故障遷移 (不過發起故障轉移的 Sentinel 會向其他 Sentinel 傳送一個新的配置,其他 Sentinel 會根據這個配置進行相應的更新)。
③釋出與訂閱資訊
客戶端可以將 Sentinel 看作是一個只提供了訂閱功能的Redis伺服器:你不可以使用 PUBLISH命令向這個伺服器傳送資訊,但你可以用SUBSCRIBE命令或者PSUBSCRIBE 命令, 通過訂閱給定的頻道來獲取相應的事件提醒。
客戶端可以通過訂閱來獲得的頻道和資訊的格式:第一個英文單詞是頻道/事件的名字
<instance-type> <name> <ip> <port> @ <master-name> <master-ip> <master-port>


三、redis叢集

3.1 Redis 叢集是一個可以在多個 Redis 節點之間進行資料共享的設施
   notice :Redis 叢集不支援那些需要同時處理多個鍵的 Redis 命令, 因為執行這些命令需要在多個 Redis 節點之間移動資料, 並且在高負載的情況下, 這些命令將降低 Redis 叢集的效能,並導致不可預測的行為。
3.2 redis叢集好處,Redis 叢集提供了以下兩個好處:
將資料自動切分(split)到多個節點的能力。
當叢集中的一部分節點失效或者無法進行通訊時, 仍然可以繼續處理命令請求的能力。
3.3 redis叢集資料共享
   ①Redis 叢集使用資料分片(sharding)而非一致性雜湊(consistency hashing)來實現: 一個 Redis 叢集包含 16384 個雜湊槽(hash slot), 資料庫中的每個鍵都屬於這 16384 個雜湊槽的其中一個, 叢集使用公式 CRC16(key) % 16384 來計算鍵 key 屬於哪個槽, 其中 CRC16(key) 語句用於計算鍵 key 的 CRC16 校驗和。
②將一個雜湊槽從一個節點移動到另一個節點不會造成節點阻塞, 所以無論是新增新節點還是移除已存在節點, 又或者改變某個節點包含的雜湊槽數量, 都不會造成叢集下線。
3.4 叢集的主從複製
為了使得叢集在一部分節點下線或者無法與叢集的大多數(majority)節點進行通訊的情況下,仍然可以正常運作,Redis叢集對節點使用了主從複製功能:叢集中的每個節點都有 1 個至 N 個複製品(replica),其中一個複製品為主節點(master),而其餘的 N-1個複製品為從節點(slave)。
3.5 節點屬性
   ①每個節點在叢集中都有一個獨一無二的 ID ,該ID是一個十六進位制表示的160位隨機數,在節點第一次啟動時由 /dev/urandom 生成。
節點資訊:  節點所使用的 IP 地址和 TCP 埠號。
節點的標誌(flags)。
節點負責處理的雜湊槽。
節點最近一次使用叢集連線傳送 PING 資料包(packet)的時間。
節點最近一次在回覆中接收到 PONG 資料包的時間。
叢集將該節點標記為下線的時間。
該節點的從節點數量。
如果該節點是從節點的話,那麼它會記錄主節點的節點 ID 。如果這是一個主節點的話,那麼主節點 ID 這一欄的值為 0000000 。
eg  redis-cli cluster nodes
d1861060fe6a534d42d8a19aeb36600e18785e04 :0 myself - 0 1318428930 connected 0-1364
3886e65cc906bfd9b1f7e7bde468726a052d1dae 127.0.0.1:6380 master - 1318428930 1318428931 connected 1365-2729
d289c575dcbc4bdd2931585fd4339089e461a27d 127.0.0.1:6381 master - 1318428931 1318428931 connected 2730-4095
3.6 叢集線上重配置
①redis叢集支援在叢集執行的過程中過程中新增或者移除節點
新增一個新節點到叢集, 等於將其他已存在節點的槽移動到一個空白的新節點裡面。
從叢集中移除一個節點, 等於將被移除節點的所有槽移動到叢集的其他節點上面去。
②CLUSTER命令可用的子命令:當槽被指派或者移除之後,節點會將這一資訊通過Gossip協議傳播到整個叢集
CLUSTER ADDSLOTS slot1 [slot2] ... [slotN]   //向節點新增槽
CLUSTER DELSLOTS slot1 [slot2] ... [slotN]   //向節點刪除槽
CLUSTER SETSLOT slot NODE node               //將指定的槽指派給節點node
CLUSTER SETSLOT slot MIGRATING node    //將給定節點 node 中的槽 slot 遷移出節點
CLUSTER SETSLOT slot IMPORTING node  // 將給定槽 slot 匯入到節點 node

四、Redis過期鍵刪除策略

  • 被動刪除:當讀/寫一個已經過期的key時,會觸發惰性刪除策略,直接刪除掉這個過期key
  • 主動刪除:由於惰性刪除策略無法保證冷資料被及時刪掉,所以Redis會定期主動淘汰一批已過期的key
  • 當前已用記憶體超過maxmemory限定時,觸發主動清理策略
        4.1 被動刪除
只有key被操作時(如GET),REDIS才會被動檢查該key是否過期,如果過期則刪除之並且返回NIL。
1、這種刪除策略對CPU是友好的,刪除操作只有在不得不的情況下才會進行,不會其他的expire key上浪費無謂的CPU時間。2、但是這種策略對記憶體不友好,一個key已經過期,但是在它被操作之前不會被刪除,仍然佔據記憶體空間。如果有大量的過期鍵存在但是又很少被訪問到,那會造成大量的記憶體空間浪費。
4.2 主動刪除
相當於一個定時任務,主動掃描過期的key。
4.3 主動清除策略
當前已用記憶體超過maxmemory的限定後,主動觸發清除策略。當mem_used記憶體已經超過maxmemory的設定,對於所有的讀寫請求,都會觸發函式以清理超出的記憶體。注意這個清理過程是阻塞的,直到清理出足夠的記憶體空間。所以如果在達到maxmemory並且呼叫方還在不斷寫入的情況下,可能會反覆觸發主動清理策略,導致請求會有一定的延遲。
noeviction:當到達記憶體限制時返回錯誤。當客戶端嘗試執行命令時會導致更多記憶體佔用(大多數寫命令,除了 DEL 和一些例外)。
allkeys-lru:回收最近最少使用(LRU)的鍵,為新資料騰出空間。
volatile-lru:回收最近最少使用(LRU)的鍵,但是隻回收有設定過期的鍵,為新資料騰出空間。
allkeys-random:回收隨機的鍵,為新資料騰出空間。
volatile-random:回收隨機的鍵,但是隻回收有設定過期的鍵,為新資料騰出空間。
volatile-ttl:回收有設定過期的鍵,嘗試先回收離 TTL 最短時間的鍵,為新資料騰出空間。