首頁 > 軟體

手寫簡版kedis分散式key及value服務的實現及設定

2022-02-28 13:05:22

前言

今天博主主要介紹兩個開源專案,然後建立應用最終實現的效果就像簡版的redis服務那樣,通過http的get請求,能夠插入和獲取資料,專案暫取名為kedis,原始碼後面會上傳到git倉庫。他們分別是Facebook開源的Rocksdb和netty實現的http容器RestExpress。通過實現這樣的一個key/value系統範例來學習這兩個框架的使用。

rocksdb

RocksDB是一個帶key/value介面的儲存引擎,其中鍵和值是任意位元組流。它是一個C ++庫。它是在Facebook基於google開源的LevelDB(https://github.com/google/LevelDB)開發的,併為LevelDB API提供向後相容的支援。

RocksDB支援各種儲存硬體,最初的重點是快速快閃記憶體。它使用紀錄檔結構化資料庫引擎進行儲存,完全用C ++編寫,並有一個名為RocksJava的Java包裝器。請參閱RocksJava基礎知識。

RocksDB可以適應各種生產環境,包括純記憶體,快閃記憶體,硬碟或遠端儲存。在RocksDB無法自動適應的情況下,提供了高度靈活的設定設定,以允許使用者為其進行調整。它支援各種壓縮演演算法和生產支援和偵錯的好工具。

特徵

  • 專為希望在本地或遠端儲存系統上儲存多達數TB資料的應用程式伺服器而設計。
  • 優化用於在快速儲存 - 快閃記憶體裝置或記憶體中儲存中小尺寸鍵值
  • 它適用於具有多個核心的處理器

RocksDB就是這樣的一個key/value儲存引擎,facebook基於RocksDB這個專案寫了MyRocks,一個使用RocksDB實現的msyql資料庫引擎。通過RocksDB的壓縮技術相比InnoDB能夠節省很大的儲存空間。newsql資料庫tidb元件tikv也使用了RocksDB作為底層資料儲存。

RestExpress

RESTExpress是一個非常高效的小型http容器,可以在Java中建立效能非常高,可延伸的RESTful服務。使用牛逼的Netty框架編寫,RESTExpress使用非阻塞I / O來處理請求,同時利用Executor來服務後端邏輯服務(可能是阻塞)操作。

實現kedis

建立服務並繫結埠

/**
 * @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();
    }
}

建立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;
        }
    }
}

設定請求路由

/**
 * @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打包後,進入target目錄會有kedis-1.0.jar。CMD下分別執行如下指令碼啟動驗證

啟動

java -jar kedis-1.0.jar --port 8081

插入資料

curl http://localhost:8081/put?key=name&amp;value=ckl

獲取資料

curl http://localhost:8081/get?key=name

文末結語

RocksDB和RestExpress這兩個專案都很有特點,RocksDB作為嵌入式的微儲存引擎java包裝器的大小僅有10M左右,主要是C++編譯後的dll和so檔案,其本身功能非常強大,強大到可以作為mysql的底層儲存引擎,對底層儲存做了很多的優化,可以見wiki。RestExpress雖很輕量但五臟俱全,非常適合一些小工具暴露http的服務。

以上就是手寫簡版key及value服務kedis的詳細內容,更多關於手寫key及value服務kedis的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com