- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
比如说,我在 Redis 数据库中有 4 个键。 key 从现在起 10 秒后过期。我已经将 key 添加到一个集合中。当 key 过期时,它们实际上不再存在于数据库中(get 返回空值)。但是,键仍然是集合的成员。该集合将继续存在,直到从集合中删除键为止,此时它太有效地从数据库中消失了。
是否可以在 key 过期时自动从其所属的集合中删除 key ?
我正在考虑为每个键维护一个集合以维护它所属的集合(在键和集合之间建立有向图集合关系),然后注册键过期事件以在必要时删除集合成员。作为数据库的使用者,而不是作为内部的某种后台清理线程,这是很多开销。而且,这种方法将是清理集的“最大努力”,因为订阅过期事件的消费者代码可能会崩溃、无法收到通知、积压等。
我可能已经能够通过将键集建模为哈希集中的字段来避免任何欺骗,但我希望在实践中为每个键设置不同的到期 TTL。如果这是可能的,那又如何呢?
例如,这是我的一组“foo”键。
mine:0>set foo1 barA
OK
mine:0>set foo2 barB
OK
mine:0>set foo3 barC
OK
mine:0>set foo4 barD
OK
它们可以添加到一个集合中。
mine:0>sadd foo foo1 foo2 foo3 foo4
4
mine:0>smembers foo
1) foo1
2) foo3
3) foo4
4) foo2
然后 key 可能会过期...
mine:0>expire foo1 10
1
mine:0>expire foo2 10
1
mine:0>expire foo3 10
1
mine:0>expire foo4 10
1
mine:0>get foo1
NULL
mine:0>get foo2
NULL
mine:0>get foo3
NULL
mine:0>get foo4
NULL
mine:0>get foo5
NULL
此时键不存在,但集合存在,并且它引用了键。
mine:0>smembers foo
1) foo1
2) foo3
3) foo4
4) foo2
显式删除键将从集合中删除它们,然后在所有删除后使集合不存在。
mine:0>srem foo foo1
1
mine:0>srem foo foo2
1
mine:0>srem foo foo3
1
mine:0>srem foo foo4
1
mine:0>smembers foo
[nothing returned]
最佳答案
很简单!
首先要说明的是redis中的数据是没有任何引用关系的! foo1作为键和foo1作为集合中的元素是两个完全不同的东西,不同的数据在不同的内存地址,恰好存储相同的字符串“foo1”。
其次,我的方法不需要更改您的数据模型,只需更改您查询集合的方式即可。当你查询集合中的元素时,检查该键是否也作为单独的键存在于redis中,逻辑如下:
ArrayList getUnexpiredElementsInSet(String setKey){
ArrayList elements = smembers(setKey);
ArrayList resultArray = new ArrayList();
for (element in elements) {
if (exists(element)==false) {
srem(setKey, element);
}else {
resultArray.add(element);
}
return resultArray;
}
这样查询集合中的东西时,只会得到未过期的元素,过期的元素也会被清理。
以上只是向您展示基本逻辑的伪java代码,您需要将此逻辑包装在一个lua事务中。如果你不知道redis的lua特性,就学吧!它很棒,使 redis super 快速和强大。想要发挥redis真正的威力,lua是少不了的!引用Redis Lua
有些人担心脚本命令的性能损失。我可以向你保证那是不必要的。根据官方文档和我在实践中的经验,运行脚本完全没有性能损失。 这在理论上可以从很多方面理解:
关于redis - 如何从 Redis 中的集合中自动删除过期的 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32830347/
我有一个关于 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
我是一名优秀的程序员,十分优秀!