欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > 使用Redis實現(xiàn)UA池的方案

使用Redis實現(xiàn)UA池的方案

熱門標(biāo)簽:400電話辦理的口碑 南京手機外呼系統(tǒng)廠家 廊坊外呼系統(tǒng)在哪買 四川穩(wěn)定外呼系統(tǒng)軟件 一個地圖標(biāo)注多少錢 臺灣電銷 高碑店市地圖標(biāo)注app 地圖標(biāo)注工廠入駐 b2b外呼系統(tǒng)

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

背景

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

  • 每次獲取的 User Agent 是隨機的。
  • 每次獲取的 User Agent (短時間內(nèi))不能重復(fù)。
  • 每次獲取的 User Agent 必須帶有主流的操作系統(tǒng)信息(可以是 UinuxWindowsIOS 和安卓等等)。

這里三點都可以從 UA 數(shù)據(jù)的來源解決,實際上我們應(yīng)該關(guān)注具體的實現(xiàn)方案。簡單分析一下,流程如下:

在設(shè)計 UA 池的時候,它的數(shù)據(jù)結(jié)構(gòu)和環(huán)形隊列十分類似:

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

具體實現(xiàn)方案

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

UA

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

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

準(zhǔn)備好需要導(dǎo)入的 UA 數(shù)據(jù),可以從數(shù)據(jù)源讀取,也可以直接文件讀取。

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

編碼和測試示例

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

這個腳本十分簡單,但是已經(jīng)實現(xiàn)了循環(huán)隊列的功能。剩下來的測試代碼如下:

public class UaPoolTest {

  private static RedisCommandsString, String> COMMANDS;

  private static AtomicReferenceString> 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);
    StatefulRedisConnectionString, String> connect = redisClient.connect();
    COMMANDS = connect.sync();
    // 模擬構(gòu)建UA池的原始數(shù)據(jù),假設(shè)有10個UA,分別是UA-0 ... UA-9
    ListString> 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數(shù)據(jù),數(shù)據(jù)量多的時候可以考慮分批寫入防止長時間阻塞Redis服務(wù)
    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));
    });
  }
}

某次運行結(jié)果如下:

第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

可見洗牌算法的效果不差,數(shù)據(jù)相對分散。

小結(jié)

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

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

總結(jié)

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

您可能感興趣的文章:
  • lua讀取redis數(shù)據(jù)的null判斷示例代碼
  • 利用Lua定制Redis命令的方法詳解
  • Go語言中通過Lua腳本操作Redis的方法
  • 利用nginx+lua+redis實現(xiàn)反向代理方法教程
  • 詳解利用redis + lua解決搶紅包高并發(fā)的問題
  • 簡介Lua腳本與Redis數(shù)據(jù)庫的結(jié)合使用

標(biāo)簽:拉薩 定州 河源 畢節(jié) 伊春 南寧 泰州 甘南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《使用Redis實現(xiàn)UA池的方案》,本文關(guān)鍵詞  使用,Redis,實現(xiàn),池,的,方案,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《使用Redis實現(xiàn)UA池的方案》相關(guān)的同類信息!
  • 本頁收集關(guān)于使用Redis實現(xiàn)UA池的方案的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    无码一区二区三区在线| 疯狂揉花蒂控制高潮h| 丁香激情综合五月| 极品久久久久久久| 久久久久综合网| 夜夜揉揉日日人人青青一国产精品| 日本亚洲一区二区| 日本黄色片在线播放| 欧美一二三区在线| 日韩福利电影在线观看| 亚洲欧美在线不卡| 日韩欧美在线123| 蜜臀精品一区二区三区在线观看| 波波电影院一区二区三区| 天天操天天操天天操天天操天天操| 91精品国模一区二区三区| 亚洲成人动漫在线免费观看| 黄色在线免费播放| 日韩成人短视频| 国产精品短视频| 99久久国产综合精品色伊| 一本大道久久a久久综合| 亚洲男同1069视频| 91麻豆国产在线观看| 国产黄色片在线| 日韩一级片网站| 一区二区三区蜜桃网| 国产成人av电影在线观看| 91日韩中文字幕| 亚洲精品自拍动漫在线| 国产91综合网| 日本道色综合久久| 亚洲成a人v欧美综合天堂下载 | 亚洲大片精品永久免费| 成人伦理片在线| 色噜噜偷拍精品综合在线| 亚洲成人av一区二区| 女人又爽又黄免费女仆| 日韩一区二区三区高清免费看看| 一区二区三区精密机械公司| 成人精品免费网站| 欧美视频在线观看一区二区| 日韩精品电影在线| 欧美成人短视频| 一区二区在线观看av| 日韩av手机在线播放| 久久色.com| 久久99精品久久久久久动态图| 亚洲欧美视频在线播放| 国产色一区二区| 国产精品一二三| 在线中文字幕一区二区| 秋霞午夜鲁丝一区二区老狼| 亚洲一区二区在线免费| 久久久国产一区二区三区四区小说| 五月天激情综合| 精品系列免费在线观看| 精品国产视频一区二区三区| 亚洲成av人片www| 在线观看免费黄色网址| 亚洲综合视频在线观看| 国产人妻大战黑人20p| 精品黑人一区二区三区久久| 成人激情免费视频| 日韩亚洲欧美一区| 成人国产免费视频| 欧美不卡一区二区三区| 97精品国产露脸对白| 精品日韩在线观看| 精品一区二区三区香蕉蜜桃| 欧美在线一二三四区| 久久99精品久久久久久国产越南 | 精品一区二区三区四区五区六区| 欧美蜜桃一区二区三区| 国产一区二区三区免费播放 | 性欧美精品男男| 洋洋成人永久网站入口| 少妇的滋味中文字幕bd| 性欧美大战久久久久久久久| 国产ts丝袜人妖系列视频| 亚洲欧洲日本在线| 亚洲精品乱码久久久久久久久久久久| 亚洲精品在线观| 久久国产免费视频| 国产欧美日韩亚州综合| 青青草视频播放| 一区二区免费在线播放| 小嫩苞一区二区三区| 日本午夜精品视频在线观看| 欧洲日韩一区二区三区| 粉嫩蜜臀av国产精品网站| 精品国产一区二区国模嫣然| 无码国产精品久久一区免费| 国产精品毛片大码女人| 亚洲国产精品人人做人人爽| 国产综合内射日韩久| 国产人久久人人人人爽| 久久久精品人妻无码专区| 亚洲一二三区在线观看| 亚欧洲乱码视频| 国产精品久久精品日日| 国产黄色大片免费看| 日本亚洲最大的色成网站www| 欧美一区二区三区粗大| 亚洲日本免费电影| 欧美xxxooo| 国产在线精品一区二区三区不卡| 色噜噜狠狠成人中文综合| 国产成人一级电影| 精品国产一区二区三区四区四| 不卡一卡二卡三乱码免费网站| 在线播放中文一区| 91蜜桃婷婷狠狠久久综合9色| 欧美电视剧在线观看完整版| 国产风韵犹存在线视精品| 精品国产免费人成在线观看| 美女黄色一级视频| 亚洲国产视频网站| 欧美调教femdomvk| 能看毛片的网站| 一区二区三区四区中文字幕| 91久久精品一区二区三区| 成人ar影院免费观看视频| 国产精品三级在线观看| 国产尤物在线播放| 夫妻av一区二区| 国产精品久久久久9999吃药| 超碰97在线资源站| 视频一区二区不卡| 7777精品伊人久久久大香线蕉最新版| 狠狠色综合日日| 久久九九久久九九| 91大神福利视频| 国产91在线|亚洲| 国产精品久久久久久久久快鸭| 免费在线观看你懂的| 免费成人结看片| 久久综合九色综合欧美亚洲| 九九九视频在线观看| 国产精品白丝jk黑袜喷水| 中文字幕第一区二区| 男人天堂av电影| 午夜av区久久| 欧美草草影院在线视频| www.99热| 国产v综合v亚洲欧| 中文字幕色av一区二区三区| 色偷偷久久一区二区三区| 韩国三级丰满少妇高潮| 午夜一区二区三区视频| 精品欧美一区二区在线观看| 免费黄色在线网址| 成人午夜av电影| 亚洲精品免费播放| 91精品国产综合久久久久久漫画| 成人激情开心网| 亚洲一区二区三区四区在线观看 | 不卡免费追剧大全电视剧网站| 久久久久久久综合狠狠综合| 天天色天天综合| 91麻豆.com| 日本成人在线不卡视频| 国产亚洲欧美色| 在线视频一区二区三区| 免费日本黄色网址| 国产精品乡下勾搭老头1| 久久色.com| 亚洲AV无码成人精品区明星换面| 秋霞电影网一区二区| 51久久夜色精品国产麻豆| 国产精品高清无码在线观看| 成人亚洲精品久久久久软件| 亚洲国产美女搞黄色| 欧美三级电影网站| 丰满圆润老女人hd| 高清av一区二区| 亚洲18影院在线观看| 久久精品一区二区三区av| 在线视频欧美精品| 91免费看`日韩一区二区| 亚洲精品成人天堂一二三| 日韩一区二区三区在线视频| 玖玖爱在线精品视频| 国产精品99久久不卡二区| 亚洲已满18点击进入久久| 欧美吻胸吃奶大尺度电影 | 欧美人xxxx| 精品视频第一页| 图片区偷拍区小说区| 国产伦精品一区二区三区免费迷 | 中文字幕综合网| 日本精品一区二区三区四区的功能| bt7086福利一区国产| 视频一区视频二区中文字幕| 国产精品的网站| 欧美羞羞免费网站| av资源在线免费观看| 人妻换人妻a片爽麻豆| 国产91精品久久久久久久网曝门| 成人欧美一区二区三区黑人麻豆 |