1

我正在使用 redis 作为 Web 应用程序的数据存储。基本设计基于对象的散列和索引的 zset,例如

user:<USER_ID> => hash(username: STRING, user_id: INTEGER, last_visit_date: FLOAT, create_date: FLOAT)
users:by_last_visit => zset( (last_visit_date, user_id) ...)
users:by_create_date => zset( (create_date, user_id) ... )

我的日期存储为自纪元以来的秒数。到目前为止,这已经很好地工作了——我可以使用强大的 zset 操作来快速获取相关范围、进行分页等,并且我的排序要求自然地映射到浮点空间。

但是,现在我需要按字母顺序排序。我知道 zset 将按值按字母顺序排序以打破得分平局。到目前为止,我最好的解决方案是将我的字符串作为分数为零的值,并依赖此功能。我不喜欢这样,因为我最终得到了一些以 ID 作为值的集合和一些以字符串作为值的集合 - 我需要应用程序逻辑来确定它在给定时间使用的集合类型并将字符串映射回 ID。此外,我失去了随意合并/相交我的集合的能力。

我的下一个最佳解决方案是将字符串映射到浮点分数,但这看起来非常混乱且容易出错,因为字符串可以任意长。

有没有更好的选择,而不是将所有字符串都以相同的分数放入 zset 并保持反向映射回 ids?假设这是最好的解决方案,它是否可靠(即我是依赖副作用还是真实功能)?

4

0 回答 0