Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Redis中相交并查找不同的关键点_Redis_Analytics_Data Modeling_Intersect - Fatal编程技术网

如何在Redis中相交并查找不同的关键点

如何在Redis中相交并查找不同的关键点,redis,analytics,data-modeling,intersect,Redis,Analytics,Data Modeling,Intersect,我希望得到一个尽可能高效的redis密钥列表。我们可以在redis服务器上对此进行建模,但我们喜欢这样做,因此这是解决问题的正确方法。让我描述一下情况 假设Redis中存储了大量“客户”作为字符串 customer__100000 customer__100001 customer__100002 每个客户都有很多属性。其中包括他们居住的城市。每个城市也存储在Redis中 city__New York city__San Francisco city__Washington DC 通过一个不

我希望得到一个尽可能高效的redis密钥列表。我们可以在redis服务器上对此进行建模,但我们喜欢这样做,因此这是解决问题的正确方法。让我描述一下情况

假设Redis中存储了大量“客户”作为字符串

customer__100000
customer__100001
customer__100002
每个客户都有很多属性。其中包括他们居住的城市。每个城市也存储在Redis中

city__New York
city__San Francisco
city__Washington DC
通过一个不同的过程,我最终会得到一组客户密钥(预筛选的交叉集)。一旦我有了这些密钥,我需要找出这些客户中我拥有哪些不同的城市。我在这里的最终目标是得到城市的名字,但是如果我能得到钥匙,我可以拉城市的名字,这也很好


为了给出我在这里谈论的规模的概念,假设我们处理的客户为20-30万,大约有70个属性(城市是其中之一),每个属性在50-100000之间。我希望尽可能保持它的效率。

与其将客户存储为字符串,不如将其存储为散列。Redis对哈希的ziplist编码非常节省空间。如果您存储了超过70个元素,则应该考虑在RIDIS.CONF

中增加<代码>散列max ZIPLIST条目限制。 当您使用Redis哈希时,您可以使用
排序
做一些有趣的事情。通过将
排序
获取
存储
一起使用,您可以从客户那里获取所有城市,并将其存储为列表(不区分)。然后,您可以通过在列表上调用
lpop
sadd
将列表转换为集合

以下是Redis Lua脚本示例:

——保存一组客户密钥的密钥
本地客户密钥集=密钥[1]
--一个可能存在的钥匙,它将保存一组城市
局部不同_集=ARGV[1]
--要获取的属性(默认为城市)
本地属性=ARGV[2]或“城市”
--删除当前一组不同的城市
redis.call(“DEL”,独特的集合)
--使用SORT从“attribute”的客户散列值中生成一个列表
local cities=redis.call(“排序”,设置客户密钥,“BY”,“nosort”,“GET”,“*->”。属性)
--循环浏览列表中的所有城市,并将它们添加到不同的城市集中
对于我来说,城市是成对的(城市)吗
redis.call(“SADD”,独特的集合,城市)
结束
--返回不同的城市
返回redis.call(“SMEMBERS”,distinct_set)

您还可以保留一个
customer\u 100000\u cities
集,该集与客户属性一起永久存储,并使用
sinter*customer\u cities\u键
获得一组不同的城市,但这会降低内存效率。

有趣的想法。考虑到一组50000名客户,我们最终会减少50000个城市,然后有效地将所有50000名客户添加到一组中,最终可能会有100名客户。我对这个路由的性能很好奇,因为数据的管道关闭和备份。当然,您可能指的是执行Lua脚本服务器端。是的,肯定是一个用Redis EVAL调用的Lua脚本。我想即使有5万条参赛作品,速度也会相当快。您可能需要在if语句中使用
EXPIRE
TTL
来记忆
distinct\u set
键。我已经更新了Lua脚本,因此它使用城市的Lua表而不是Redis列表。我想现在更容易理解了。