- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在创建一个事件系统,客户端(网络浏览器)将通过 AJAX 检索这些事件。对于事件存储,我只想使用 Redis。
我了解了 Redis 中的一些不错的功能,例如 EXPIRE - 一个允许自动执行某种垃圾收集工作的命令,这样就无需自己实现等效的功能(提供该解决方案将与 Redis 一样高效)。确实,非常好,我打算使用它。
但是后来,我偶然发现了一个问题,如何存储与 Redis 的 Strings 数据类型相关的 unix 时间戳编号。此号码应用于:
简而言之,我希望拥有与字符串相关的类似 SCORE 的功能,但不一定要以与 Redis 中的Sorted Sets 一起使用的方式。而且我不喜欢这里提出的解决方案实际上使用了某种集合:Redis: possible to expire an element in an array or sorted set?
相反,我只需要创建一个不太常见的事件队列来发送给客户端。这个队列应该:
所以我目前的解决方案是:
但是如何创建:
"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:*
这实际上是一个关键点 - 您如何有效地做到这一点?答案:不要使用 KEYS
或 SCAN
,而是保留所有这些键的“索引”。常规(即未排序的)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 秒一次)或根据您的需要执行的每个操作。实际事件的键可以是EXPIRE
d(尽管您的events
Sorted Set 中的键可能会在一段时间内结束)或通过向处理事件
的过期逻辑添加循环来“手动”设置DEL
。
关于Redis 字符串作为特殊数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32009888/
我有一个关于 Redis Pubsub 的练习,如下所示: 如果发布者发布消息但订阅者没有收到服务器崩溃。订阅者如何在重启服务器时收到该消息? 请帮帮我,谢谢! 最佳答案 在这种情况下,消息将永远消失
我们正在使用 Service Stack 的 RedisClient 的 BlockingDequeue 来保存一些数据,直到它可以被处理。调用代码看起来像 using (var client =
我有一个 Redis 服务器和多个 Redis 客户端。每个 Redis 客户端都是一个 WebSocket+HTTP 服务器,其中包括管理 WebSocket 连接。这些 WebSocket+HTT
我有多个 Redis 实例。我使用不同的端口创建了一个集群。现在我想将数据从预先存在的 redis 实例传输到集群。我知道如何将数据从一个实例传输到集群,但是当实例多于一个时,我无法做到这一点。 最佳
配置:三个redis集群分区,跨三组一主一从。当 Master 宕机时,Lettuce 会立即检测到中断并开始重试。但是,Lettuce 没有检测到关联的 slave 已经将自己提升为 master
我想根据从指定集合中检索这些键来删除 Redis 键(及其数据集),例如: HMSET id:1 password 123 category milk HMSET id:2 password 456
我正在编写一个机器人(其中包含要禁用的命令列表),用于监视 Redis。它通过执行禁用命令,例如 (rename-command ZADD "")当我重新启动我的机器人时,如果要禁用的命令列表发生变化
我的任务是为大量听众使用发布/订阅。这是来自 docs 的订阅的简化示例: r = redis.StrictRedis(...) p = r.pubsub() p.subscribe('my-firs
我一直在阅读有关使用 Redis 哨兵进行故障转移的内容。我打算有1个master+1个slave,如果master宕机超过1分钟,就把slave变成master。我知道这在 Sentinel 中是
与仅使用常规 Redis 和创建分片相比,使用 Redis 集群有哪些优势? 在我看来,Redis Cluster 更注重数据安全(让主从架构解决故障)。 最佳答案 我认为当您需要在不丢失任何数据的情
由于 Redis 以被动和主动方式使 key 过期, 有没有办法得到一个 key ,即使它的过期时间已过 (但 在 Redis 中仍然存在 )? 最佳答案 DEBUG OBJECT myKey 将返回
我想用redis lua来实现monitor命令,而不是redis-cli monitor。但我不知道怎么办。 redis.call('monitor') 不起作用。 最佳答案 您不能从 Redis
我读过 https://github.com/redisson/redisson 我发现有几个 Redis 复制设置(包括对 AWS ElastiCache 和 Azure Redis 缓存的支持)
Microsoft.AspNet.SignalR.Redis 和 StackExchange.Redis.Extensions.Core 在同一个项目中使用。前者需要StackExchange.Red
1. 认识 Redis Redis(Remote Dictionary Server)远程词典服务器,是一个基于内存的键值对型 NoSQL 数据库。 特征: 键值(key-value)型,value
1. Redis 数据结构介绍 Redis 是一个 key-value 的数据库,key 一般是 String 类型,但 value 类型多种多样,下面就举了几个例子: value 类型 示例 Str
1. 什么是缓存 缓存(Cache) 就是数据交换的缓冲区,是存贮数据的临时地方,一般读写性能较高。 缓存的作用: 降低后端负载 提高读写效率,降低响应时间 缓存的成本: 数据一致性成本 代码维护成本
我有一份记录 list 。对于我的每条记录,我都需要进行一些繁重的计算,因为我要在Redis中创建反向索引。为了达到到达记录,需要在管道中执行多个redis命令(sadd为100 s + set为1
我有一个三节点Redis和3节点哨兵,一切正常,所有主服务器和从属服务器都经过验证,并且哨兵配置文件已与所有Redis和哨兵节点一起更新,但是问题是当Redis主服务器关闭并且哨兵希望选举失败者时再次
我正在尝试计算Redis中存储的消息之间的响应时间。但是我不知道该怎么做。 首先,我必须像这样存储chat_messages的时间流 ZADD conversation:CONVERSATION_ID
我是一名优秀的程序员,十分优秀!