redis基於佇列實現的流控模型

2021-09-25 05:43:16 字數 1154 閱讀 4808

前言

本文實現中使用的evalsha執行的lua,所以先描述下redis中eval和evalsha使用區別

基本語法如下:

redis 127.0.0.1:6379> eval script numkeys key [key …] arg [arg …]

引數說明:

script: 引數是一段 lua 5.1 指令碼程式。指令碼不必(也不應該)定義為乙個 lua 函式。

numkeys: 用於指定鍵名引數的個數。

key [key …]: 從 eval 的第三個引數開始算起,表示在指令碼中所用到的那些 redis 鍵(key),這些鍵名引數可以在 lua 中通過全域性變數 keys 陣列,用 1 為基址的形式訪問( keys[1] , keys[2] ,以此類推)。

arg [arg …]: 附加引數,在 lua 中通過全域性變數 ar** 陣列訪問,訪問的形式和 keys 變數類似( ar**[1] 、 ar**[2] ,諸如此類)。## evalsha

先要執行scriptload把指令碼載入到redis快取中,再使用evalsha來執行

「redis evalsha 命令根據給定的 sha1 校驗碼,執行快取在伺服器中的指令碼」

基本語法如下:

evalsha sha1 numkeys key [key …] arg [arg …]

引數說明:

sha1 : 通過 script load 生成的 sha1 校驗碼。

numkeys: 用於指定鍵名引數的個數。

key [key …]: 從 eval 的第三個引數開始算起,表示在指令碼中所用到的那些 redis 鍵(key),這些鍵名引數可以在 lua 中通過全域性變數 keys 陣列,用 1 為基址的形式訪問( keys[1] , keys[2] ,以此類推)。

arg [arg …]: 附加引數,在 lua 中通過全域性變數 ar** 陣列訪問,訪問的形式和 keys 變數類似( ar**[1] 、 ar**[2] ,諸如此類)。

eval直接執行上傳的指令碼不從快取拿

evalsha直接從快取中取sha中指令碼資訊執行

設計 基於redis的簡單頻控實現

場景 時間內只能yyy次 在redis裡維護乙個數字型別的k v,key的生成策略與頻控的維度有關,比如是使用者級的頻控,那麼key就是乙個userid 如果是總頻控,那麼key就是乙個string常量。key的過期時間就是頻控的時間間隔,在建立key的時候設定過期時間。過頻控時,需要將key的計數...

基於redis佇列的日誌系統實現

1 log的儲存不應該被當前執行緒的session影響,和log4j一樣,執行到哪一步就記錄哪一步,輸出到資料庫,不能出現錯誤回滾或則儲存失敗。2 log的儲存和插入不能影響當前執行緒,不能因為日誌儲存過多而影響當前程序響應速度,或則占用資料庫資源影響程序的讀寫。先將日誌產生後放入快取佇列中,不影響...

php基於Redis訊息佇列實現的訊息推送的方法

基本知識點 重點用到了以下命令實現我們的訊息推送 邏輯分析 實現 普通任務指令碼 phpforeach user list as item redispushqueue 守護程序執行 nohup php yourpath redispushqueue.php 開啟守護程序執行,修改檔案之後需要從新啟...