學(xué)了不短時(shí)間的java,有點(diǎn)零散,準(zhǔn)備串聯(lián)起知識(shí),決定寫一個(gè)綜合的程序來鍛煉鍛煉,于是花了幾天做了一個(gè)簡單的NoSQL,采用Java NIO和反射技術(shù),當(dāng)然還有很多不足,多多包涵,歡迎指正。
服務(wù)器短主要采用Java NIO selector進(jìn)行多路復(fù)用,提高系統(tǒng)并發(fā)量,連接事件就保存鏈接,注冊事件;可讀事件則只是將消息封裝成對(duì)象,壓入阻塞消息隊(duì)列,不做處理,由單獨(dú)的線程進(jìn)行處理分發(fā),提高主線程的響應(yīng)速度。本來想用多線程提高處理速度,但所有的數(shù)據(jù)操作都是全局共享的,則必須保證操作順序,多線程沒有意義,因此只得采用單線程。不知道有沒有更好的方法,這里還對(duì)消息對(duì)象進(jìn)行了一定數(shù)目的緩存,超過數(shù)目就直接丟棄,避免每次new 新的。
傳遞的數(shù)據(jù)是一個(gè)字符串,開頭是操作指令如Push,SET等,這是通過框架初次讀取配置文件config.xml決定的,可根據(jù)需求自由設(shè)置<自定義指令>類名.方法名,運(yùn)行時(shí)利用Java 反射動(dòng)態(tài)加載,調(diào)用方法,傳入操作的字符串,高度自由。
這也是我最喜歡反射的地方,由字符串參數(shù)直接獲得對(duì)象和調(diào)用方法,無需做if-else的判斷和硬編碼。我以前寫php程序的時(shí)候,最喜歡的一招就是通過參數(shù)字符串new $str()或者$str()直接調(diào)用方法,而無需做復(fù)雜的邏輯判斷(不要在黑我大php了,通過字符串映射到對(duì)象和方法整的很爽好嗎?已經(jīng)多年沒寫過臃腫的if-else 和switch-case了)PS:java 的API真他媽難用,坑爹的IO,上來啥也不干先捕獲一堆異常,Oracle的文檔直接被http://php.net 吊打。
具體的存儲(chǔ)我就偷懶直接采用了Java的集合做靜態(tài)成員,載入類時(shí)初始化。其實(shí)很粗糙,大神請(qǐng)忽略。Github地址 https://github.com/dingdangmao123/javaredis? GitHub 新手 不要見笑