<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智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                Redis鍵空間通知 Keyspace Notification 事件訂閱 ## 概述 本文所說的定時任務或者說計劃任務并不是很多人想象中的那樣,比如說每天凌晨三點自動運行起來跑一個腳本。這種都已經爛大街了,隨便一個 Crontab 就能搞定了。 這里所說的定時任務可以說是計時器任務,比如說用戶觸發了某個動作,那么從這個點開始過二十四小時我們要對這個動作做點什么。那么如果有 1000 個用戶觸發了這個動作,就會有 1000 個定時任務。于是這就不是 Cron 范疇里面的內容了。 ? ? ? ?舉個最簡單的例子,一個用戶推薦了另一個用戶,我們定一個二十四小時之后的任務,看看被推薦的用戶有沒有來注冊,如果沒注冊就給他搞一條短信過去。 ## 功能概覽 鍵空間通知使得客戶端可以通過訂閱頻道或模式, 來接收那些以某種方式改動了 Redis 數據集的事件。事件通過 Redis 的訂閱與發布功能(pub/sub)來進行分發, 因此所有支持訂閱與發布功能的客戶端都可以在無須做任何修改的情況下, 直接使用鍵空間通知功能。 ## 鍵空間消息 在 Redis 的 2.8.0 版本之后,其推出了一個新的特性——鍵空間消息(Redis Keyspace Notifications),它配合 2.0.0 版本之后的 SUBSCRIBE 就能完成這個定時任務的操作了,不過定時的單位是秒。 #### Publish / Subscribe? Redis 在 2.0.0 之后推出了 Pub / Sub 的指令,大致就是說一邊給 Redis 的特定頻道發送消息,另一邊從 Redis 的特定頻道取值——形成了一個簡易的消息隊列。 #### Redis Keyspace Notifications 在 Redis 里面有一些事件,比如鍵到期、鍵被刪除等。然后我們可以通過配置一些東西來讓 Redis 一旦觸發這些事件的時候就往特定的 Channel 推一條消息。 大致的流程就是我們給 Redis 的某一個 db 設置過期事件,使其鍵一旦過期就會往特定頻道推消息,我在自己的客戶端這邊就一直消費這個頻道就好了。 以后一來一條定時任務,我們就把這個任務狀態壓縮成一個鍵,并且過期時間為距這個任務執行的時間差。那么當鍵一旦到期,就到了任務該執行的時間,Redis 自然會把過期消息推去,我們的客戶端就能接收到了。這樣一來就起到了定時任務的作用。 ## 配置 因為開啟鍵空間通知功能需要消耗一些 CPU , 所以在默認配置下, 該功能處于關閉狀態。可以通過修改?`redis.conf`?文件, 或者直接使用?CONFIG?SET?命令來開啟或關閉鍵空間通知功能。 * 當?`notify-keyspace-events?`選項的參數為空字符串時,功能關閉。 * 當參數不是空字符串時,功能開啟。 > `notify-keyspace-events`?的參數可以是以下字符的任意組合, 它指定了服務器該發送哪些類型的通知 ![](https://img.kancloud.cn/d6/dc/d6dcbf5ba3e41f7b6ac73d08bd626cca_662x639.png) 輸入的參數中至少要有一個?K?或者?E?, 否則的話, 不管其余的參數是什么, 都不會有任何通知被分發。舉個例子, 如果只想訂閱鍵空間中和列表相關的通知, 那么參數就應該設為?Kl?, 諸如此類。 #### 具體配置 首先找到redis.conf配置文件,打開文件,查找`notify-keyspace-events`,將前面的`#`去掉即可。 ![](https://img.kancloud.cn/18/95/1895b09cbcd6c45e71eee1fecd600b2f_767x82.png) >注意:這里配置的是`notify-keyspace-events`的`Ex`參數,即說明,當鍵過期的時候會觸發通知,如果只需要哈希命令鍵觸發通知則可以設置為`notify-keyspace-events Eh`。 配置完成重啟`redis-server`即可 ## 使用 #### 命令行 開啟一個終端,redis-cli 進入 redis 。開始訂閱所有操作,等待接收消息。 ``` 127.0.0.1:6379> psubscribe __keyevent@0__:expired Reading messages... (press Ctrl-C to quit) 1) "psubscribe" 2) "__keyevent@0__:expired" 3) (integer) 1 ``` 再開啟一個終端,redis-cli 進入 redis,新增一個 20秒過期的鍵 ``` 127.0.0.1:6379> SETEX username 30 Tinywan OK 127.0.0.1:6379> get username "Tinywan" 127.0.0.1:6379> TTL username (integer) 25 127.0.0.1:6379> ``` 另外一邊執行了阻塞訂閱操作后的終端,20秒過期后有如下信息輸出: ``` 127.0.0.1:6379> psubscribe __keyevent@0__:expired Reading messages... (press Ctrl-C to quit) 1) "psubscribe" 2) "__keyevent@0__:expired" 3) (integer) 1 1) "pmessage" 2) "__keyevent@0__:expired" 3) "__keyevent@0__:expired" 4) "username" ``` 輸出以上信息,說明對過期Key信息的訂閱是成功的。 發布訂閱截圖 ![](https://img.kancloud.cn/89/20/8920aa92ba574a6d828186ca9cb44965_1695x381.png) ### 代碼 Redis實例類RedisInstance ```php <?php /** * @desc RedisInstance.php 描述信息 * @author Tinywan(ShaoBo Wan) * @date 2024/6/26 21:36 */ declare(strict_types=1); class RedisInstance { private Redis $redis; /** * @param string $host * @param int $port * @throws RedisException */ public function __construct(string $host = '127.0.0.1', int $port = 6379) { $this->redis = new Redis(); $this->redis->connect($host, $port); } /** * @desc expire * @param null $key * @param int $time * @return bool|Redis * @throws RedisException * @author Tinywan(ShaoBo Wan) */ public function expire($key = null, int $time = 0) { return $this->redis->expire($key, $time); } /** * @desc psubscribe * @param $callback * @param array $patterns * @throws RedisException * @author Tinywan(ShaoBo Wan) */ public function psubscribe($callback, array $patterns = []) { $this->redis->psubscribe($patterns, $callback); } /** * @desc setOption * @author Tinywan(ShaoBo Wan) */ public function setOption() { $this->redis->setOption(\Redis::OPT_READ_TIMEOUT, -1); } } ``` 訂閱文件`psubscribe.php` ``` <?php /** * @desc psubscribe.php 描述信息 * @author Tinywan(ShaoBo Wan) * @date 2024/6/26 21:39 */ require '../vendor/autoload.php'; $redis = new \RedisInstance('dnmp-redis'); $redis->setOption(); $redis->psubscribe(function ($redis, $pattern, $channel, $msg){ echo 'Pattern:' . $pattern .PHP_EOL; echo 'Channel:' . $channel .PHP_EOL; echo 'Message:' . $msg .PHP_EOL; }, ['__keyevent@0__:expired']); ``` 運行`psubscribe.php` 觀察訂閱狀態 ``` # php psubscribe.php Pattern:__keyevent@0__:expired Channel:__keyevent@0__:expired Message:username Pattern:__keyevent@0__:expired Channel:__keyevent@0__:expired Message:username2 Pattern:__keyevent@0__:expired Channel:__keyevent@0__:expired Message:username3 ``` 發布事件 ``` 127.0.0.1:6379> SETEX username 3 Tinywan OK 127.0.0.1:6379> SETEX username2 5 Tinywan OK 127.0.0.1:6379> SETEX username3 5 Tinywan ``` ## 小結結 通過以上步驟,成功地實現了Redis鍵空間通知使用。首先配置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>

                              哎呀哎呀视频在线观看