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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] ### **什么是Redis的對象系統** ***** #### **對象系統簡介** Redis并沒有直接使用這些數據結構來實現鍵值對數據庫,而是基于這些數據結構創建了一個對象系統,這個系統包含字符串對象、列表對象、哈希對象、集合對象和有序集合對象這五種類型的對象,每種對象都用到了至少一種我們前面所介紹的數據結構。 ` ` #### **對象系統的好處** * Redis可以在執行命令之前,根據對象的類型來判斷一個對象是否可以執行給定的命令。 * 我們可以針對不同的使用場景,為對象設置多種不同的數據結構實現,從而優化對象在不同場景下的使用效率. >Redis的對象系統還實現了基于引用計數技術的內存回收機制,當程序不再使用某個對象的時候,這個對象所占用的內存就會被自動釋放;另外,Redis還通過引用計數技術實現了對象共享機制,這一機制可以在適當的條件下,通過讓多個數據庫鍵共享同一個對象來節約內存 ` ` ### **Redis對象的原理** ***** #### **對象的類型與編碼** ***** Redis使用對象來表示數據庫中的鍵和值,每次當我們在Redis的數據庫中新創建一個鍵值對時,我們至少會創建兩個對象,一個對象用作鍵值對的鍵(鍵對象),另一個對象用作鍵值對的值(值對象)。 ` ` 示例: `SET`設置鍵值對的鍵是一個包含了字符串值"msg"的對象,而鍵值對的值則是一個包含了字符串值"hello world"的對象: ``` redis>?SET?msg?"hello?world" OK ``` Redis中的每個對象都由一個redisObject結構表示,該結構中和保存數據有關的三個屬性分別是type屬性、encoding屬性和ptr屬性: ``` typedef?struct?redisObject?{ ????//? 類型 ????unsigned?type:4; ????//? 編碼 ????unsigned?encoding:4; ?//?指向底層實現數據結構的指針 ????void?*ptr; ????//?... }?robj; ``` ` ` ##### **類型** 對象的type屬性記錄了對象的類型: ![GZ0hZV.png](https://s1.ax1x.com/2020/03/29/GZ0hZV.png) ` ` 對于Redis數據庫保存的鍵值對來說,鍵總是一個字符串對象,而值則可以是字符串對象、列表對象、哈希對象、集合對象或者有序集合對象的其中一種,因此: * 當我們稱呼一個數據庫鍵為“**字符串鍵**”時,我們指的是“這個數據庫鍵所對應的值為**字符串對象**”; * 當我們稱呼一個鍵為“**列表鍵**”時,我們指的是“這個數據庫鍵所對應的值為**列表對象**”。` ` TYPE命令的實現方式也與此類似,當我們對一個數據庫鍵執行TYPE命令時,命令返回的結果為數據庫鍵對應的值對象的類型,而不是鍵對象的類型: ``` # 鍵為字符串對象,值為字符串對象 redis>?SET?msg?"hello?world" OK redis>?TYPE?msg string # 鍵為字符串對象,值為列表對象 redis>?RPUSH?numbers?1?3?5 (integer)?6 redis>?TYPE?numbers list #? 鍵為字符串對象,值為哈希對象 redis>?HMSET?profile?name?Tom?age?25?career?Programmer OK redis>?TYPE?profile hash #? 鍵為字符串對象,值為集合對象 redis>?SADD?fruits?apple?banana?cherry (integer)?3 redis>?TYPE?fruits set #? 鍵為字符串對象,值為有序集合對象 redis>?ZADD?price?8.5?apple?5.0?banana?6.0?cherry (integer)?3 redis>?TYPE?price zset ``` TYPE命令在面對不同類型的值對象時所產生的輸出: ![GZBQQs.png](https://s1.ax1x.com/2020/03/29/GZBQQs.png) ` ` ##### **編碼和底層實現** 對象的ptr指針指向對象的底層實現數據結構,而這些數據結構由對象的encoding屬性決定。 encoding屬性記錄了對象所使用的編碼,也即是說這個對象使用了什么數據結構作為對象的底層實現,這個屬性的值可以是下表列出的常量的其中一個: ![GZBWSH.png](https://s1.ax1x.com/2020/03/29/GZBWSH.png) ` ` ### **Redis對象的應用場景** *****
                  <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>

                              哎呀哎呀视频在线观看