gpt4 book ai didi

Redis 字符串作为特殊数组

转载 作者:IT王子 更新时间:2023-10-29 06:06:38 24 4
gpt4 key购买 nike

我正在创建一个事件系统,客户端(网络浏览器)将通过 AJAX 检索这些事件。对于事件存储,我只想使用 Redis。

我了解了 Redis 中的一些不错的功能,例如 EXPIRE - 一个允许自动执行某种垃圾收集工作的命令,这样就无需自己实现等效的功能(提供该解决方案将与 Redis 一样高效)。确实,非常好,我打算使用它。

但是后来,我偶然发现了一个问题,如何存储与 Redis 的 Strings 数据类型相关的 unix 时间戳编号。此号码应用于:

  • 对整个“数据集”进行排序 - 所有事件
  • 最重要的是,仅获取超过给定数字(即 > given_time)的事件记录(字符串)

简而言之,我希望拥有与字符串相关的类似 SCORE 的功能,但不一定要以与 Redis 中的Sorted Sets 一起使用的方式。而且我不喜欢这里提出的解决方案实际上使用了某种集合:Redis: possible to expire an element in an array or sorted set?

相反,我只需要创建一个不太常见的事件队列来发送给客户端。这个队列应该:

  • 将要处理的事件(通过 AJAX)存储到“队列”中——为此我想使用简单的 Redis 字符串
  • 那些相关时间戳高于上次请求之一的事件
  • 在“发布”1 小时后使事件过期(删除)(因为否则不必要的数据量将增加到无穷大,当然)

所以我目前的解决方案是:

  • 对 Redis 字符串使用“命名空间”键:EVENT:{unix-time-stamp}:eventName,并将值作为事件的内容
  • 通过键模式获取所有字符串(事件):EVENT:*
  • 通过 一些 Redis 命令(我不知道)获取最新的字符串(事件):EVENT:* WHERE "*"> given_unixtime_number

但是如何创建:

"WHERE "*" > given_unixtime_number"

参与 Redis?

编辑:当然,我不打算坚持上面提出的解决方案。例如,如果需要,我可能会使用非命名空间字符串创建一个单独的 Redis 实例(例如,仅 {unix-time-stamp} 作为键,没有 EVENT 和 eventName 部分)。

最佳答案

您确实想使用Sorted Sets,方法如下:

use "namespaced" keys for Redis Strings: EVENT:{unix-time-stamp}:eventName, and value as event's content

我不确定 eventName 的用途是什么,但这看起来不错。您还可以跳过 EVENT 前缀并为每个键节省 5 个字节。如果您有大量事件,请考虑使用哈希“桶”,如 http://redis.io/topics/memory-optimization#using-hashes-to-abstract-a-very-memory-efficient-plain-key-value-store-on-top-of-redis 中所述。 .

get all Strings (events) by key-pattern: EVENT:*

这实际上是一个关键点 - 您如何有效地做到这一点?答案:不要使用 KEYSSCAN,而是保留所有这些键的“索引”。常规(即未排序的)Set 足以满足这些需求,但由于您想要基于纪元的排序,Sorted Set 是正确的选择。

我们称这个有序集事件。每当您创建新事件时,例如SET EVENT:123:foo bar,将该事件的键名添加到 events 中,使用纪元作为分数:ZADD events 123 EVENT:123:foo.

get latest Strings (events) by some Redis command (which I don't know): EVENT:* WHERE "*" > given_unixtime_number

命令是ZRANGEBYSCORE (或 ZREVRANGEBYSCORE 取决于您希望结果如何排序)像这样:ZRANGEBYSCORE events (given_unixtime_number +inf。这将返回所有相关的键名,然后您需要 GET 它们(一个可能的优化是将其包装在 Lua 脚本中以保存来回)。注意使用左括号 (() 来指示独占搜索(即>> 而不是 >=)

管理:此方法的“成本”是您必须维护事件“索引”。通过使用 ZREMBYSCORE events 上的命令,您可以轻松删除过期元素 - 定期调用它(例如每 1 秒一次)或根据您的需要执行的每个操作。实际事件的键可以是EXPIREd(尽管您的events Sorted Set 中的键可能会在一段时间内结束)或通过向处理事件的过期逻辑添加循环来“手动”设置DEL

关于Redis 字符串作为特殊数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32009888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com