来,一起手撸一个简版 Redis(附源码)
点击上方 视学算法,选择 设为星标
优质文章,及时送达
作者 | 凯京技术团队
来自 | 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
创建服务并绑定端口
/**
* @date: 2019/4/12
*/
publicclassMain{
publicstaticvoid main(String[] args) {
Configs configs = newConfigs();
configs.fromArgs(args);
RestExpress server = newRestExpress()
.setName("kedis-server")
.setBaseUrl("http://localhost:"+configs.getPort());
KedisCore core =newKedisCore(configs.getDbPath());
Routes.define(server,core);
server.bind(configs.getPort());
server.awaitShutdown();
}
}
创建RocksDB引擎api操作类
/**
* @date: 2019/4/12
*/
publicclassKedisCore{
privateRocksDB db;
publicKedisCore(String path) {
RocksDB.loadLibrary();
try{
finalOptions options = newOptions().setCreateIfMissing(true);
this.db = RocksDB.open(options, path);
} catch(RocksDBException ex) {
ex.printStackTrace();
}
}
publicString put(Request request, Response response) throwsException{
Map<String, String> map = request.getQueryStringMap();
String key = map.get("key");
String value = map.get("value");
db.put(key.getBytes(), value.getBytes());
return"ok";
}
publicStringget(Request request, Response response) throwsException{
Map<String, String> map = request.getQueryStringMap();
String key = map.get("key");
byte[] values = db.get(key.getBytes());
if(values != null){
returnnewString(values,"utf-8");
}else{
returnnull;
}
}
}
设置请求路由
/**
* @date: 2019/4/12
*/
publicabstractclassRoutes{
publicstaticvoid 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的服务。
- END -
如果看到这里,说明你喜欢这篇文章,请转发、点赞。扫描下方二维码或者微信搜索「perfect_iscas」,添加好友后即可获得10套程序员全栈课程+1000套PPT和简历模板,向我私聊「进群」二字即可进入高质量交流群。
↓扫描二维码进群↓
喜欢文章,点个在看
来,一起手撸一个简版 Redis(附源码)相关推荐
- 三分钟手写一个迷你jQuery,附源码
诚然,不管前端技术怎么发展,重心都不会变,就是 操作DOM + 获取数据. 下面的代码演示了如何快速手写一个简单的jQuery: <!DOCTYPE html> <html lang ...
- javascript实现图片轮播_手撸一个简易版轮播图(上)
手撸一个简易版轮播图 实现原理,通过控制 swiper-warpper 容器的定位来达到切换图片的效果. 页面布局 简易版轮播图 < > 页面样式 .container{width: 60 ...
- 10分钟手撸极简版ORM框架!
最近很多小伙伴对ORM框架的实现很感兴趣,不少读者在冰河的微信上问:冰河,你知道ORM框架是如何实现的吗?比如像MyBatis和Hibernte这种ORM框架,它们是如何实现的呢? 为了能够让小伙伴们 ...
- 手写一个简版的vue
Vue源码中实现依赖收集(观察者模式),实现了三个类: Dep:扮演观察目标的角色,每一个数据都会有Dep类实例,它内部有个subs队列,subs就是subscribers的意思,保存着依赖本数据的观 ...
- 自已开发IM有那么难吗?手把手教你自撸一个Andriod版简易IM (有源码)
本文由作者FreddyChen原创分享,为了更好的体现文章价值,引用时有少许改动,感谢原作者. 1.写在前面 一直想写一篇关于im即时通讯分享的文章,无奈工作太忙,很难抽出时间.今天终于从公司离职了, ...
- html+手机自适应源码,手机端页面自适应解决方案—rem布局(进阶版,附源码示例)...
一年前笔者写了一篇 <手机端页面自适应解决方案-rem布局>,意外受到很多朋友的关注和喜欢.但随着时间的推移,该方案已然过时,故为大家介绍一个目前我极力推荐使用的,更加完美的方案--rem ...
- Winfrom 极简版贪吃蛇源码
该源码是我在百度知识库借助前辈的的经验,加上自己的一点小改动写的一个非常简陋的贪吃蛇小程序.如果你们有更好的改动方案,欢迎评论. 进入主题吧! 1.创建一个桌面应运程序,拖一个定时器控件.这样,程序界 ...
- 基于Vue+Express+Mysql开发的手机端电影购票系统(附源码)
基于Vue+Express+Mysql开发的手机端电影购票系统 基于手机的电影购票系统-Vue+Node 一个Vue+Express+Mysql的电影售票项目 项目完整源码下载 https://dow ...
- 如何实现一个权限管理系统?(附源码)
系统安全一直是在系统开发中不可规避的问题,而权限控制又跟系统安全密不可分,大到用户的访问,小到一个页面的按钮,都有可能涉及到权限的控制.而renren-security便给我们提供了一套权限系统开发的 ...
最新文章
- [面向对象] ABAP中类重构助手Refactoring Assitant
- Python 找出一个整数数组中,第二大的数。
- Py修行路 python基础 (二十)模块 time模块,random模块,hashlib模块,OS及sys模块...
- STM32F103ZET6 蜂鸣器、按键
- 信息学奥赛C++语言:爱吃桃子的琳琳
- 如何获取百度文库中的文章【原创】
- Android SystemProperties系统属性详解
- linux下别名alias的设置
- div+css实现背景透明
- python计算iv值_Python计算IV值的示例讲解
- AppServer 灰度集群接口超时 / CPU 负载高专项问题排查
- wifi文件服务器地址,wifi是服务器地址
- #500-7 [编程作业]3_4 念整数
- explain的使用及详解
- 【Try to Hack】Kerberos基础
- 查询GPU使用情况以及杀死GPU上的多个无用进程
- 2013 网易校园招聘试题考点
- HTML5 canvas 实现回合制战棋游戏(1):加载和绘制图形
- Excel服务器是信息系统工具
- 利用C#实现百度接口图像识别