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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/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
Nosql 存储非平稳分布的数据库_Nosql_Redis_Distribution - Fatal编程技术网

Nosql 存储非平稳分布的数据库

Nosql 存储非平稳分布的数据库,nosql,redis,distribution,Nosql,Redis,Distribution,我有很多分类分布。分类分布是从一组k个事件中描述事件发生概率的分布。我需要能够非常快速地获取事件发生的概率 存储分类分布的一种方法是在Redis中使用排序集。每个键索引一个单独的分布,排序集的每个成员是一个特定事件,每个分数是您看到该事件的次数。对于每个键(分布),您还将在该分布中存储每个事件的计数总和,以便正确地进行归一化 我想问的问题是:如果概率随时间变化,存储这些数据的好方法是什么?我基本上希望能够忘记旧的观察结果——即在某个固定的时间间隔内减少每个键的分数和归一化常数 使用上面的redi

我有很多分类分布。分类分布是从一组k个事件中描述事件发生概率的分布。我需要能够非常快速地获取事件发生的概率

存储分类分布的一种方法是在Redis中使用排序集。每个键索引一个单独的分布,排序集的每个成员是一个特定事件,每个分数是您看到该事件的次数。对于每个键(分布),您还将在该分布中存储每个事件的计数总和,以便正确地进行归一化

我想问的问题是:如果概率随时间变化,存储这些数据的好方法是什么?我基本上希望能够忘记旧的观察结果——即在某个固定的时间间隔内减少每个键的分数和归一化常数


使用上面的redis方法,我可以每d分钟运行一次cron作业,迭代每个分布,并减少zscore中的每个计数和归一化常数。然而,这似乎有点错误(我肯定我妈妈告诉我永远不要重复键*),因此我想知道是否有其他人更全面地解决了这个问题?

我猜你觉得错误的是以下几种组合:

  • 每当cron作业运行时,需要访问每个发行版、每个ZSET的每个成员以及归一化常数
  • 随着时间的推移,无条件递减操作将使分布偏向于每个cron周期发生多次的事件
  • 我以前没有做过类似的事情,但是如果您能够腾出更多的存储空间,我会想到一个解决方案

    其思想是以固定的间隔存储带有时间戳的快照队列。每个快照表示该时间间隔内发行版中的事件计数。当您想使分发中的旧概率过期时,可以从列表中弹出过期的快照,并相应地减少zset

    更具体地说,您需要:

  • 在内存中记录间隔[tk-tk-1]期间发生的事件以及每次发生的次数——一组(事件、计数)对。这是除了(可能)实时更新ZSET分数和当前所做的归一化因子之外的
  • 在每个标记处,存储快照:
  • 创建一个唯一的密钥Sk来表示tk上的快照——类似于UUID或类似的
  • 对于快照中的每个事件E,创建一个唯一的哈希键q(E)。选择一个密钥编码,该编码将允许您恢复该事件的分发(ZSET)密钥和事件(成员)密钥
  • 使用事件键q(E)和事件计数调用
    HSET
    Sk以存储事件数据。对快照中的所有事件重复此操作
  • RPUSH快照:
    Sk
  • 在每次到期时,将旧快照到期:
  • LPOP
    快照列表,解码时间戳并验证是否过期
  • 如果未过期,
    LPUSH
    将其重新推回到快照列表中,直到下一个过期为止。否则
  • 解码快照密钥Sk
  • 使用
    HKEYS
    Sk的结果,对每个事件键q(E)进行解码,获得相应的计数,然后将相应的ZSET和归一化因子减去该值
  • 在快照列表中仍然存在过期快照时重复此操作
  • 所需的额外存储量将取决于快照的长度、到期时间间隔以及每个快照时间间隔内发生的不同事件数


    在最坏的情况下,每个分发和事件都将在每个快照中表示,因此这对错误因素#1没有帮助。乐观地说,任何快照中都会表示适当小比例的分发和/或事件,过期过程的效率将提高。但这将解决错误因素#2即使在最坏的情况下,因为最近发生的事件不会在每次过期cron作业运行时在您的发行版中无条件地减少。

    我猜您感觉不对劲的是:

  • 每当cron作业运行时,需要访问每个发行版、每个ZSET的每个成员以及归一化常数
  • 随着时间的推移,无条件递减操作将使分布偏向于每个cron周期发生多次的事件
  • 我以前没有做过类似的事情,但是如果您能够腾出更多的存储空间,我会想到一个解决方案

    其思想是以固定的时间间隔存储一个带时间戳的快照队列。每个快照表示该时间间隔内发行版中的事件计数。当您想使发行版中的旧概率过期时,可以将过期的快照从列表中弹出,并相应地减少zset

    更具体地说,您需要:

  • 在内存中记录间隔[tk-tk-1]期间发生的事件以及每次发生的次数——一组(事件、计数)对。这是除了(可能)实时更新ZSET分数和当前所做的归一化因子之外的
  • 在每个标记处,存储快照:
  • 创建一个唯一的密钥Sk来表示tk上的快照——类似于UUID或类似的
  • 对于快照中的每个事件E,创建一个唯一的哈希键q(E)。选择一个密钥编码,该编码将允许您恢复该事件的分发(ZSET)密钥和事件(成员)密钥
  • 使用事件键q(E)和事件计数调用
    HSET
    Sk以存储事件数据。对快照中的所有事件重复此操作
  • RPUSH快照:
    Sk
  • 在每次到期时,将旧快照到期:
  • LPOP