来,手撸一个简版Redis(附源码)

点击上方“阿拉奇学Java”,选择“置顶或者星标

优质文章第一时间送达!

来自:https://urlify.cn/y6zEBf

推荐阅读 | 在服务器上排除问题的头 5 分钟
推荐阅读 | 区块链入门教程

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

写留言


   
   
看到这里啦,说明你对这篇文章感兴趣,帮忙一下或者点击文章右下角在。感谢啦!关注公众号,回复「 进群 」即可进入 无广告技术交流群 。同时送上250本电子书+学习视频作为见面礼!
有你想看的 精彩 
在服务器上排除问题的头 5 分钟
作为一名黑客,通过技术手段发现女朋友出轨了...
区块链入门教程
如何优雅地给妹子『修电脑』?
阿里程序员考上公务员,年薪少了40万,但称不后悔:房子便宜300万!
是时候扔掉Postman了,又一个被低估的IDEA插件出来了...
一个excel(20M)就能干趴你的poi,你信吗(附源码)?
Java 的 JSP 已经被淘汰了吗?
知乎高赞:本科生如何才能进入腾讯、阿里等一流互联网大厂?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值