亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

使用Redis實現UA池的方案

2020-10-28 21:28:44
字體:
來源:轉載
供稿:網友

最近忙于業務開發、交接和游戲,加上碰上了不定時出現的猶豫期和困惑期,荒廢學業了一段時間。天冷了,要重新拾起開始下階段的學習了。之前接觸到的一些數據搜索項目,涉及到請求模擬,基于反爬需要使用隨機的 User Agent ,于是使用 Redis 實現了一個十分簡易的 UA 池。

背景

最近的一個需求,有模擬請求的邏輯,要求每次請求的請求頭中的 User Agent 要滿足下面幾點:

  • 每次獲取的 User Agent 是隨機的。
  • 每次獲取的 User Agent (短時間內)不能重復。
  • 每次獲取的 User Agent 必須帶有主流的操作系統信息(可以是 Uinux 、 Windows 、 IOS 和安卓等等)。

這里三點都可以從 UA 數據的來源解決,實際上我們應該關注具體的實現方案。簡單分析一下,流程如下:

在設計 UA 池的時候,它的數據結構和環形隊列十分類似:

上圖中,假設不同顏色的 UA 是完全不同的 UA ,它們通過洗牌算法打散放進去環形隊列中,實際上每次取出一個 UA 之后,只需要把游標 cursor 前進或者后退一格即可(甚至可以把游標設置到隊列中的任意元素)。最終的實現就是:需要通過中間件實現分布式隊列(只是隊列,不是消息隊列)。

具體實現方案

毫無疑問需要一個分布式數據庫類型的中間件才能存放已經準備好的 UA ,第一印象就感覺 Redis 會比較合適。接下來需要選用 Redis 的數據類型,主要考慮幾個方面:

UA

支持這幾個方面的 Redis 數據類型就是 List ,不過注意 List 本身不能去重,去重的工作可以用代碼邏輯實現。然后可以想象客戶端獲取 UA 的流程大致如下:

結合前面的分析,編碼過程有如下幾步:

準備好需要導入的 UA 數據,可以從數據源讀取,也可以直接文件讀取。

  •  因為需要導入的 UA 數據集合一般不會太大,考慮先把這個集合的數據隨機打散,如果使用 Java 開發可以直接使用 Collections#shuffle() 洗牌算法,當然也可以自行實現這個數據隨機分布的算法, 這一步對于一些被模擬方會嚴格檢驗 UA 合法性的場景是必須的 。
  • 導入 UA 數據到 Redis 列表中。
  • 編寫 RPOP + LPUSHLua 腳本,實現分布式循環隊列。

編碼和測試示例

引入 Redis 的高級客戶端 Lettuce 依賴:

<dependency>  <groupId>io.lettuce</groupId>  <artifactId>lettuce-core</artifactId>  <version>5.2.1.RELEASE</version></dependency>

編寫 RPOP + LPUSHLua 腳本, Lua 腳本名字暫稱為 L_RPOP_LPUSH.lua ,放在 resources/scripts/lua 目錄下:

local key = KEYS[1]local value = redis.call('RPOP', key)redis.call('LPUSH', key, value)return value

這個腳本十分簡單,但是已經實現了循環隊列的功能。剩下來的測試代碼如下:

public class UaPoolTest {  private static RedisCommands<String, String> COMMANDS;  private static AtomicReference<String> LUA_SHA = new AtomicReference<>();  private static final String KEY = "UA_POOL";  @BeforeClass  public static void beforeClass() throws Exception {    // 初始化Redis客戶端    RedisURI uri = RedisURI.builder().withHost("localhost").withPort(6379).build();    RedisClient redisClient = RedisClient.create(uri);    StatefulRedisConnection<String, String> connect = redisClient.connect();    COMMANDS = connect.sync();    // 模擬構建UA池的原始數據,假設有10個UA,分別是UA-0 ... UA-9    List<String> uaList = Lists.newArrayList();    IntStream.range(0, 10).forEach(e -> uaList.add(String.format("UA-%d", e)));    // 洗牌    Collections.shuffle(uaList);    // 加載Lua腳本    ClassPathResource resource = new ClassPathResource("/scripts/lua/L_RPOP_LPUSH.lua");    String content = StreamUtils.copyToString(resource.getInputStream(), StandardCharsets.UTF_8);    String sha = COMMANDS.scriptLoad(content);    LUA_SHA.compareAndSet(null, sha);    // Redis隊列中寫入UA數據,數據量多的時候可以考慮分批寫入防止長時間阻塞Redis服務    COMMANDS.lpush(KEY, uaList.toArray(new String[0]));  }  @AfterClass  public static void afterClass() throws Exception {    COMMANDS.del(KEY);  }  @Test  public void testUaPool() {    IntStream.range(1, 21).forEach(e -> {      String result = COMMANDS.evalsha(LUA_SHA.get(), ScriptOutputType.VALUE, KEY);      System.out.println(String.format("第%d次獲取到的UA是:%s", e, result));    });  }}

某次運行結果如下:

第1次獲取到的UA是:UA-0
第2次獲取到的UA是:UA-8
第3次獲取到的UA是:UA-2
第4次獲取到的UA是:UA-4
第5次獲取到的UA是:UA-7
第6次獲取到的UA是:UA-5
第7次獲取到的UA是:UA-1
第8次獲取到的UA是:UA-3
第9次獲取到的UA是:UA-6
第10次獲取到的UA是:UA-9
第11次獲取到的UA是:UA-0
第12次獲取到的UA是:UA-8
第13次獲取到的UA是:UA-2
第14次獲取到的UA是:UA-4
第15次獲取到的UA是:UA-7
第16次獲取到的UA是:UA-5
第17次獲取到的UA是:UA-1
第18次獲取到的UA是:UA-3
第19次獲取到的UA是:UA-6
第20次獲取到的UA是:UA-9

可見洗牌算法的效果不差,數據相對分散。

小結

其實 UA 池的設計難度并不大,需要注意幾個要點:

  • 一般主流的移動設備或者桌面設備的系統版本不會太多,所以來源 UA 數據不會太多,最簡單的實現可以使用文件存放,一次讀取直接寫入 Redis 中。
  • 注意需要隨機打散 UA 數據,避免同一個設備系統類型的 UA 數據過于密集,這樣可以避免觸發模擬某些請求時候的風控規則。
  • 需要熟悉 Lua 的語法,畢竟 Redis 的原子指令一定離不開 Lua 腳本。

總結

以上所述是小編給大家介紹的使用Redis實現UA池的方案,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久亚洲成人精品| 日本久久久久久久久久久| 欧美性生交xxxxx久久久| 亚洲最大av在线| 91av在线视频观看| 亚洲精品成人久久电影| 国产成人一区三区| 精品中文字幕久久久久久| 91精品中国老女人| 精品综合久久久久久97| 久久手机免费视频| 亚洲男女性事视频| 亚洲国产精品成人av| 日韩精品免费在线视频| 亚洲福利精品在线| 欧美精品久久久久久久久| 久久理论片午夜琪琪电影网| 久久久久久久久久久久av| 欧美日韩亚洲精品一区二区三区| 日韩精品免费综合视频在线播放| 国产精品久久9| 国产成人免费av| 538国产精品视频一区二区| 亚洲永久免费观看| 欧美成人精品一区二区三区| 在线观看国产精品日韩av| 欧美高跟鞋交xxxxxhd| 日韩在线一区二区三区免费视频| 亚洲精品福利在线| 国产精品久久久久久久久久东京| 国产精品极品尤物在线观看| 欧美乱人伦中文字幕在线| 国产视频久久久| 亚洲自拍高清视频网站| 亚洲国内高清视频| 大胆欧美人体视频| 欧美—级高清免费播放| 国产精品狠色婷| 国产一区二区美女视频| 青草青草久热精品视频在线观看| 亚洲风情亚aⅴ在线发布| 国产欧美日韩精品丝袜高跟鞋| 国产精品福利在线观看| 欧美与黑人午夜性猛交久久久| 久久久影视精品| 亚洲午夜av电影| 亚洲精品福利免费在线观看| 色综合久久中文字幕综合网小说| 日韩av综合网| 亚洲国产日韩欧美在线图片| 蜜臀久久99精品久久久久久宅男| 久久久久久久久久国产精品| 这里只有精品在线观看| 亚洲综合在线小说| 国产精品黄视频| 欧美区在线播放| 92国产精品视频| 欧美激情网站在线观看| 午夜精品一区二区三区在线视频| 亚洲аv电影天堂网| 日韩在线不卡视频| 亚洲成人精品久久久| 久久精品国产一区| 欧美午夜影院在线视频| 亚洲精品午夜精品| 性夜试看影院91社区| 国产欧美婷婷中文| 日韩中文字幕视频| 国产精品亚洲欧美导航| 麻豆国产va免费精品高清在线| 亚洲人成电影网站色xx| 亚洲午夜国产成人av电影男同| 久久久av电影| 伊人伊成久久人综合网站| 91a在线视频| 欧美在线观看视频| 日韩免费高清在线观看| 91视频九色网站| 欧美性猛交xxxx黑人猛交| 国产精品夜间视频香蕉| 久久91精品国产91久久跳| 国产精品久久久久一区二区| 97精品视频在线播放| 欧美性猛交xxxx乱大交极品| 综合网日日天干夜夜久久| 亚洲美腿欧美激情另类| 色妞在线综合亚洲欧美| 久久精品国产亚洲一区二区| 亚洲女人天堂av| 欧美性猛交xxxx乱大交蜜桃| 国产日韩中文在线| 欧美日韩亚洲视频| 国产精品久久久久久久久久| 欧美日韩国产麻豆| 久久久精品2019中文字幕神马| 韩国三级日本三级少妇99| 国产精品成人一区二区| 精品久久久久久久久久ntr影视| 91高潮精品免费porn| 日韩av电影在线免费播放| 国产亚洲成av人片在线观看桃| 欧美理论电影网| 色综合久久88色综合天天看泰| 久久久久久久久久久网站| 国产亚洲欧洲黄色| 国产欧美一区二区三区视频| 亚洲**2019国产| 一本一本久久a久久精品综合小说| 久久久久久伊人| 亚洲自拍偷拍色片视频| 国产一区二区三区网站| 久久久免费av| 日韩精品在线免费观看视频| 日本a级片电影一区二区| 日本亚洲欧美三级| 国产成人一区二区三区| 欧美一区二区三区免费视| 7m精品福利视频导航| 亚洲成色777777女色窝| 中文在线资源观看视频网站免费不卡| 国产成人一区二区在线| 狠狠久久五月精品中文字幕| 在线成人中文字幕| 亚洲美女性视频| 亚洲一区中文字幕| 91精品国产91久久久久福利| 亚洲经典中文字幕| 热久久视久久精品18亚洲精品| 亚洲日本成人女熟在线观看| 日本一区二区三区在线播放| 国产一区二区三区免费视频| 92福利视频午夜1000合集在线观看| 国产精品福利久久久| 青草成人免费视频| 正在播放欧美视频| 日韩中文字幕网址| www.日韩.com| 亚洲图片在区色| 久青草国产97香蕉在线视频| 5566成人精品视频免费| 日韩一区二区久久久| 在线观看欧美成人| 亚洲va欧美va国产综合剧情| 欧美亚洲国产视频小说| 久久夜色精品亚洲噜噜国产mv| 久久久www成人免费精品张筱雨| 亚洲精品美女视频| 亚洲色图美腿丝袜| 亚洲精品日韩在线| 97不卡在线视频| 国产a∨精品一区二区三区不卡| 精品国产乱码久久久久久天美| 成人av在线天堂| 国产精品黄色影片导航在线观看| 国产国语videosex另类| 久久久久999| 欧美视频精品一区| 国产免费一区二区三区香蕉精| 久久这里只有精品视频首页| 欧美日韩亚洲激情| 九九久久久久久久久激情| 九九热精品视频| 亚洲高清福利视频| 68精品国产免费久久久久久婷婷|