php – 从Redis哈希获取随机/任何值
我有一个包含数百万个元素的Redis-Hash,不断添加新的元素.
在php中,我运行一个无限循环来获取,处理和删除另一个元素. 因此,我需要获取任何现有元素的键(最好是插入散列中的第一个元素,FiFo) while($redis->hlen()) { $key = ??? // process $key } 虽然我知道RANDOMKEY和SRANDMEMBER命令,但我没有找到任何方法来获取哈希的密钥. HGETALL和HKEYSare,由于哈希的大小,也不是一个选项.我需要顺序处理. 解决方法
访问给定哈希对象的随机项(或第一个或最后一个)没有技巧.
如果您需要迭代哈希对象,您有几种可能性: >第一个是用你可以切片的另一个数据结构(如列表或zset)来补充哈希值.如果您只在哈希中添加项目(并迭代删除它们),则列表就足够了.如果您可以添加/删除/更新项目(并迭代删除它们),则需要zset(将时间戳作为分数). zset的两个列表都可以被切片(lrange,zrange,zrangebyscore),因此很容易通过chunk迭代它们,并保持两个数据结构同步. 所以不要将哈希存储为: myobject -> { key1:xxxx,key2:yyyyy,key3:zzzz } 你可以存储: myobject:<hashcode1> -> { key1:xxxx,key3:zzzz } myobject:<hashcode2> -> { key2:yyyy } ... 要计算额外的哈希码,您可以在键上应用任何哈希函数,从而提供良好的分布.在上面的例子中,我们假设key1和key3具有相同的hashcode1值,而key2具有hashcode2值. 您可以在此处找到有关此类数据结构的更多信息: Redis 10x more memory usage than data 应计算散列函数的输出基数,以使每个散列对象的项数限制为给定值.例如,如果我们选择每个哈希对象有100个项目,并且我们需要存储1M项目,那么我们需要10K的基数.要限制基数,只需在泛型哈希函数上使用模运算就足够了. 好处是它将在内存中紧凑(使用ziplist),并且您可以通过在所有这些上管道hgetall del来轻松地对哈希对象进行破坏性迭代: hgetall myobject:0 ... at most 100 items will be returned,process them ... del myobject:0 hgetall myobject:1 ... at most 100 items will be returned,process them ... del myobject:1 ... 因此,您可以按块的方式迭代块,粒度由散列函数的输出基数确定. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |