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

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                >[info] set 數據類型與結構 **set類型介紹:** redis集合(set)類型和list列表類型類似,都可以用來存儲多個字符串元素的集合。但是和list不同的是set集 合當中不允許重復的元素。而且set集合當中元素是沒有順序的,不存在元素下標。 ***** redis的set類型是使用哈希表構造的,因此復雜度是O(1),它支持集合內的增刪改查,并且支持多個集合間 的交集、并集、差集操作。可以利用這些集合操作,解決程序開發過程當中很多數據集合間的問題。 ***** **set 數據類型的實現:** Set數據類型的內部編碼有兩種: 1. Intset(整數集合):當集合元素個數小于set-max-ziplist-entries配置(默認512個),redis會使用intset作為集合的內部實現來減少內存的使用 2. Hashtable(哈希表):當集合類型無法滿足intset的條件時,redis會使用hashtable作為集合的內部實現 ***** **交集、差集、并集:** ![](https://img.kancloud.cn/22/89/22892fa93e5f7c6e06d4e3b908aad9b1_866x449.png) ***** **Sadd命令:** 將一個或者多個元素假如到集合當中,假如假如的元素已經存在在集合當中,則不會添加。假如 key不存在,則直接參加一個key,并加入元素。 ``` 127.0.0.1:6379> sadd dbset mysql oracle redis (integer) 3 127.0.0.1:6379> ``` ![](https://img.kancloud.cn/36/c7/36c78282d2303399157730497370d993_450x79.png) ***** **Smembers 命令:** 將返回集合中的所有的成員。 ``` 127.0.0.1:6379> smembers dbset 1) "oracle" 2) "mysql" 3) "redis" 127.0.0.1:6379> ``` ![](https://img.kancloud.cn/b2/cd/b2cdeed457bfb19780a1b0981b84e917_312x92.png) ***** **Scard 命令:** 返回集合中元素的個數。 ``` 127.0.0.1:6379> scard dbset (integer) 3 127.0.0.1:6379> ``` ![](https://img.kancloud.cn/39/ff/39ff513f3b60b4ffef288342931f6605_258x63.png) ***** **Sismember(查詢) 命令:** 判斷指定的值是否是集合的成員,假如不是集合的成員,或 key 不存在,返回 0 。 ``` 127.0.0.1:6379> sismember dbset oracle (integer) 1 127.0.0.1:6379> sismember dbset test (integer) 0 127.0.0.1:6379> ``` ![](https://img.kancloud.cn/2d/9b/2d9b20ae4f24b99ccea440e42b83af9c_355x100.png) ***** **Srem(移除)命令:** 用于移除集合元素中一個或者多個元素,假如要移除的元素不存在,默認不處理。 ``` 127.0.0.1:6379> srem dbset oracle (integer) 1 127.0.0.1:6379> smembers dbset 1) "mysql" 2) "redis" 127.0.0.1:6379> ``` ***** **Sinter(交集) 命令:** 返回給定所有給定集合的交集。 不存在的集合 key 被視為空集。 當給定集合當中有一個空集 時,結果也為空集。(返回兩個集合交集) ``` 127.0.0.1:6379> sadd dbset1 mysql redis memcache orcle (integer) 4 127.0.0.1:6379> sinter dbset dbset1 1) "mysql" 2) "redis" 127.0.0.1:6379> ``` ***** **. sdiff(差集)命令:** 同理,返回指定集合之間的差集。 ``` 127.0.0.1:6379> sadd dbset sqlserver (integer) 1 127.0.0.1:6379> sdiff dbset dbset1 1) "sqlserver" 127.0.0.1:6379> ``` ***** **Sunion(并集) 命令:** 返回給定集合的并集。同理,不存在的集合 key 被視為空集。 ``` 127.0.0.1:6379> sunion dbaset dbset1 1) "memcache" 2) "mysql" 3) "redis" 4) "orcle" 127.0.0.1:6379> ``` ***** **Sscan 命令:** 用于迭代集合中元素,取出匹配條件的元素 ``` 127.0.0.1:6379> sscan dbset 0 match my* 1) "0" 2) 1) "mysql" 127.0.0.1:6379> ``` ***** >[info] redis 慢查詢(針對第3步:命令執行時間) 許多存儲系統(例如MySQL)提供慢查詢日志幫助開發和運維人員定位系統存在的慢操作。**所謂慢查詢日 志就是系統在命令執行前后計算每條命令的執行時間,當超過預設閾值**,就將這條命令的相關信息 (例如:發生時間、耗時、命令的詳細信息)記錄下來,Redis也提供了類似的功能。 ***** **Redis命令的執行過程:** ![](https://img.kancloud.cn/83/1b/831b56129a4c1e359188c4c173ff589b_1497x716.png) ***** **慢查詢日志的參數:** **slowlog-log-slower-than:** 指定執行時間超過多少微秒(1秒等于1000000微秒) 的命令請求會被記錄到日志上。 ``` 舉個例子,如果這個選項值為100,那么執行時間超過100微秒的命令就會被記錄到慢查詢日志;如 果這個選項值為500,那么執行時間超過500微秒的命令就會被記錄到慢查詢日志。 ``` **slowlog-max-len:** 指定服務器最多保存多少條慢查詢操作,服務器先進先出的方式保存多條慢查詢日志, 當服務器存儲的慢查詢數量等于slowlog-log-len選項值時,服務器在添加一條新的慢查詢日志之前,會先將 對舊的一條慢日志先刪除。 ``` 舉個例子,如果服務器slowlog-log-len的值為100,并且假設服務器已經存儲了100條慢查詢日志, 那么如果服務器打算添加一條新的慢查詢日志的話,他就必須先刪除目前保存的最舊的那條日志, 然后在添加新日志。 ``` ***** **實際現象如下:** 先使用config set命令將slow-log-slower-than參數的設置為0微秒,這樣redis服務器執行的任何 命令都會記錄到慢查詢日志中。 接著把slowlog-max-len 參數的值設置的5,讓服務器最多只保存5條慢查詢記錄 ``` 127.0.0.1:6379> config set slowlog-log-slower-than 0 OK 127.0.0.1:6379> config set slowlog-max-len 5 OK 127.0.0.1:6379> slowlog get ``` ***** 下面我們使用redis客戶端發送幾個請求: ``` 127.0.0.1:6379> set msg "hello world" OK 127.0.0.1:6379> set number 10086 OK 127.0.0.1:6379> set database "Redis" OK 127.0.0.1:6379> set sql mysql OK 127.0.0.1:6379> set nosql memcache OK ``` ***** 然后使用slowlog get來查看服務器所保存的慢查詢日志: ``` 127.0.0.1:6379> slowlog get ``` ***** **慢查詢日志的保存:** ![](https://img.kancloud.cn/87/d0/87d0ae54a51870dec04d2a360cdfa4fa_1689x663.png) ***** 服務器狀態中包含了幾個慢查詢日志功能有關的屬性: ``` struct redisServer { //... // 下一個慢查詢日志的ID long long slowlog_entry_id; // 保存了所有查詢日志的鏈表 list *slowlog; // 服務器配置slowlog-log-slower-than選項的值 long long slowlog_log_slower_than; // 服務器配置slowlog-max-len的值 unsigned long slowlog_max_len; } ``` slowlog_entry_id屬性的初始值為0,每當創建一天新的慢查詢日志時,這個屬性值就會作用到新日志的id 值,之后程序會對這個屬性的值增一。 ***** >[info] pipeline(管道) 我們知道redis的客戶端和服務器之間是通過TCP協議連接的,不論是客戶端向redis發送命令還是客戶端接收 redis的執行結果,都需要網絡通信,都需要一定時間,由于網絡性能的不同往返時間也不同,大致的來說 這個時間相當于redis處理一條簡單命令(比如插入一個值到鏈表)的時間。如果我們執行較多的命令,一 來一回,這個往返時間累加起來還是對性能有一定影響的。 ***** 由于redis是單線程,所以在執行多個命令時,都需要等待上一條命令執行完,才能執行下一條命令。因 此,redis底層通信協議提供了對管道技術的支持。通過管道可以一次性發送多條命令并在執行完后一次性 將結果返回,當一組命令中每條命令都不依賴于之前命令的執行結果時就可以將這組命令一起通過管道發 出。管道通過減少客戶端與Redis的通信次數來實現降低往返時延累計值的目的 ***** **不使用管道:** redis 是單線程,每次發送1條,會造成各種性能問題。 ![](https://img.kancloud.cn/c9/ea/c9ead75b25e267bf16a386a0ed88ea70_1066x610.png) ***** ~~~ <?php $stime=microtime(true); //獲取程序開始執行的時間 echo '開始內存:'.memory_get_usage(), ''; echo PHP_EOL; $redis = new \Redis(); $redis->connect('192.168.29.108',6379); $redis->auth("root"); $t1 = time(); for($i= 0; $iset("key::$i",str_pad($i,4,'0',0)); $redis->get("key::$i"); } $etime=microtime(true);//獲取程序執行結束的時間 $total=($etime-$stime); //計算差值 echo "[頁面執行時間:{$total} ]s"; echo PHP_EOL; echo '運行后內存:'.memory_get_usage(), ''; echo PHP_EOL; ?> ~~~ ***** **使用管道:** 一次性將一組命令發送給redis,一次性返回結果。 缺點:不具備原子性,內存消耗大。 ![](https://img.kancloud.cn/1c/c1/1cc11015f62ca72ad4ded03babd1f2f1_1632x640.png) ***** ``` <?php $stime=microtime(true); //獲取程序開始執行的時間 echo '開始內存:'.memory_get_usage(), ''; echo PHP_EOL; $redis = new \Redis(); $redis->connect('192.168.29.108',6379); $redis->auth("root"); //$pipe=$redis->multi($redis::PIPELINE);//將多個操作當成一個事務執行 $pipe=$redis->pipeline();//(多條)執行命令簡單的,更加快速的發送給服務器,但是沒有任何原子 性的保證 for($i= 0; $i<10000 ; $i++) { $pipe->set("key::$i",str\_pad($i,4,'0',0)); $pipe->get("key::$i"); } $replies=$pipe->exec(); $etime=microtime(true);//獲取程序執行結束的時間 $total=($etime-$stime); //計算差值 echo "[頁面執行時間:{$total} ]s"; echo PHP_EOL; echo '運行后內存:'.memory_get_usage(), ''; echo PHP_EOL; ?> ``` *****
                  <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>

                              哎呀哎呀视频在线观看