我面临以下问题:
我不想跟踪给用户的任务,我想将此状态存储在Redis中。
我能做到:
1)创建名为" dispatched_tasks"持有许多对象(用户名,任务)
2)创建名为dispatched_tasks的许多(潜在的数千个)列表:通常包含少量对象的用户名(任务)
哪种方法更好?如果我只想到我的安慰,我会选择第二个,因为有时候我将不得不搜索特定的用户任务,而第二种方法是免费的。
但Redis怎么样?哪种方法会更高效?
感谢您的帮助。
答案 0 :(得分:1)
Redis支持不同类型的数据结构,如here所示。您可以采取不同的方法:
情景1:
使用列表数据类型,您的列表将包含您的问题的所有任务/用户组合。但是,访问和删除任务以O(n)时间复杂度运行(它必须遍历列表才能到达元素)。如果您的用户有很多任务,这会对性能产生影响。
使用套装: 与列表类似,但您可以在O(1)中添加/删除/检查是否存在,并且集合元素是唯一的。因此,如果您添加另一个已存在的用户名/任务,则无法添加它。
情景2:
数据类型不会更改。唯一的区别是redis中会有更多的密钥,这会增加内存占用量。
来自FAQ:
单个Redis实例可容纳的最大密钥数是多少?哈希,列表,集,排序中的最大元素数 设定吗
Redis最多可以处理232个密钥,并且在实践中经过测试可以处理 每个实例至少有2.5亿个密钥。
每个哈希,列表,集合和有序集合可以容纳232个元素。
换句话说,你的限制很可能是你的可用内存 系统
Redis的内存占用情况是什么?
为您提供一些示例(全部使用64位实例获得):
空实例使用~3MB内存.1百万个小键 - > 字符串值对使用~85MB的内存.1百万个密钥 - >哈希 value,表示具有5个字段的对象,使用~160 MB的 记忆。
测试你的用例是微不足道的 redis-benchmark实用程序生成随机数据集并检查 INFO memory命令使用的空间。