Ruby on rails 在redis中存储(唯一)键值数组

Ruby on rails 在redis中存储(唯一)键值数组,ruby-on-rails,postgresql,redis,Ruby On Rails,Postgresql,Redis,应用程序中的用户在特定事件中会被扣分/扣分 我想为每个用户存储: 1-已使用的事件列表[EventID,#点] 2-受处罚的[事件ID,#积分] 特征 必须能够将新的[EventID,#points]对推送到列表中 可以轻松检索事件ID的列表 #点可以是十进制,而不仅仅是整数 例如 用户#10 奖金:[[122,10],[128,10],[133,5]] 处罚:[[22,10],[28,5],[13,1]] ·用户1余额:(10+10+5)-(10+5+1)=9 迄今为止的选择 我正在使

应用程序中的用户在特定事件中会被扣分/扣分

我想为每个用户存储:

1-已使用的事件列表
[EventID,#点]

2-受处罚的
[事件ID,#积分]

特征
  • 必须能够将新的
    [EventID,#points]
    对推送到列表中

  • 可以轻松检索
    事件ID的列表

  • #点
    可以是十进制,而不仅仅是整数

例如

用户#10

  • 奖金:[[122,10],[128,10],[133,5]]

  • 处罚:[[22,10],[28,5],[13,1]]

·用户1余额:(10+10+5)-(10+5+1)=9

迄今为止的选择 我正在使用postgres+Redis

1.博士后商店 例如,
User.find(10).bonus_events=>{'122':'10','128':'10','133':'5'}

2.Postgres的JSON类型 例如,
User.find(10).bonus\u events=>
[{id:'122',points:'10'},
{id:'128',点数:'10'}
{id:'133',points:'5'}]

3.雷迪斯? 不确信…

ZSET案例 (排序集)可以这样使用。在您的问题中,eventId和points是整数,因此Redis将以最大可能的有效性存储它们

发件人:

Redis排序集是字符串的非重复集合。不同之处在于,排序集的每个成员都与分数相关联,分数用于对排序集进行排序,从最小的分数到最大的分数。虽然成员是唯一的,但分数可能会重复

使用排序集,您可以非常快速地添加、删除或更新元素(时间与元素数量的对数成正比)。由于元素是按顺序排列的,而不是按顺序排列的,所以您还可以通过分数或排名(位置)以非常快的方式获得范围。访问排序集的中间也是非常快的,因此您可以使用排序的集合作为非重复元素的智能列表,您可以快速地访问所需的所有元素:顺序元素、快速存在测试、快速访问中间元素;p> 解决方案:

  • 每个用户使用2个ZSET-一个用于奖励,一个用于惩罚
  • EventID
    是关键,
    #点
    是ZSET的分数
  • 添加事件:

    ZADD bonuses:1 10 122 
    ZADD penalization:1 10 22
    ...
    
    HSET bonuses:1 122 10
    HSET penalization:1 22 10
    ...
    
    放弃它们(伪代码):

    HSET案例 仅当每个列表中都有唯一的eventId时才使用此案例

    Redis散列是字符串字段和字符串值之间的映射,因此它们是表示对象的完美数据类型(例如,具有名称、姓氏、年龄等多个字段的用户)。一个包含几个字段的散列以占用很少空间的方式存储,因此您可以在一个小的Redis实例中存储数百万个对象

    解决方案:

  • 每个用户使用2个HSET-一个用于奖金,一个用于处罚(使用可能会认为存储两个列表时都有一组前缀,例如bonus:eventId-不要这样做。这不允许redis这样做)
  • EventID
    是关键点,
    #点
    是HSET的值
  • 添加事件:

    ZADD bonuses:1 10 122 
    ZADD penalization:1 10 22
    ...
    
    HSET bonuses:1 122 10
    HSET penalization:1 22 10
    ...
    
    放弃它们(伪代码):

    什么更好
    HSET机箱更好更快地使用RAM。如果每个列表中只有唯一的eventId,请使用这种情况。

    我忘了提到,
    #点
    也将是十进制数,而不仅仅是整数。因此,我想Redis哈希是最合适的数据类型。回答得好!为什么不为被解雇者和被处罚者列出一个唯一的名单,只为处罚设置负数呢?@thepirat000这是一个很好的观点,我也考虑过这一点。但是我需要呈现两个表:一个用于惩罚的事件,另一个用于奖励的事件。我认为有两个列表更有效,因为我不必每次都搜索分数0。