Redis中的多参数匹配+加权随机选择

时间:2011-10-29 23:34:44

标签: redis

假设我有一组具有属性的对象:

Object Quantity Color  Shape   Kind
----------------------------------------
APPLE  12       RED    ROUND   FRUIT
APPLE  3        GREEN  ROUND   FRUIT
ORANGE 6        ORANGE ROUND   FRUIT
CARROT 0        RED    CONICAL VEGETABLE
RADISH 24       RED    ROUND   VEGETABLE

对象和除数量以外的所有属性都表示为字符串。数量是一个数字。

我必须根据用户的查询撰写一个随机的对象列表。

查询包含所有字符串属性的值(即除数量以外的所有属性)。

查询中的值可以是精确属性值,也可以是通配符(表示“此属性可以执行的任何值”),或者是否定 - “不是这个确切的属性值”。

查询结果是一个对象,由具有匹配属性的所有对象的加权随机选取。随机选择的权重是数量。

例如:

Query                    -> Probabilities                    -> Example 
                                                                random result
-----------------------------------------------------------------------------
*      ROUND   FRUIT     -> APPLE 12 / APPLE 3 = APPLE 15    -> APPLE

!GREEN ROUND   FRUIT     -> APPLE 12 / ORANGE 6              -> ORANGE

RED    *       *         -> CARROT 0 / APPLE 12 / RADISH 24 
                          = APPLE 12 / RADISH 24             -> RADISH

RED    CONICAL VEGETABLE -> CARROT 0 
                          = (none)                           -> (none)

出于自我教育的目的,我想使用Redis构建此系统进行数据存储。

问题是 - 如何优雅地使用最少量的应用程序逻辑(与in-Redis操作相反)?权重和否定有点破坏图片。否则它将是nicely doable with sets

欢迎任何提示。

1 个答案:

答案 0 :(得分:0)

由于redis只能查询键而不能查询值,因此一个好的选择是将每个对象的各个值存储在单独的redis列表中。

例如,当您添加对象时......

APPLE 12 RED ROUND FRUIT

你会把它存储为

hmset obj:1名苹果数量12种颜色红色圆形果实

然后......

伤心的名字:apple obj:1,

sadd color:red obj:1

sadd shape:round obj:1

通过这种方式,您可以直接查询集合,并能够使用随机数来选择对象,例如,返回的集合中的项目总数。

希望有所帮助。如果你需要更多解释,请打我。