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