<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### 3.1.3 數據庫鍵空間(key space) `server.h/redisDb`結構中的dict稱為數據庫鍵空間,保存了數據庫的所有鍵值對,鍵為字符串對象,值為任意對象 ```c typedef struct redisDb { dict *dict; // 數據庫鍵空間,保存所有鍵值對,鍵為字符串對象,值為任意對象 dict *expires; /* Timeout of keys with a timeout set */ dict *blocking_keys; /* Keys with clients waiting for data (BLPOP)*/ dict *ready_keys; /* Blocked keys that received a PUSH */ dict *watched_keys; /* WATCHED keys for MULTI/EXEC CAS */ int id; /* Database ID */ long long avg_ttl; /* Average TTL, just for stats */ list *defrag_later; /* List of key names to attempt to defrag one by one, gradually. */ } redisDb; ``` 鍵空間的增刪改查都同dict操作,此外還有: - 清空鍵空間:`FlushDb` - 從鍵空間隨機返回一個鍵:`RandomKey` - 返回數據庫鍵數量:`DbSize` - 還有`Exists`、`Rename`、`Keys`等 ---- 讀寫鍵空間時的維護操作如下: - 讀取一個鍵后(讀寫操作都會對鍵進行讀取),服務器會根據鍵是否存在,更新`hit`(命中)和`miss`(未命中),這兩個值可以通過`info status`命令查看 - 在讀取一個鍵后,服務器會更新鍵的`lru`(最后一次更新時間)屬性,可以通過`object idleime <key>`命令查看某個鍵的閑置時間 - 讀取一個鍵時,如果發現其已過期,會先刪除再進行其他操作 - 每次修改一個鍵后,會對`dirty`(臟計數器)加1,這個計數器會觸發服務器的持久化以及復制操作 - 如果開啟了服務器通知功能,在對鍵進行修改之后,服務器將按照配置發送相應的數據庫通知 ---- 設置鍵的生存時間和過期時間: - 通過`Expire`和`PExpire`,客戶端能以秒或毫秒的精度為數據庫中的某個鍵設置`ttl`(Time To Live,生存時間),服務器會自動刪除生存時間為0的鍵 - 與此類似,可以通過`ExpireAt`和`PExpireAt`設置過期時間,過期時間是一個UNIX時間戳,當過期時間來臨時,服務器會自動刪除該鍵。 - `ttl`和`pttl`接收一個帶有生存時間或過期時間的鍵,返回這個鍵的剩余生存時間。 - `setex` 命令可以再設置一個字符串鍵的同時為鍵設置過期時間,這是一個類型限定的命令,其原理與`Expire`完全一樣。 其中,`EXPIRE`命令將轉成`PEXPIRE`命令,`PEXPIRE`和`EXPIREAT`都將轉成`PEXPIREAT`命令。 ---- redisDb結構的expires字典保存了數據庫中所有鍵的過期時間,稱為`過期字典` - 過期字典的鍵是一個指針,指向鍵空間的某個對象 - 過期字典的值是一個`long long`類型的整數,保存了過期時間(毫秒精度的UNIX時間戳) ---- `PPERSIST`命令可以移除一個鍵的過期時間,如`PERSIST <key>`,底層是將字典中的key移除。 ---- 過期時間的判定: - 檢查給定鍵是否存在于過期字典,如果存在則取得其過期時間 - 檢查當前UNIX時間戳是否大于鍵的過期時間:如果是的話,那么鍵已過期,否則的話,鍵未過期。 ---- 過期鍵的刪除策略: - 定時刪除:在設置鍵的過期時間的同時,創建一個定時器(Timer),讓定時器在鍵的過期時間來臨時,立即執行對鍵的刪除操作。 - 對內存最友好,對CPU最不友好 - 惰性刪除:放任鍵過期不管,但是每次從鍵空間中獲取鍵時,都檢查取得的鍵是否過期,如果過期的話,就刪除鍵。 - 對CPU最友好,對內存最不友好 - 由`db.c/expireIfNeed`函數實現 - 定期刪除:每隔一段時間,程序就對數據庫進行一次檢查,刪除里面的過期鍵,具體由算法決定。 - 難點是確定刪除操作執行的時長和頻率 - 由`server.c/activeExpireCycle`函數實現
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看