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

沙海
沙海
沙海
1017
文章
2
评论
2021年4月27日05:24:05
评论
2 4185字阅读13分57秒
摘要

速读摘要

速读摘要

通过实现这样的一个key/value系统实例来学习这两个框架的使用。它使用日志结构化数据库引擎进行存储,完全用C++编写,并有一个名为RocksJava的Java包装器。O来处理请求,同时利用Executor来服务后端逻辑服务(可能是阻塞)操作。RocksDB和RestExpress这两个项目都很有特点,RocksDB作为嵌入式的微存储引擎java包装器的大小仅有10M左右,主要是C++编译后的dll和so文件,其本身功能非常强大,强大到可以作为mysql的底层存储引擎,对底层存储做了很多的优化。

原文约 3626 | 图片 7 | 建议阅读 8 分钟 | 评价反馈

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

点击关注 ? 芋道源码

收录于话题

#芋道源码

28个

点击上方“芋道源码”,选择“设为星标

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 8:55 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:my.oschina.net/keking/blog/3037372

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

今天主要介绍两个开源项目,然后创建应用最终实现的效果就像简版的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来服务后端逻辑服务(可能是阻塞)操作。

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

实现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的底层存储引擎,对底层存储做了很多的优化。RestExpress虽很轻量但五脏俱全,非常适合一些小工具暴露http的服务。

欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

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

已在知识星球更新源码解析如下:

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

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

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

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

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)

阅读原文

继续阅读
weinxin
资源分享QQ群
本站是一个IT技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: