牛客網中級專案學習 五 非同步佇列

2021-08-15 03:12:22 字數 3795 閱讀 5434

利用json進行物件序列化和反序列化,json存到redis中,可以做在在redis中儲存物件。

實現**如下

@test

public void testobject()

public

class

jedisadapter

implements

initializingbean

public

t getobject(string key, classclazz)

return

null;

}public string get(string key) catch (exception e) finally }}

public

void

set(string key, string value) catch (exception e) finally }}

同步的話容易受io影響造成程式吞吐率降低,採用非同步的方式較好,將活動打包,放入佇列,後台一直有個消費執行緒去拆包,執行。

在以上例項中,操作會被阻塞,如果指定的列表 key list1 存在資料則會返回第乙個元素,否則在等待100秒後會返回 nil 。

list

<

string

> messages = jedisadapter.brpop(0, key); //從右邊把活動拉出來

活動模型,進入佇列的具體活動

//進入佇列的具體的活動

public

class eventmodel

public

eventmodel()

public

eventmodel(eventtype type)

public string getext(string name)

public eventmodel setext(string name, string value)

public eventtype gettype()

public eventmodel settype(eventtype type)

public

intgetactorid()

public eventmodel setactorid(int actorid)

public

intgetentityid()

public eventmodel setentityid(int entityid)

public

intgetentitytype()

public eventmodel setentitytype(int entitytype)

public

intgetentityownerid()

public eventmodel setentityownerid(int entityownerid)

}

public

enum eventtype

public

intgetvalue()

}

活動生產者,相當於生產消費者中的生產者,在controller層執行乙個動作後,用這個類把需要非同步的資訊打包好,放進redis的佇列中。放入是吧eventmodel序列化為json,存入redis的列表中。

//把活動發到佇列裡去

@service

public

class

eventproducer catch (exception e) }}

介面eventhandler,對於活動定義行為

public

inte***ce eventhandler

具體的執行動作,具體的實現類,這個是點讚後要執行的行為,給別人發提醒。

@component

public

class

likehandler

implements

eventhandler

@override

public listgetsupporteventtypes()

}

消費活動,在初始化前,先得到handler介面所有的實現類,遍歷實現類。通過getsupporteventtype得到每個實現類對應處理的活動型別。反過來記錄在config雜湊表中,config中的key是活動的型別,比如說是like,comment,是列舉裡的成員,value是乙個arraylist的陣列,裡面存放的是各種實現方法。見**中的。當從佇列中獲得乙個活動時,這裡用的是從右向外pop()乙個活動實體。進行解析。這裡的config.get(eventmodel.gettype())是乙個陣列,裡面存放著所有關於這個活動要執行的實現類。遍歷這個陣列,開始執行實現類裡的方法。

for (eventhandler handler : config.get(eventmodel.gettype()))
private

map> config =

new hashmap<>();

執行完後config就有了所有活動型別對應的所有的實現方法。進入下面的新建執行緒,while(true)迴圈使得後台一直有乙個執行緒在消費佇列。

//消費活動,得到某個活動實體,如何將活動分發下去給相關的所有handle實現。

@service

public

class

eventconsumer

implements

private

static

final logger logger = logge***ctory.getlogger(eventconsumer.class);

private map> config = new hashmap<>();

@autowired

private jedisadapter jedisadapter;

@override

public

void

afterpropertiesset() throws exception

// 註冊每個事件的處理函式

config.get(type).add(entry.getvalue());}}

}// 啟動執行緒去消費事件

thread thread = new thread(new runnable()

eventmodel eventmodel = json.parseobject(message, eventmodel.class);

// 找到這個事件的處理handler列表

if (!config.containskey(eventmodel.gettype()))

for (eventhandler handler : config.get(eventmodel.gettype())) }}

}});

thread.start();

}@override

public

void}}

牛客網中級專案學習(二) 新增新聞

上傳 一 post方法上傳到伺服器本地,返回uuid的string字串,形成url,瀏覽器可以輸入127.0.0.1 uuid生成的string 組成url,後台會傳回給瀏覽器response,帶有的二進位製流。瀏覽器的response中就可以看到接收的二進位製流,顯示出來。fiddler可以通過 ...

牛客網程式設計 五

在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。publicboolean duplicate int number...

牛客網提高五練習

吉老師的題,出的很有水平 應該是t1,t2難度 給出 l1,l2,r1,r2,m 詢問 displaystyle sum sum m i oplus j 對於前 30 分,我們可以簡單列舉 對於第二個點,我們已知乙個數 顯然對於 10 的資料範圍,我們只能考慮 o 1 或者 o logn 的演算法 ...