手写简版kedis分布式key及value服务的实现及配置
目录
- 前言
- rocksdb
- 特征
- RestExpress
- 实现kedis
- 创建服务并绑定端口
- 创建RocksDB引擎api操作类
- 设置请求路由
- 启动
- 插入数据
- 获取数据
- 文末结语
前言 今天博主主要介绍两个开源项目,然后创建应用最终实现的效果就像简版的redis服务那样,通过http的get请求,能够插入和获取数据,项目暂取名为kedis,源码后面会上传到git仓库。他们分别是Facebook开源的Rocksdb和netty实现的http容器RestExpress。通过实现这样的一个key/value系统实例来学习这两个框架的使用。
rocksdb RocksDB是一个带key/value接口的存储引擎,其中键和值是任意字节流。它是一个C ++库。它是在Facebook基于google开源的LevelDB(https://github.com/google/LevelDB)开发的,并为LevelDB API提供向后兼容的支持。
RocksDB支持各种存储硬件,最初的重点是快速闪存。它使用日志结构化数据库引擎进行存储,完全用C ++编写,并有一个名为RocksJava的Java包装器。请参阅RocksJava基础知识。
RocksDB可以适应各种生产环境,包括纯内存,闪存,硬盘或远程存储。在RocksDB无法自动适应的情况下,提供了高度灵活的配置设置,以允许用户为其进行调整。它支持各种压缩算法和生产支持和调试的好工具。
特征
- 专为希望在本地或远程存储系统上存储多达数TB数据的应用程序服务器而设计。
- 优化用于在快速存储 - 闪存设备或内存中存储中小尺寸键值
- 它适用于具有多个内核的处理器
RestExpress RESTExpress是一个非常高效的小型http容器,可以在Java中创建性能非常高,可扩展的RESTful服务。使用牛逼的Netty框架编写,RESTExpress使用非阻塞I / O来处理请求,同时利用Executor来服务后端逻辑服务(可能是阻塞)操作。
文章图片
实现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 map = request.getQueryStringMap(); String key = map.get("key"); String value = https://www.it610.com/article/map.get("value"); db.put(key.getBytes(), value.getBytes()); return "ok"; } public String get(Request request, Response response) throws Exception {Map 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(); }}
mvn install打包后,进入target目录会有kedis-1.0.jar。CMD下分别执行如下脚本启动验证
启动
java -jar kedis-1.0.jar --port 8081
插入数据
curl http://localhost:8081/put?key=name& value=https://www.it610.com/article/ckl
获取数据
curl http://localhost:8081/get?key=name
文末结语 RocksDB和RestExpress这两个项目都很有特点,RocksDB作为嵌入式的微存储引擎java包装器的大小仅有10M左右,主要是C++编译后的dll和so文件,其本身功能非常强大,强大到可以作为mysql的底层存储引擎,对底层存储做了很多的优化,可以见wiki。RestExpress虽很轻量但五脏俱全,非常适合一些小工具暴露http的服务。
【手写简版kedis分布式key及value服务的实现及配置】以上就是手写简版key及value服务kedis的详细内容,更多关于手写key及value服务kedis的资料请关注脚本之家其它相关文章!
推荐阅读
- 手写|手写 Vue2 系列 之 patch —— diff
- 手写|手写 Vue2 系列 之 初始渲染
- 自己动手写Vector【Cherno|自己动手写Vector【Cherno C++教程】
- 手写|手写 Vue 系列 之 从 Vue1 升级到 Vue2
- java|用Compose实现手写春联效果
- 手写|手写 Vue 系列 之 Vue1.x
- 手写
- OpenCV从入门到项目实战|OpenCV-Python实战(番外篇)——利用 SVM 算法识别手写数字
- #|【手写Tomcat】10.实现对静态资源的放行(完结篇)
- #|【手写Tomcat】9.实现游览器访问我们自定义的MyServlet