Ruby on rails 在redis中存储(唯一)键值数组
应用程序中的用户在特定事件中会被扣分/扣分 我想为每个用户存储: 1-已使用的事件列表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 迄今为止的选择 我正在使
[EventID,#点]
2-受处罚的[事件ID,#积分]
特征
- 必须能够将新的
对推送到列表中[EventID,#points]
- 可以轻松检索
事件ID的列表
可以是十进制,而不仅仅是整数#点
- 奖金:[[122,10],[128,10],[133,5]]
- 处罚:[[22,10],[28,5],[13,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>
解决方案:
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实例中存储数百万个对象
解决方案:
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。