作为特殊数组的Redis字符串

作为特殊数组的Redis字符串,redis,Redis,我正在创建一个由客户端(WebBrowser)通过AJAX检索的事件系统。对于事件存储,我只想使用Redis 我了解了Redis中的一些不错的功能,例如EXPIRE——一个允许自动执行某种垃圾收集工作的命令,这样就不需要自己实现类似的功能(前提是解决方案与Redis一样高效)。的确,非常好,我要用它 但后来,我偶然发现了一个问题:如何存储与Redis'字符串相关的数据类型unix时间戳编号。此编号应用于: 对整个“集合”数据进行排序-所有事件 最重要的是,仅获取高于给定数量(即>给定时间)的事

我正在创建一个由客户端(WebBrowser)通过AJAX检索的事件系统。对于事件存储,我只想使用Redis

我了解了Redis中的一些不错的功能,例如EXPIRE——一个允许自动执行某种垃圾收集工作的命令,这样就不需要自己实现类似的功能(前提是解决方案与Redis一样高效)。的确,非常好,我要用它

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

  • 对整个“集合”数据进行排序-所有事件
  • 最重要的是,仅获取高于给定数量(即>给定时间)的事件记录(字符串)
所以简而言之,我想要一个类似于分数的功能,它与字符串相关,但不一定与Redis中的排序集一起使用。我不喜欢这里提出的解决方案实际上使用的是一种集合:

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

  • 将要获取的事件(通过AJAX)存储到“队列”中——为此,我想使用简单的Redis字符串
  • 仅服务于相关时间戳高于最后一个请求之一的事件
  • 在事件“发布”1小时后过期(删除)事件(当然,否则不必要的数据量将无限增加)
因此,我目前的解决方案是:

  • 对Redis字符串使用“namespaced”键:EVENT:{unix time stamp}:eventName,并将值作为事件的内容
  • 按键模式获取所有字符串(事件):事件:*
  • 通过一些Redis命令(我不知道)获取最新的字符串(事件):事件:*其中“*”>给定的\u unixtime\u编号
但是如何创建:

"WHERE "*" > given_unixtime_number"
参与Redis?

编辑:
当然,我不打算坚持上述解决方案。例如,如果需要,我可以创建一个单独的Redis实例,其中包含非命名空间字符串(例如,{unix time stamp}作为键,不包含事件和事件名部分)。

您确实希望使用排序集,方法如下:

对Redis字符串使用“namespaced”键:EVENT:{unix time stamp}:eventName,并将值作为事件的内容

我不确定什么是
eventName
,但这看起来已经足够好了。您还可以跳过
事件
前缀,并为每个键保存5个字节。如果您有大量事件,请考虑使用.H/P >中描述的散列“桶”。 按键模式获取所有字符串(事件):事件:*

这实际上是一个关键点——如何有效地做到这一点?答案是:不要使用
扫描
,而是保留所有这些键的“索引”。常规(即未排序的)对于这些已经足够了,但是由于您需要基于历元的排序,排序集是正确的选择

让我们称之为排序集
事件
。每当您创建新事件时,例如,
设置事件:123:foo条
,使用历元作为分数将该事件的键名添加到
事件
:ZADD events 123 event:123:foo

通过一些Redis命令(我不知道)获取最新的字符串(事件):事件:*其中“*”>给定的\u unixtime\u编号

该命令(或取决于您希望结果的排序方式)如下:
ZRANGEBYSCORE事件(给定\u unixtime\u number+inf
。这将返回所有相关的键名,然后您需要
获取它们(一种可能的优化方法是将其包装在Lua脚本中以保存来回)。请注意,左括号(
)用于表示独占搜索(即
,而不是
=


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

谢谢!听起来很合理,我会尽快实现它。但是,与此同时,我还了解了Redis发布/订阅解决方案。你认为这个Redis发布/订阅功能可以应用于我的情况吗?不适用于你当前的设计-AJAX主要是轮询,对吗?发布/订阅类似于广播,通常不发送给web客户端