曾静的博客

但行好事,莫问前程.

嗨,我是曾静 (@devzeng),目前暂居深圳。


这是我用来记录平日学习笔记的地方,欢迎您的访问.

iOS中KV数据库LevelDB的编译和使用

LevelDB是Google公司重量级工程师Jeff DeanSanjay Ghemawat发起的开源项目。LevelDB是一个持久化存储的KV系统,和Redis这种内存型的KV系统不同,LevelDB不会像Redis一样狂吃内存,而是将大部分数据存储到磁盘上。目前能够支持billion级别的数据量,在这个数量级别下还有着非常高的性能,主要归功于它的良好的设计。

LevelDB开源并托管在GitHub上,项目的地址是:https://github.com/google/leveldb

有个来自LevelDB官方对LevelDB、TreeDB和SQLite3进行性能对比分析的测试,测试结果如下图所示:

leveldb-speed.png

结果显示,在顺序读写和随机写上,LevelDB 在性能上都遥遥领先。

编译iOS静态库

1.下载代码到本地

git clone https://github.com/google/leveldb.git

2.编译项目代码

cd leveldb
CXXFLAGS=-stdlib=libc++ make PLATFORM=IOS

如果出现如下报错信息:

c++ -stdlib=libc++ -I. -I./include -std=c++0x  -DOS_MACOSX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -O2 -DNDEBUG -fPIC -c db/builder.cc -o /db/builder.o
error: unable to open output file '/db/builder.o': 'Operation not permitted'
1 error generated.
make: *** [/db/builder.o] Error 1

使用sudo CXXFLAGS=-stdlib=libc++ make PLATFORM=IOS这行命令即可。

说明:

(1)编译完成之后在out-ios-universal这个目录下面会自动生成libleveldb.alibmemenv.a两个文件。

(2)可以用lipo -info libleveldb.a检测生成的静态库支持的架构情况。默认支持armv6 armv7 armv7s i386 x86_64 arm64所有的架构

(3)头文件在include目录下面,后面会用到

在iOS中使用LevelDB

LevelDB提供的是C++的API,可以在https://rawgit.com/google/leveldb/master/doc/index.html这里查到具体的使用说明。使用C++确实是不太方便幸好有大神将这些接口使用Objective-C进行了一下包装,使用方式和NSUserDefaults一致,可以参考《轻量级的KV数据库LevelDB在Objective-C上的应用》这篇文章。

为了便于使用和项目集成我将这个和编译好的静态库放在了一起做成一个库。可以直接使用CocoaPods进行集成。

pod 'leveled-pd', :git => 'https://github.com/hhtczengjing/leveldb-pd.git'

(1)初始化数据库

NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *pageDBPath = [docPath stringByAppendingPathComponent:@"my_leveldb.ldb"];
THLevelDB *myLevelDB = [THLevelDB levelDBWithPath:pageDBPath];

(2)存储数据

[myLevelDB setString:@"hello world" forKey:@"username"];

(3)读取数据

NSString *str = [myLevelDB stringForKey:@"username"];

没错就是这样方便。

参考资料

1.《Github Project Home》

2.《LevelDB library documentation》

3.《轻量级的KV数据库LevelDB在Objective-C上的应用》

4.《编译leveldb for iOS》

5.《LevelDB、TreeDB、SQLite3性能对比测试》

最近的文章

使用NSSM在Windows服务器上部署Node.js应用

最近使用Node的Express框架做了一个简单的应用,原本是打算部署到CentOS服务器上面的,后来由于种种原因只能部署到Window的服务器上面了。Node.js在Linux上面部署非常的方便,可以使用forever或者pm2来做这个事情,而且使用起来非常的简单,后续有机会会单独介绍如何使用,在Windows下就是稍微有点麻烦了,这两个组件都不支持。找了一些资料发现了nssm这个工具,部署超级简单,而且会监控你安装的node服务,如果node挂了,nssm会自动重启它。下面记录下部署的...…

Node继续阅读
更早的文章

iOS中使用Protocol Buffers

Google Protocol Buffer(简称Protobuf)是由Google推出的一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或RPC数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。 Protocol buffers are a language-neutral, platform-neutral extensible mechanism for serializing structur...…

iOS继续阅读