Redis存储键但不包含值

48
使用 Redis 的 expire 命令,例如 SETEXTTL,有些情况下根本不需要键值对中的数据,因为其 time to live 已经起到了作用。
然而,Redis 要求每个键都必须具有一个值。
如果您永远不想读取它,那么最合理的值是什么?
4个回答

62

谁说你必须在 Redis 键中实际存储任何内容呢?

空字符串 "" 是 Redis 键的一个完全有效的值,它也是最短的可能值:

> SET foo ""
OK
> GET foo
""
> BITCOUNT foo
(integer) 0

当使用StackExchange Redis客户端时,可以通过查看RedisValue.IsNull为false但IsNullOrEmpty为true(多么奇怪的API!)来检测到这一点。 - Svend
这应该更清楚,它是键“foo”的值,而不是将键设置为“”。 - botbot
4
当使用MEMORY USAGE [key]进行检查时,值为0的占用空间比空字符串小。请参见下面的答案。 - Daniel

20

我会避免使用""。如何使用简单的0呢?

127.0.0.1:6379> set akey 0
OK
127.0.0.1:6379> memory usage akey
(integer) 48
127.0.0.1:6379> set akey ""
OK
127.0.0.1:6379> memory usage akey
(integer) 50
127.0.0.1:6379>

我认为这可能是更好的答案,就实际内存消耗而言。 - Nathan Lutterman
2
一个值为 0 有更大的可能性成为 有用 的值,而 "" 已经本质上表示为空或什么也没有。当处理整数值是可能的(或将来可能出现)时,使用 "" 更好。 - AlexPi

9
我会存储一个字节的数据,可以被广泛解释为“真实”,例如ASCII字符1

0
你是否自己序列化从redis来的所有数据?如果是,你可以考虑使用一个哨兵值(比如一个NONE常量等),将其设置为类似于“None”的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接