天天看點

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 最短時間的鍵,為新資料騰出空間。

原文位址:https://blog.csdn.net/u013758116/article/details/53433997

繼續閱讀