手寫簡(jiǎn)版kedis分布式key及value服務(wù)的實(shí)現(xiàn)及配置
前言
今天博主主要介紹兩個(gè)開(kāi)源項(xiàng)目,然后創(chuàng)建應(yīng)用最終實(shí)現(xiàn)的效果就像簡(jiǎn)版的redis服務(wù)那樣,通過(guò)http的get請(qǐng)求,能夠插入和獲取數(shù)據(jù),項(xiàng)目暫取名為kedis,源碼后面會(huì)上傳到git倉(cāng)庫(kù)。他們分別是Facebook開(kāi)源的Rocksdb和netty實(shí)現(xiàn)的http容器RestExpress。通過(guò)實(shí)現(xiàn)這樣的一個(gè)key/value系統(tǒng)實(shí)例來(lái)學(xué)習(xí)這兩個(gè)框架的使用。
rocksdb
RocksDB是一個(gè)帶key/value接口的存儲(chǔ)引擎,其中鍵和值是任意字節(jié)流。它是一個(gè)C ++庫(kù)。它是在Facebook基于google開(kāi)源的LevelDB(https://github.com/google/LevelDB)開(kāi)發(fā)的,并為L(zhǎng)evelDB API提供向后兼容的支持。
RocksDB支持各種存儲(chǔ)硬件,最初的重點(diǎn)是快速閃存。它使用日志結(jié)構(gòu)化數(shù)據(jù)庫(kù)引擎進(jìn)行存儲(chǔ),完全用C ++編寫,并有一個(gè)名為RocksJava的Java包裝器。請(qǐng)參閱RocksJava基礎(chǔ)知識(shí)。
RocksDB可以適應(yīng)各種生產(chǎn)環(huán)境,包括純內(nèi)存,閃存,硬盤或遠(yuǎn)程存儲(chǔ)。在RocksDB無(wú)法自動(dòng)適應(yīng)的情況下,提供了高度靈活的配置設(shè)置,以允許用戶為其進(jìn)行調(diào)整。它支持各種壓縮算法和生產(chǎn)支持和調(diào)試的好工具。
特征
- 專為希望在本地或遠(yuǎn)程存儲(chǔ)系統(tǒng)上存儲(chǔ)多達(dá)數(shù)TB數(shù)據(jù)的應(yīng)用程序服務(wù)器而設(shè)計(jì)。
- 優(yōu)化用于在快速存儲(chǔ) - 閃存設(shè)備或內(nèi)存中存儲(chǔ)中小尺寸鍵值
- 它適用于具有多個(gè)內(nèi)核的處理器
RocksDB就是這樣的一個(gè)key/value存儲(chǔ)引擎,facebook基于RocksDB這個(gè)項(xiàng)目寫了MyRocks,一個(gè)使用RocksDB實(shí)現(xiàn)的msyql數(shù)據(jù)庫(kù)引擎。通過(guò)RocksDB的壓縮技術(shù)相比InnoDB能夠節(jié)省很大的存儲(chǔ)空間。newsql數(shù)據(jù)庫(kù)tidb組件tikv也使用了RocksDB作為底層數(shù)據(jù)存儲(chǔ)。
RestExpress
RESTExpress是一個(gè)非常高效的小型http容器,可以在Java中創(chuàng)建性能非常高,可擴(kuò)展的RESTful服務(wù)。使用牛逼的Netty框架編寫,RESTExpress使用非阻塞I / O來(lái)處理請(qǐng)求,同時(shí)利用Executor來(lái)服務(wù)后端邏輯服務(wù)(可能是阻塞)操作。

實(shí)現(xiàn)kedis
創(chuàng)建服務(wù)并綁定端口
/**
* @author: kl @kailing.pub
* @date: 2019/4/12
*/ public class Main { public static void main(String[] args) {
Configs configs = new Configs();
configs.fromArgs(args);
RestExpress server = new RestExpress()
.setName("kedis-server")
.setBaseUrl("http://localhost:" +configs.getPort());
KedisCore core =new KedisCore(configs.getDbPath());
Routes.define(server,core);
server.bind(configs.getPort());
server.awaitShutdown();
}
}創(chuàng)建RocksDB引擎api操作類
/**
* @author: kl @kailing.pub
* @date: 2019/4/12
*/ public class KedisCore { private RocksDB db; public KedisCore(String path) {
RocksDB.loadLibrary(); try { final Options options = new Options().setCreateIfMissing(true); this.db = RocksDB.open(options, path);
} catch (RocksDBException ex) {
ex.printStackTrace();
}
} public String put(Request request, Response response) throws Exception {
Map<String, String> map = request.getQueryStringMap();
String key = map.get("key");
String value = map.get("value");
db.put(key.getBytes(), value.getBytes()); return "ok";
} public String get(Request request, Response response) throws Exception {
Map<String, String> map = request.getQueryStringMap();
String key = map.get("key"); byte[] values = db.get(key.getBytes()); if(values != null){ return new String(values,"utf-8");
}else { return null;
}
}
}設(shè)置請(qǐng)求路由
/**
* @author: kl @kailing.pub
* @date: 2019/4/12
*/ public abstract class Routes { public static void define(RestExpress server,KedisCore core){
server.uri("/put", core).action("put", HttpMethod.GET).noSerialization();
server.uri("/get", core).action("get", HttpMethod.GET).noSerialization();
}
}mvn install打包后,進(jìn)入target目錄會(huì)有kedis-1.0.jar。CMD下分別執(zhí)行如下腳本啟動(dòng)驗(yàn)證
啟動(dòng)
java -jar kedis-1.0.jar --port 8081
插入數(shù)據(jù)
curl http://localhost:8081/put?key=name&value=ckl
獲取數(shù)據(jù)
curl http://localhost:8081/get?key=name
文末結(jié)語(yǔ)
RocksDB和RestExpress這兩個(gè)項(xiàng)目都很有特點(diǎn),RocksDB作為嵌入式的微存儲(chǔ)引擎java包裝器的大小僅有10M左右,主要是C++編譯后的dll和so文件,其本身功能非常強(qiáng)大,強(qiáng)大到可以作為mysql的底層存儲(chǔ)引擎,對(duì)底層存儲(chǔ)做了很多的優(yōu)化,可以見(jiàn)wiki。RestExpress雖很輕量但五臟俱全,非常適合一些小工具暴露http的服務(wù)。
以上就是手寫簡(jiǎn)版key及value服務(wù)kedis的詳細(xì)內(nèi)容,更多關(guān)于手寫key及value服務(wù)kedis的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mybatis-Plus實(shí)現(xiàn)SQL攔截器的示例
這篇文章主要介紹了Mybatis-Plus實(shí)現(xiàn)一個(gè)SQL攔截器,通過(guò)使用SQL攔截器,開(kāi)發(fā)人員可以在執(zhí)行SQL語(yǔ)句之前或之后對(duì)其進(jìn)行修改或記錄,從而更好地控制和優(yōu)化數(shù)據(jù)庫(kù)操作,對(duì)Mybatis-Plus?SQL攔截器相關(guān)知識(shí)感興趣的朋友一起看看吧2023-05-05
Java算法練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(1)
方法下面小編就為大家?guī)?lái)一篇Java算法的一道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-07-07
java實(shí)現(xiàn)給圖片加鋪滿的網(wǎng)格式文字水印
這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)給圖片加鋪滿的網(wǎng)格式文字水印的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
java中的this引用及對(duì)象構(gòu)造初始化
這篇文章主要介紹了java中的this引用及對(duì)象構(gòu)造初始化,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
Java中的非對(duì)稱加密算法原理與實(shí)現(xiàn)方式
在當(dāng)今的信息時(shí)代,數(shù)據(jù)安全已經(jīng)成為了一個(gè)至關(guān)重要的問(wèn)題,加密技術(shù)作為保障信息安全的重要手段,受到了廣泛的應(yīng)用和關(guān)注,本篇文章將詳細(xì)介紹Java中的非對(duì)稱加密算法原理及其實(shí)現(xiàn)方式,需要的朋友可以參考下2023-12-12

