91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

redis能夠采用什么樣的方式來實現限流

發布時間:2021-01-20 09:51:23 來源:億速云 閱讀:155 作者:小新 欄目:關系型數據庫

這篇文章主要介紹redis能夠采用什么樣的方式來實現限流,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

目的:

  • 實現訪問頻率限制

  • 實現訪問者 $ip 在一定的時間 $time 內只能訪問 $limit 次

非腳本實現

private boolean accessLimit(String ip, int limit, int time, Jedis jedis) {

    boolean result = true; String key = "rate.limit:" + ip; if (jedis.exists(key)) { long afterValue = jedis.incr(key); if (afterValue > limit) { result = false; } } else { Transaction transaction = jedis.multi(); transaction.incr(key); transaction.expire(key, time); transaction.exec(); }  return result; }

以上代碼有兩點缺陷

可能會出現競態條件: 解決方法是用 WATCH 監控 rate.limit:$IP 的變動, 但較為麻煩;以上代碼在不使用 pipeline 的情況下最多需要向Redis請求5條指令, 傳輸過多.

Lua腳本實現

Redis 允許將 Lua 腳本傳到 Redis 服務器中執行, 腳本內可以調用大部分 Redis 命令, 且 Redis 保證腳本的原子性:

首先需要準備Lua代碼: script.lua

--

-- Created by IntelliJ IDEA.

-- User: jifang

-- Date: 16/8/24

-- Time: 下午6:11 -- local key = "rate.limit:" .. KEYS[1] local limit = tonumber(ARGV[1]) local expire_time = ARGV[2] local is_exists = redis.call("EXISTS", key) if is_exists == 1 then if redis.call("INCR", key) > limit then return 0 else return 1 end else redis.call("SET", key, 1) redis.call("EXPIRE", key, expire_time) return 1 end

Java

private boolean accessLimit(String ip, int limit, int timeout, Jedis connection) throws IOException { List<String> keys = Collections.singletonList(ip); List<String> argv = Arrays.asList(String.valueOf(limit), String.valueOf(timeout)); return 1 == (long) connection.eval(loadScriptString("script.lua"), keys, argv); } // 加載Lua代碼 private String loadScriptString(String fileName) throws IOException { Reader reader = new InputStreamReader(Client.class.getClassLoader().getResourceAsStream(fileName)); return CharStreams.toString(reader); }

Lua 嵌入 Redis 優勢:

減少網絡開銷: 不使用 Lua 的代碼需要向 Redis 發送多次請求, 而腳本只需一次即可, 減少網絡傳輸;原子操作: Redis 將整個腳本作為一個原子執行, 無需擔心并發, 也就無需事務;復用: 腳本會永久保存 Redis 中, 其他客戶端可繼續使用。

以上是“redis能夠采用什么樣的方式來實現限流”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

三河市| SHOW| 定结县| 龙州县| 宜黄县| 乐平市| 高尔夫| 深泽县| 册亨县| 大冶市| 余姚市| 澄江县| 无锡市| 阿巴嘎旗| 喀喇| 衡阳市| 泽州县| 长兴县| 加查县| 张家口市| 永泰县| 浦北县| 砚山县| 平泉县| 连城县| 乐平市| 滕州市| 巨野县| 石狮市| 饶阳县| 河东区| 洛扎县| 惠州市| 缙云县| 正蓝旗| 凤冈县| 建平县| 景洪市| 江源县| 府谷县| 昌平区|