<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          手寫一個(gè)簡版的Redis,實(shí)現(xiàn)高性能的key/value服務(wù)

          共 3587字,需瀏覽 8分鐘

           ·

          2020-11-07 09:39

          程序員的成長之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
          關(guān)注


          閱讀本文大概需要 3 分鐘。

          來自:網(wǎng)絡(luò)

          前言

          今天博主主要介紹兩個(gè)開源項(xiàng)目,然后創(chuàng)建應(yīng)用最終實(shí)現(xiàn)的效果就像簡版的Redis服務(wù)那樣,通過http的get請求,能夠插入和獲取數(shù)據(jù),項(xiàng)目暫取名為kedis,源碼后面會上傳到git倉庫。
          他們分別是Facebook開源的Rocksdb和netty實(shí)現(xiàn)的http容器RestExpress。
          通過實(shí)現(xiàn)這樣的一個(gè)key/value系統(tǒng)實(shí)例來學(xué)習(xí)這兩個(gè)框架的使用。

          RocksDB

          項(xiàng)目地址:https://github.com/facebook/rocksdb
          RocksDB是一個(gè)帶key/value接口的存儲引擎,其中鍵和值是任意字節(jié)流。它是一個(gè)C ++庫。
          它是在Facebook基于google開源的LevelDB開發(fā)的,并為LevelDB API提供向后兼容的支持。
          RocksDB支持各種存儲硬件,最初的重點(diǎn)是快速閃存。它使用日志結(jié)構(gòu)化數(shù)據(jù)庫引擎進(jìn)行存儲,完全用C ++編寫,并有一個(gè)名為RocksJava的Java包裝器。請參閱RocksJava基礎(chǔ)知識。
          RocksDB可以適應(yīng)各種生產(chǎn)環(huán)境,包括純內(nèi)存,閃存,硬盤或遠(yuǎn)程存儲。在RocksDB無法自動適應(yīng)的情況下,提供了高度靈活的配置設(shè)置,以允許用戶為其進(jìn)行調(diào)整。它支持各種壓縮算法和生產(chǎn)支持和調(diào)試的好工具。

          特征

          1、專為希望在本地或遠(yuǎn)程存儲系統(tǒng)上存儲多達(dá)數(shù)TB數(shù)據(jù)的應(yīng)用程序服務(wù)器而設(shè)計(jì)。
          2、優(yōu)化用于在快速存儲 - 閃存設(shè)備或內(nèi)存中存儲中小尺寸鍵值
          3、它適用于具有多個(gè)內(nèi)核的處理器
          RocksDB就是這樣的一個(gè)key/value存儲引擎,facebook基于RocksDB這個(gè)項(xiàng)目寫了MyRocks,一個(gè)使用RocksDB實(shí)現(xiàn)的msyql數(shù)據(jù)庫引擎。通過RocksDB的壓縮技術(shù)相比InnoDB能夠節(jié)省很大的存儲空間。newsql數(shù)據(jù)庫tidb組件tikv也使用了RocksDB作為底層數(shù)據(jù)存儲。

          RestExpress

          項(xiàng)目地址:https://github.com/RestExpress/RestExpress
          RESTExpress是一個(gè)非常高效的小型http容器,可以在Java中創(chuàng)建性能非常高,可擴(kuò)展的RESTful服務(wù)。使用牛逼的Netty框架編寫,RESTExpress使用非阻塞I / O來處理請求,同時(shí)利用Executor來服務(wù)后端邏輯服務(wù)(可能是阻塞)操作。

          實(shí)現(xiàn)kedis

          創(chuàng)建服務(wù)并綁定端口
          1. /**

          2. * @author: kl @kailing.pub

          3. * @date: 2019/4/12

          4. */

          5. public class Main {


          6. public static void main(String[] args) {

          7. Configs configs = new Configs();

          8. configs.fromArgs(args);

          9. RestExpress server = new RestExpress()

          10. .setName("kedis-server")

          11. .setBaseUrl("http://localhost:" +configs.getPort());

          12. KedisCore core =new KedisCore(configs.getDbPath());

          13. Routes.define(server,core);

          14. server.bind(configs.getPort());

          15. server.awaitShutdown();

          16. }

          17. }

          創(chuàng)建RocksDB引擎api操作類

          1. /**

          2. * @author: kl @kailing.pub

          3. * @date: 2019/4/12

          4. */

          5. public class KedisCore {


          6. private RocksDB db;


          7. public KedisCore(String path) {

          8. RocksDB.loadLibrary();

          9. try {

          10. final Options options = new Options().setCreateIfMissing(true);

          11. this.db = RocksDB.open(options, path);

          12. } catch (RocksDBException ex) {

          13. ex.printStackTrace();

          14. }

          15. }


          16. public String put(Request request, Response response) throws Exception {

          17. Map<String, String> map = request.getQueryStringMap();

          18. String key = map.get("key");

          19. String value = map.get("value");

          20. db.put(key.getBytes(), value.getBytes());

          21. return "ok";

          22. }


          23. public String get(Request request, Response response) throws Exception {

          24. Map<String, String> map = request.getQueryStringMap();

          25. String key = map.get("key");

          26. byte[] values = db.get(key.getBytes());

          27. if(values != null){

          28. return new String(values,"utf-8");

          29. }else {

          30. return null;

          31. }

          32. }

          33. }

          設(shè)置請求路由

          1. /**

          2. * @author: kl @kailing.pub

          3. * @date: 2019/4/12

          4. */

          5. public abstract class Routes {

          6. public static void define(RestExpress server,KedisCore core){

          7. server.uri("/put", core).action("put", HttpMethod.GET).noSerialization();

          8. server.uri("/get", core).action("get", HttpMethod.GET).noSerialization();

          9. }

          10. }

          代碼地址:https://gitee.com/kailing/kedis
          mvn install打包后,進(jìn)入target目錄會有kedis-1.0.jar。CMD下分別執(zhí)行如下腳本啟動驗(yàn)證

          啟動

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

          插入數(shù)據(jù)

          1. curl http://localhost:8081/put?key=name&value=ckl

          獲取數(shù)據(jù)

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

          文末結(jié)語

          RocksDB和RestExpress這兩個(gè)項(xiàng)目都很有特點(diǎn),RocksDB作為嵌入式的微存儲引擎java包裝器的大小僅有10M左右,主要是C++編譯后的dll和so文件,其本身功能非常強(qiáng)大,強(qiáng)大到可以作為mysql的底層存儲引擎,對底層存儲做了很多的優(yōu)化
          可以見wiki
          https://github.com/facebook/rocksdb/wiki/RocksDB-Basics
          RestExpress雖很輕量但五臟俱全,非常適合一些小工具暴露http的服務(wù)。
          推薦閱讀:

          如果mysql磁盤滿了,會發(fā)生什么?

          看看人家那后端API接口寫得,那叫一個(gè)優(yōu)雅!

          5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹莓派,等等。在公眾號內(nèi)回復(fù)「2048」,即可免費(fèi)獲取??!

          微信掃描二維碼,關(guān)注我的公眾號

          朕已閱?

          瀏覽 31
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  青青草青娱乐在线 | 国产激情综合网站 | 久久噜噜噜久久熟女-久久久噜噜噜 | 日韩无码电影网 | 免费三级成人爱做片 |