Go中的Redis多维查询库

219 阅读2分钟

go-redimension

Redimension是一个Redis的多维索引和查询库,实现了对N个维度的项目进行索引,然后询问每个维度在指定范围内的元素。

使用方法

import "github.com/songboyu/go-redimension"

目前该库只能索引指定精度的无符号整数。没有精度限制,你可以随意索引由多少位组成的整数:你可以在创建Redimension对象时在构造函数中指定每个维度的位数。

下面是一个2D的使用实例。想象一下,你想通过工资和年龄来索引人员。

myindex = NewRedimension(redisCli, 2, 64)

我们创建了一个Redimension对象,指定了一个必须响应Redis命令的Redis对象。我们指定要进行2D索引,每个维度的精度为64比特。第一个参数是键名,它将代表索引作为一个排序的集合。

现在我们可以向我们的索引添加元素:

zkey, hkey := "test_zkey", "test_hkey"
r.Index(zkey, hkey, "aa", []uint32{45, 120000})
r.Index(zkey, hkey, "bb", []uint32{50, 110000})
r.Index(zkey, hkey, "cc", []uint32{30, 125000})

index 方法接收一个整数数组,代表项目的每个维度的值,以及一个项目名称,在查询阶段询问范围时将会返回。

查询很简单。在下面的查询中,我们要求找到所有年龄在40到50岁之间,工资在100000到115000之间的人:

vrange := make([][]uint32, 0)
vrange = append(vrange, []uint32{40, 50})
vrange = append(vrange, []uint32{100000, 115000})
res, err := r.Query(zkey, vrange)

范围总是包括在内。这不是一个大问题,因为目前我们只能对整数进行索引,所以只需递增/递减来排除一个给定的值。