点击上方 视学算法,选择 设为星标

优质文章,及时送达

作者 | 凯京技术团队

来自 | my.oschina.net/keking/blog/3037372

今天主要介绍两个开源项目,然后创建应用最终实现的效果就像简版的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包装器。

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

创建服务并绑定端口

  1. /**

  2. * @date: 2019/4/12

  3. */

  4. publicclassMain{

  5. publicstaticvoid main(String[] args) {

  6. Configs configs = newConfigs();

  7. configs.fromArgs(args);

  8. RestExpress server = newRestExpress()

  9. .setName("kedis-server")

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

  11. KedisCore core =newKedisCore(configs.getDbPath());

  12. Routes.define(server,core);

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

  14. server.awaitShutdown();

  15. }

  16. }

创建RocksDB引擎api操作类

  1. /**

  2. * @date: 2019/4/12

  3. */

  4. publicclassKedisCore{

  5. privateRocksDB db;

  6. publicKedisCore(String path) {

  7. RocksDB.loadLibrary();

  8. try{

  9. finalOptions options = newOptions().setCreateIfMissing(true);

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

  11. } catch(RocksDBException ex) {

  12. ex.printStackTrace();

  13. }

  14. }

  15. publicString put(Request request, Response response) throwsException{

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

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

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

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

  20. return"ok";

  21. }

  22. publicStringget(Request request, Response response) throwsException{

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

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

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

  26. if(values != null){

  27. returnnewString(values,"utf-8");

  28. }else{

  29. returnnull;

  30. }

  31. }

  32. }

设置请求路由

  1. /**

  2. * @date: 2019/4/12

  3. */

  4. publicabstractclassRoutes{

  5. publicstaticvoid define(RestExpress server,KedisCore core){

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

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

  8. }

  9. }

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

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

启动

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

插入数据

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

获取数据

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

结语

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

- END -

如果看到这里,说明你喜欢这篇文章,请转发、点赞。扫描下方二维码或者微信搜索「perfect_iscas」,添加好友后即可获得10套程序员全栈课程+1000套PPT和简历模板向我私聊「进群」二字即可进入高质量交流群。

扫描二维码进群↓

在看 

来,一起手撸一个简版 Redis(附源码)相关推荐

  1. 三分钟手写一个迷你jQuery,附源码

    诚然,不管前端技术怎么发展,重心都不会变,就是 操作DOM + 获取数据. 下面的代码演示了如何快速手写一个简单的jQuery: <!DOCTYPE html> <html lang ...

  2. javascript实现图片轮播_手撸一个简易版轮播图(上)

    手撸一个简易版轮播图 实现原理,通过控制 swiper-warpper 容器的定位来达到切换图片的效果. 页面布局 简易版轮播图 < > 页面样式 .container{width: 60 ...

  3. 10分钟手撸极简版ORM框架!

    最近很多小伙伴对ORM框架的实现很感兴趣,不少读者在冰河的微信上问:冰河,你知道ORM框架是如何实现的吗?比如像MyBatis和Hibernte这种ORM框架,它们是如何实现的呢? 为了能够让小伙伴们 ...

  4. 手写一个简版的vue

    Vue源码中实现依赖收集(观察者模式),实现了三个类: Dep:扮演观察目标的角色,每一个数据都会有Dep类实例,它内部有个subs队列,subs就是subscribers的意思,保存着依赖本数据的观 ...

  5. 自已开发IM有那么难吗?手把手教你自撸一个Andriod版简易IM (有源码)

    本文由作者FreddyChen原创分享,为了更好的体现文章价值,引用时有少许改动,感谢原作者. 1.写在前面 一直想写一篇关于im即时通讯分享的文章,无奈工作太忙,很难抽出时间.今天终于从公司离职了, ...

  6. html+手机自适应源码,手机端页面自适应解决方案—rem布局(进阶版,附源码示例)...

    一年前笔者写了一篇 <手机端页面自适应解决方案-rem布局>,意外受到很多朋友的关注和喜欢.但随着时间的推移,该方案已然过时,故为大家介绍一个目前我极力推荐使用的,更加完美的方案--rem ...

  7. Winfrom 极简版贪吃蛇源码

    该源码是我在百度知识库借助前辈的的经验,加上自己的一点小改动写的一个非常简陋的贪吃蛇小程序.如果你们有更好的改动方案,欢迎评论. 进入主题吧! 1.创建一个桌面应运程序,拖一个定时器控件.这样,程序界 ...

  8. 基于Vue+Express+Mysql开发的手机端电影购票系统(附源码)

    基于Vue+Express+Mysql开发的手机端电影购票系统 基于手机的电影购票系统-Vue+Node 一个Vue+Express+Mysql的电影售票项目 项目完整源码下载 https://dow ...

  9. 如何实现一个权限管理系统?(附源码)

    系统安全一直是在系统开发中不可规避的问题,而权限控制又跟系统安全密不可分,大到用户的访问,小到一个页面的按钮,都有可能涉及到权限的控制.而renren-security便给我们提供了一套权限系统开发的 ...

最新文章

  1. [面向对象] ABAP中类重构助手Refactoring Assitant
  2. Python 找出一个整数数组中,第二大的数。
  3. Py修行路 python基础 (二十)模块 time模块,random模块,hashlib模块,OS及sys模块...
  4. STM32F103ZET6 蜂鸣器、按键
  5. 信息学奥赛C++语言:爱吃桃子的琳琳
  6. 如何获取百度文库中的文章【原创】
  7. Android SystemProperties系统属性详解
  8. linux下别名alias的设置
  9. div+css实现背景透明
  10. python计算iv值_Python计算IV值的示例讲解
  11. AppServer 灰度集群接口超时 / CPU 负载高专项问题排查
  12. wifi文件服务器地址,wifi是服务器地址
  13. #500-7 [编程作业]3_4 念整数
  14. explain的使用及详解
  15. 【Try to Hack】Kerberos基础
  16. 查询GPU使用情况以及杀死GPU上的多个无用进程
  17. 2013 网易校园招聘试题考点
  18. HTML5 canvas 实现回合制战棋游戏(1):加载和绘制图形
  19. Excel服务器是信息系统工具
  20. 利用C#实现百度接口图像识别

热门文章

  1. 图像非极大值抑制 Sobel 边缘实现
  2. 又居家办公了,要签合同怎么办?
  3. 阿里亲制明信片,字节、百度直接发锅……这些公司的新年礼盒越来越会玩~
  4. 中国AI已进入迷茫阶段!从技术到科学,AI该何去何从?
  5. 一流科技完成5000万人民币A轮融资,高瓴创投独家领投
  6. A股暴跌,户均亏2万!刚写好的辞职信又撕了……
  7. 微软开源NAS算法Petridish,提高神经网络迁移能力
  8. 滴滴叶杰平:年运送乘客百亿次,AI如何“服务”出行领域?| BDTC 2019
  9. 一览六月最热的5篇AI技术论文
  10. 新浪程序员加班改bug,竟错失77万年会大奖