手写一个简版的Redis,实现高性能的key/value服务

程序员的成长之路

共 3587字,需浏览 8分钟

 · 2020-11-07

程序员的成长之路
互联网/程序员/技术/资料共享 
关注


阅读本文大概需要 3 分钟。

来自:网络

前言

今天博主主要介绍两个开源项目,然后创建应用最终实现的效果就像简版的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开发的,并为LevelDB API提供向后兼容的支持。
RocksDB支持各种存储硬件,最初的重点是快速闪存。它使用日志结构化数据库引擎进行存储,完全用C ++编写,并有一个名为RocksJava的Java包装器。请参阅RocksJava基础知识。
RocksDB可以适应各种生产环境,包括纯内存,闪存,硬盘或远程存储。在RocksDB无法自动适应的情况下,提供了高度灵活的配置设置,以允许用户为其进行调整。它支持各种压缩算法和生产支持和调试的好工具。

特征

1、专为希望在本地或远程存储系统上存储多达数TB数据的应用程序服务器而设计。
2、优化用于在快速存储 - 闪存设备或内存中存储中小尺寸键值
3、它适用于具有多个内核的处理器
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. * @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. }

创建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. }

设置请求路由

  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打包后,进入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的底层存储引擎,对底层存储做了很多的优化
可以见wiki
https://github.com/facebook/rocksdb/wiki/RocksDB-Basics
RestExpress虽很轻量但五脏俱全,非常适合一些小工具暴露http的服务。
推荐阅读:

如果mysql磁盘满了,会发生什么?

看看人家那后端API接口写得,那叫一个优雅!

5T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,单片机,树莓派,等等。在公众号内回复「2048」,即可免费获取!!

微信扫描二维码,关注我的公众号

朕已阅 

浏览 11
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报