前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手写一个简版的Redis,实现高性能的key/value服务

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

作者头像
搜云库技术团队
发布2019-12-24 16:32:38
1.4K0
发布2019-12-24 16:32:38
举报
文章被收录于专栏:搜云库技术团队

前言

今天博主主要介绍两个开源项目,然后创建应用最终实现的效果就像简版的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提供向后兼容的支持。

最新粉丝福利

腾讯云1核2G,1年88元,3年268元,限量秒杀

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

创建服务并绑定端口

代码语言:javascript
复制
/**
 * @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操作类

代码语言:javascript
复制
/**
 * @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;
        }
    }
}

设置请求路由

代码语言:javascript
复制
/**
 * @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下分别执行如下脚本启动验证

启动

代码语言:javascript
复制
java -jar kedis-1.0.jar --port 8081

插入数据

代码语言:javascript
复制
curl http://localhost:8081/put?key=name&value=ckl

获取数据

代码语言:javascript
复制
curl http://localhost:8081/get?key=name

文末结语

RocksDB和RestExpress这两个项目都很有特点,RocksDB作为嵌入式的微存储引擎java包装器的大小仅有10M左右,主要是C++编译后的dll和so文件,其本身功能非常强大,强大到可以作为mysql的底层存储引擎,对底层存储做了很多的优化

可以见wikihttps://github.com/facebook/rocksdb/wiki/RocksDB-Basics

RestExpress虽很轻量但五脏俱全,非常适合一些小工具暴露http的服务。

http://suo.im/4tWsJS

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构师技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • RocksDB
  • 最新粉丝福利
  • 特征
  • RestExpress
    • 实现kedis
      • 创建RocksDB引擎api操作类
        • 设置请求路由
          • 启动
          • 插入数据
          • 获取数据
      • 文末结语
      相关产品与服务
      对象存储
      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档