周末擼了一個(gè)簡(jiǎn)版的 Redis,輕松搞定高性能的 key-value 服務(wù)


今天主要介紹兩個(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
項(xiàng)目地址:
https://github.com/facebook/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 ++編寫(xiě),并有一個(gè)名為RocksJava的Java包裝器。
RocksDB可以適應(yīng)各種生產(chǎn)環(huán)境,包括純內(nèi)存,閃存,硬盤(pán)或遠(yuǎn)程存儲(chǔ)。在RocksDB無(wú)法自動(dòng)適應(yīng)的情況下,提供了高度靈活的配置設(shè)置,以允許用戶為其進(jìn)行調(diào)整。它支持各種壓縮算法和生產(chǎn)支持和調(diào)試的好工具。
特征
專(zhuān)為希望在本地或遠(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)目寫(xiě)了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
項(xiàng)目地址:
https://github.com/RestExpress/RestExpress

實(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();}}
/*** @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;}}}
/*** @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();}}
java -jar kedis-1.0.jar --port 8081curl http://localhost:8081/put?key=name&value=cklcurl 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)化。RestExpress雖很輕量但五臟俱全,非常適合一些小工具暴露http的服務(wù)。
文章轉(zhuǎn)載:程序員老鬼
(版權(quán)歸原作者所有,侵刪)
![]()

點(diǎn)擊下方“閱讀原文”查看更多
