我们的企业网盘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 ,足以满足我们的需要。
驱动
我们基于 [email protected] 版本做了一个新的 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: search [key pattern] operator value
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' ] 查询 Hash: hsearch [key pattern] field operator value ...
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
