我们的企业网盘OnceDoc和管理软件采用内存数据库 Redis 。 Redis 是一个使用 C 语言编写的键值对存储数据库,体积小巧,性能优异,实施简单。很多大并发网站如 Twitter 、 GitHub Weibo 、 Snapchat 、 Flickr 、阿里等都将其用作 SESSION 存储及缓存的管理。出于性能的考虑 Redis 自带的命令一般不支持按值查找。但是企业软件又需要数据库有搜索、复杂条件查询以及聚合分析的能力。为了实现这些功能我们修改了 Redis 的源码。并创建了一个新的开源分支 OnceDB,用户可以到 Github 下载最新的Windows 版本进行测试。
注* 我们为部分客户部署了一些 Linux 实例,到目前为止运行稳定, Windows 版本并没有在生产环境测试过。
我们基于 Redis3.x 版本进行修改,尽管最新的 4.x 添加了外部模块的支持,但并不适合我们的应用场景,外部模块会增加 Reids 的使用风险,并且会增加修改的难度。 Redis 从 3.x 版本开始支持集群 Cluster ,足以满足我们的需要。
我们基于 node_redis@v0.12.1 版本做了一个新的 node.js 驱动 oncedb-client。
使用 npm 安装 oncedb-client 驱动模块
npm install oncedb-client
通过 require 安装 oncedb-client 模块,并创建 client ,此时会默认连接本地 6379 端口的 redis ,然后就可以用他在 nodejs 中进行查询了。
var client = require("oncedb-client").createClient();
string 是 redis 最基本的类型,而且 string 类型是二进制安全的。即 string 可以包含任何数据。比如 jpg 图片或者序列化的 JSON 对象。下例在 text* 类型的 key 中查找值为'Kris'的数据
var client = require("oncedb-client").createClient();
client.search('text*', '=', 'Kris', function(err, objs) {
console.log(objs)
})
输出结果为数组,第一条为健第二条记录为值
> [ 'text1', 'Kris' ]
搜索含有 Kris 的记录
client.search('text*', '~', 'Kris', function(err, objs) {
console.log(objs)
})
输出结果为两组健值
> [ 'text1', 'Kris', 'text5', 'This is ok, Kris' ]
Redis hash 是一个 string 类型的 field 和 value 的映射表。一个 hash 类型的 key 含多个 field ,一个 field 对应一个 value 。 Hash 非常适合存放 JSON 对象。 hsearch 支持对 field 进行查询。
比如查询一条 userInfo 记录,其中 {'>':'100'} ,也可使用类 mongodb 语法:{'$gt':'100'}:
client.hsearch('userInfo:*', {
'name' : 'Mar'
, 'gender' : 'male'
, 'nVisit' : {'>':'100'}
}, function(err, objs) {
console.log(objs)
})
查找结果
> [ { _key: 'userInfo:1006',
name: 'Mar',
gender: 'male',
nVisit: '10000' } ]
[文档不断完善中]
原文地址:OnceDoc Blog
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.