手写一个简版的key/value服务kedis

简介: 前言今天博主主要介绍两个开源项目,然后创建应用最终实现的效果就像简版的redis服务那样,通过http的get请求,能够插入和获取数据,项目暂取名为kedis,源码后面会上传到git仓库。他们分别是Facebook开源的Rocksdb和netty实现的http容器RestExpress。

前言
今天博主主要介绍两个开源项目,然后创建应用最终实现的效果就像简版的redis服务那样,通过http的get请求,能够插入和获取数据,项目暂取名为kedis,源码后面会上传到git仓库。他们分别是Facebook开源的Rocksdb和netty实现的http容器RestExpress。通过实现这样的一个key/value系统实例来学习这两个框架的使用。

rocksdb
项目地址:https://github.com/facebook/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
项目地址:https://github.com/RestExpress/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();

}
}

代码地址:https://gitee.com/kailing/kedis

mvn install打包后,进入target目录会有kedis-1.0.jar。CMD下分别执行如下脚本启动验证

启动

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

插入数据

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

获取数据

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

文末结语
RocksDB和RestExpress这两个项目都很有特点,RocksDB作为嵌入式的微存储引擎java包装器的大小仅有10M左右,主要是C++编译后的dll和so文件,其本身功能非常强大,强大到可以作为mysql的底层存储引擎,对底层存储做了很多的优化,可以见wiki。RestExpress虽很轻量但五脏俱全,非常适合一些小工具暴露http的服务。

相关文章
|
开发框架 监控 .NET
Visual Basic的Web服务和REST API开发指南
【4月更文挑战第27天】本文探讨了使用Visual Basic(VB.NET)构建Web服务和RESTful API的方法。首先介绍了Web服务的基础和REST API的概念,然后阐述了.NET Framework与.NET Core/.NET 5+对VB.NET的支持,以及ASP.NET Core在Web开发中的作用。接着,详细讲解了创建RESTful API的步骤,包括控制器与路由设置、模型绑定与验证,以及返回响应。此外,还讨论了安全措施、测试方法、部署选项和监控策略。最后强调,VB.NET开发者可以通过ASP.NET Core涉足现代Web服务开发,拓宽技术领域。
436 1
|
Web App开发 域名解析 缓存
如何在 Ubuntu 20.04 上安装 Node.js 和 npm
本文我们主要为大家介绍在 Ubuntu 20.04 上安装 Node.js 和 npm 的三种不同的方式。
162271 7
如何在 Ubuntu 20.04 上安装 Node.js 和 npm
|
Ubuntu Java Linux
Manjaro Linux 入门使用教程
Manjaro 是一款基于 Arch LInux 的自由开源发行版,它吸收了 Arch Linux 优秀丰富的软件管理,同时提供了稳定流畅的操作体验。
6579 1
Manjaro Linux 入门使用教程
|
9月前
|
前端开发 UED 开发者
React 日期时间选择器 (DateTime Picker): 从基础到高级
本文详细介绍了如何在React应用中集成日期时间选择器,重点讲解了`react-datepicker`和Material-UI的`DatePicker`组件的安装、基本用法、自定义日期格式和设置日期范围的方法。同时,文章还探讨了常见问题及其解决方法,帮助开发者避免易错点,确保在项目中顺利集成日期时间选择功能。
709 3
|
前端开发 JavaScript 数据库
从前端到后端:构建高效数据驱动应用的全栈策略
在构建现代应用程序时,前端与后端的高效协作至关重要。本篇文章深入探讨了如何将前端技术与后端架构相结合,以构建强大的数据驱动应用。我们将分析常见技术栈,包括React与Node.js的集成、Python与Django的应用,以及如何利用数据库优化数据处理。通过具体的示例和最佳实践,读者将能掌握如何在全栈开发中实现高效的数据交互与应用性能优化。
|
8月前
|
敏捷开发 存储 API
《小型开发者在鸿蒙Next上的成本与收益平衡之道》
鸿蒙Next系统的开发对小型开发者存在一定挑战。学习成本方面,需掌握新架构和API;开发成本受功能复杂度影响,经验不足会增加支出;设备成本因多设备测试需求较高;市场推广成本受限于资金资源。然而,鸿蒙系统也带来机遇:用户群体庞大、创新空间广阔、华为激励政策支持。通过利用开源资源、敏捷开发、聚焦垂直领域及合作,小型开发者可在鸿蒙生态中实现成功并获得收益。
301 4
|
开发框架 .NET C#
探索VB.NET:了解.NET Framework下的Visual Basic
【4月更文挑战第27天】Visual Basic进化为VB.NET,融入.NET Framework,提供面向对象编程、泛型、LINQ等特性。VB.NET是强类型语言,支持类型推断,通过Windows Forms和WPF构建桌面应用。广泛应用于企业级、Web和数据处理开发,是易学且功能强大的编程工具。随着.NET版本更新,VB.NET的应用仍具价值,适合初学者和资深开发者。
392 1
|
存储 SQL 缓存
探秘WebSQL:轻松构建前端数据库
探秘WebSQL:轻松构建前端数据库
417 0
|
XML Java 应用服务中间件
Tomcat_servlet部署、编译、配置、打包
Tomcat_servlet部署、编译、配置、打包
241 0
|
10月前
|
算法 数据安全/隐私保护
BFS(Breath First Search 广度优先搜索)
BFS(Breath First Search 广度优先搜索)
193 1

热门文章

最新文章